WearableListenerService 不要在 Wear 上调用 onDataChanged
WearableListenerService don't call onDataChanged on Wear
我已经尝试了很多方法来解决这个问题,但没有任何效果。
making-wearablelistenerservice-ondatachanged-call-on-every-putdatamaprequest
wearablelistenerservices-ondatachanged-not-called-on-phone
AndroidManifest.xml
<service android:name="my.package.ListenerService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
<action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
<data
android:host="*"
android:pathPrefix="/prefix"
android:scheme="wear" />
</intent-filter>
</service>
MainActivity
IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
MobillsWearActivity.MessageReceiver messageReceiver = new MobillsWearActivity.MessageReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, messageFilter);
Service
public class ListenerService extends WearableListenerService {
private final String TAG_WEAR = "[on-wear]";
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
// Check the data type
if (event.getType() == DataEvent.TYPE_CHANGED) {
DataMapItem dataItem = DataMapItem.fromDataItem (event.getDataItem());
String jsonString = dataItem.getDataMap().getString("listDespesas");
// Broadcast message to wearable activity for display
Intent messageIntent = new Intent();
messageIntent.setAction(Intent.ACTION_SEND);
messageIntent.putExtra("listDespesas", jsonString);
LocalBroadcastManager.getInstance(this).sendBroadcast(messageIntent);
Log.i(TAG_WEAR, "Recebido no wearable: "+jsonString);
}
}
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
Toast.makeText(this, "Received message", Toast.LENGTH_LONG).show();
}
}
Tom 在这个 link 中的回答对我有用
There are two things you can check:
- wear 应用程序的 packageName 应与设备应用程序的 packageName 相同。
- onDataChanged() 只有在数据真正发生变化时才会被调用。如果多次将相同的数据放入 DataApi,则该方法只会被调用一次,直到写入不同的数据。您可以向数据添加时间戳,以确保为每个写入操作调用一次该方法。但是,就电池使用而言,使用 DataApi 可能比发送消息更昂贵。因此,如果您只想在将数据放入 DataApi 后触发一个操作,只需在完成后发送一条消息即可。
我已经尝试了很多方法来解决这个问题,但没有任何效果。
making-wearablelistenerservice-ondatachanged-call-on-every-putdatamaprequest
wearablelistenerservices-ondatachanged-not-called-on-phone
AndroidManifest.xml
<service android:name="my.package.ListenerService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
<action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
<data
android:host="*"
android:pathPrefix="/prefix"
android:scheme="wear" />
</intent-filter>
</service>
MainActivity
IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
MobillsWearActivity.MessageReceiver messageReceiver = new MobillsWearActivity.MessageReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, messageFilter);
Service
public class ListenerService extends WearableListenerService {
private final String TAG_WEAR = "[on-wear]";
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
// Check the data type
if (event.getType() == DataEvent.TYPE_CHANGED) {
DataMapItem dataItem = DataMapItem.fromDataItem (event.getDataItem());
String jsonString = dataItem.getDataMap().getString("listDespesas");
// Broadcast message to wearable activity for display
Intent messageIntent = new Intent();
messageIntent.setAction(Intent.ACTION_SEND);
messageIntent.putExtra("listDespesas", jsonString);
LocalBroadcastManager.getInstance(this).sendBroadcast(messageIntent);
Log.i(TAG_WEAR, "Recebido no wearable: "+jsonString);
}
}
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
Toast.makeText(this, "Received message", Toast.LENGTH_LONG).show();
}
}
Tom 在这个 link 中的回答对我有用
There are two things you can check:
- wear 应用程序的 packageName 应与设备应用程序的 packageName 相同。
- onDataChanged() 只有在数据真正发生变化时才会被调用。如果多次将相同的数据放入 DataApi,则该方法只会被调用一次,直到写入不同的数据。您可以向数据添加时间戳,以确保为每个写入操作调用一次该方法。但是,就电池使用而言,使用 DataApi 可能比发送消息更昂贵。因此,如果您只想在将数据放入 DataApi 后触发一个操作,只需在完成后发送一条消息即可。