如何在崩溃/强行停止后正确注册DATA_CHANGED Data API事件?

时间:2017-03-21 16:25:20

标签: android google-play-services wear-os google-api-client android-wear-data-api

我正在开发一款Android应用来从Android Wear收集数据。手持设备中使用WearableListenerService通过Data API从手表接收数据。

但是我注意到,如果手持设备中的应用程序被强行停止,可以通过“设置” - >应用程序或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>

在应用程序崩溃/停止后,似乎不会清除侦听器。有没有解决方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

在应用程序崩溃/停止后,似乎不会清除监听器。

为什么要这样?您已通过清单注册该操作,并且未在任何地方注销。

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

  

设置包组件(活动,接收者,服务,提供者)的启用设置。此设置将覆盖可能已由其清单中的组件设置的任何已启用状态。