如何在 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.
我正在开发一个 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.