如何在 crash/forcibly 停止后正确注册 DATA_CHANGED 数据 API 事件?

How to correctly register DATA_CHANGED Data API event after crash/forcibly stop?

我正在开发一个 Android 应用程序来从 Android Wear 收集数据。一个WearableListenerService用于手持设备通过DataAPI.

从手表接收数据

但我注意到,如果手持设备中的应用程序被强行停止,无论是从设置 -> 应用程序还是在开发过程中 adb,而可穿戴设备中的应用程序仍然是 运行,它赢了手动重启也收不到数据

如果可穿戴设备不是 运行 应用程序,则不会发生这种情况。

要重新开始捕获手持设备中的数据,我必须停止 Google Play Services 并重新启动我的应用程序。

我的WearableListenerService:

public class WearableSensorListener extends WearableListenerService {
    public static final String SENSOR_RESULT = "minimal_intent_service.result";
    public static final String SENSOR_MESSAGE = "minimal_intent_service.message";
    private static final String DATA_API_PATH = "/wearable-sensor";
    //    private GoogleApiClient googleApiClient;
    private LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        Log.i(this.getClass().toString(), "Got data at " + System.currentTimeMillis());
        for (DataEvent dataEvent : dataEvents) {
            Log.i(this.getClass().toString(), "Got event: " + dataEvent.toString());
            if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
                String path = dataEvent.getDataItem().getUri().getPath();
                if (path.equals(DATA_API_PATH)) {
                    DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
                    int type = dataMap.getInt("TYPE");
                    long time = dataMap.getLong("TIME");
                    float[] data = dataMap.getFloatArray("DATA");
                    String message = String.format(Locale.UK, "TYPE: %d, TIME: %d, DATA: %s",
                            type,
                            time,
                            Arrays.toString(data));

                    showSensorResult(message);
                }
            }
        }
    }

    private void showSensorResult(String message) {
        Intent intent = new Intent(SENSOR_RESULT);
        if (message != null)
            intent.putExtra(SENSOR_MESSAGE, message);
        localBroadcastManager.sendBroadcast(intent);
    }
}

AndroidManifest.xml 手持设备:

<service
        android:name=".WearableSensorListener"
        android:enabled="true"
        android:exported="true">
    <intent-filter>
        <action android:name="com.google.android.gms.wearable.DATA_CHANGED"/>
        <data android:host="*"
              android:scheme="wear"
              android:pathPrefix="/wearable-sensor"/>
    </intent-filter>
</service>

似乎应用后不会清除监听器crash/stop。有什么解决方法可以解决这个问题吗?

It seems the listener won't be cleared after the app crash/stop.

为什么要这样做?您已通过清单注册到该操作,并且没有从任何地方取消注册。

您可以使用 PackageManager. setComponentEnabledSetting() API 从 onDataChanged() 禁用组件。

Set the enabled setting for a package component (activity, receiver, service, provider). This setting will override any enabled state which may have been set by the component in its manifest.