0

Je développe une application Android pour collecter des données à partir d'un Android Wear. Un WearableListenerService est utilisé dans l'appareil portatif pour recevoir des données de la montre via l'API de données.Comment enregistrer correctement l'événement DATA_CHANGED Data API après un crash/arrêt forcé?

Mais j'ai remarqué que si l'application dans l'appareil de poche est arrêtée de force, soit depuis Paramètres -> Apps ou par adb pendant le développement, alors que l'application dans wearable est toujours en cours d'exécution, elle ne pourra plus recevoir de données il est redémarré manuellement.

Cela ne se produira pas si le portable ne lance pas l'application.

Pour redémarrer la capture des données dans l'ordinateur de poche, je dois arrêter Google Play Services et relancer mon application.

Mon 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 en poche:

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

Il semble que l'auditeur ne sera pas effacé après le crash application/arrêt. Y a-t-il une solution de contournement pour gérer cela?

Répondre

1

Il semble que l'écouteur ne sera pas effacé après le blocage/arrêt de l'application.

Pourquoi le faire? Vous vous êtes inscrit à cette action par le biais d'un manifeste et vous n'êtes pas désinscrit de n'importe où. Vous pouvez désactiver le composant de onDataChanged() avec API.

Définissez le paramètre activé pour un composant de package (activité, récepteur, service, fournisseur). Ce paramètre remplacera tout état activé qui peut avoir été défini par le composant dans son manifeste.

+0

Terrific! J'ai placé les codes dans 'Application.onCreate()' et cela a fonctionné comme un charme! Merci beaucoup. –