如何在崩溃/强行停止后正确注册DATA_CHANGED Data API事件? [英] How to correctly register DATA_CHANGED Data API event after crash/forcibly stop?

查看:210
本文介绍了如何在崩溃/强行停止后正确注册DATA_CHANGED Data API事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



但我注意到如果手持设备中的应用程序在开发过程中被设置 - >应用程序或 adb 强制停止,而可穿戴应用程序仍在运行,它将无法运行如果可穿戴设备没有运行应用程序,则不会发生这种情况。



要重新开始捕获掌上电脑中的数据,我必须停止 Google Play服务并重新启动我的应用。



My 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;
//私有GoogleApiClient googleApiClient;
私人LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
$ b $ @Override
public void onDataChanged(DataEventBuffer dataEvents){
Log.i(this.getClass()。toString(),在 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(数据));

showSensorResult(message);




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




$ p $ AndroidManifest.xml code>在手持设备中:

 < service 
android:name =。WearableSensorListener
android:enabled =true
android:exported =true>
< intent-filter>
< data android:host =*
android:scheme =wear
android:pathPrefix =/ wearable-sensor/>
< / intent-filter>
< / service>

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

解决方案


看起来监听器不会被清除应用程序崩溃/停止。


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



您可以从 onDataChanged() with PackageManager。 setComponentEnabledSetting() API。


设置包组件(activity,receiver,service,provider)的启用设置。此设置将覆盖组件在其清单中可能已设置的任何启用状态。



I'm developing an Android app to collect data from an Android Wear. A WearableListenerService is used in the handheld device to receive data from the watch via Data API.

But I noticed that if the app in handheld device is forcibly stopped, either from Settings -> Apps or by adb during development, while the app in wearable is still running, it won't be able to receive data again even it's manually restarted.

This won't happen if the wearable is not running the app.

To restart capturing the data in handheld, I have to stop Google Play Services and re-launch my app.

My 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 in handheld:

<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>

It seems the listener won't be cleared after the app crash/stop. Is there any workaround to handle this?

解决方案

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

Why should it? You've registered to that action through manifest and haven't unregistered from anywhere.

You can disable the component from onDataChanged() with PackageManager. setComponentEnabledSetting() API.

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.

这篇关于如何在崩溃/强行停止后正确注册DATA_CHANGED Data API事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆