我正在开发一个Android应用程序,从Android Wear收集数据。手持设备中使用WearableListenerService
通过数据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>
似乎在应用程序崩溃/停止后不会清除侦听器。有什么解决方法可以解决这个问题吗?
似乎在应用程序崩溃/停止后不会清除侦听器。
为什么呢?您已通过清单注册该操作,并且未从任何位置取消注册。
您可以使用 PackageManager 禁用组件onDataChanged()
。 setComponentEnabledSetting(( API。
为包组件(活动、接收方、服务、提供程序(设置启用设置。此设置将覆盖组件在其清单中可能已设置的任何启用状态。