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 后触发一个操作,只需在完成后发送一条消息即可。