2011-12-29 3 views
1

J'ai une activité et un service liés à elle.Android: Comment le service lié peut être remarqué sur le client tué?

Si le service est tué par le système, l'activité est notée à cause de ServiceConnection.onServiceDisconnected(ComponentName) sera appelée.

Mais lorsque le processus d'activité est détruit par le système, y a-t-il un rappel au service? Comment le Service peut-il savoir que le client a été tué? (Lorsque le processus est tué, il n'y a pas appel de méthode onDestroy(), malheureusement)

La seule façon que je vois est maintenant comme suit:

J'ai la liste de rappel dans mon Service:

RemoteCallbackList<IModConnClient> mCallbacks 

Lorsque Je commence à diffuser en appelant mCallbacks.beginBroadcast(); il me renvoie un certain nombre de clients. Donc, je peux me souvenir du nombre de clients précédents et vérifier si elle a diminué. Mais il semble que ce ne soit pas vraiment une bonne solution. Je voudrais avoir un rappel, mais malheureusement je ne peux pas en trouver un.

Quelqu'un peut-il donner une suggestion?

+0

Pourquoi votre activité et votre service ne sont-ils pas dans le même processus? – CommonsWare

+0

@CommonsWare, c'est parce que j'ai besoin de créer un service qui communiquera avec d'autres applications en utilisant 'AIDL'. Le point de départ pour moi était ce guide de développement: http://goo.gl/pJBqX. J'ai 'android: process =": ​​remote "' dans AndroidManifest.xml pour ce service. –

Répondre

1

J'ai trouvé la solution.

Comme indiqué dans RemoteCallbackList documentation, "Si un processus de rappel enregistré disparaît, cette classe se chargera de le supprimer automatiquement de la liste.Si vous voulez faire un travail supplémentaire dans cette situation, vous pouvez créer une sous-classe qui implémente . la méthode onCallbackDied (E) "

, je créé une sous-classe pour RemoteCallbackList et l'interface IRemoteCallbackDied:

private interface IRemoteCallbackDied<E extends IInterface> { 
     public void remoteCallbackDied(E callback, Object cookie); 
    } 

    private final class RemoteCallbackListWithDiedCB<E extends IInterface> extends RemoteCallbackList<E> { 
     IRemoteCallbackDied<E> mRemoteCallbackDied; 

     public RemoteCallbackListWithDiedCB(IRemoteCallbackDied<E> mRemoteCallbackDied) 
     { 
     this.mRemoteCallbackDied = mRemoteCallbackDied; 
     } 

     @Override public void onCallbackDied(E callback, Object cookie){ 
     super.onCallbackDied(callback, cookie); 
     this.mRemoteCallbackDied.remoteCallbackDied(callback, cookie); 
     } 
    } 

puis, j'ai créé pour la mise en œuvre IRemoteCallabackDied:

private final IRemoteCallbackDied<IModConnClient> mRemoteCallbackDied = new IRemoteCallbackDied<IModConnClient>() { 
     public void remoteCallbackDied(IModConnClient mModConnClient, Object cookie) 
     { 
     Log.v("my_tag", "remote callback died!"); 
     /* 
      * Some code 
      */ 
     } 
    }; 

et, enfin, ma liste de rappel est définie comme ça:

private RemoteCallbackListWithDiedCB<IModConnClient> mClients = new RemoteCallbackListWithDiedCB<IModConnClient>(mRemoteCallbackDied); 
1

Il y a une solution simple aussi. C'est onTaskRemoved méthode de service. Il vous permettra de savoir quand une activité a été tuée. Sur le doc. il est dit ..........

public void onTaskRemoved (intention rootIntent)

Ajouté au niveau de l'API 14 Ceci est appelé si le service est en cours d'exécution et que l'utilisateur a supprimé une tâche provient de l'application du service. Si vous avez défini ServiceInfo.FLAG_STOP_WITH_TASK, vous ne recevrez pas ce rappel; Au lieu de cela, le service sera simplement arrêté.

Paramètres rootIntent Intention racine d'origine utilisée pour lancer la tâche en cours de suppression.

Si vous voulez savoir quand le processus entier est tué sans onDestroy, vous devez connaître DeathRecipient. Il y a un kind blog post.

J'espère que cette réponse vous aidera d'une autre manière :)

+0

Merci, mais la méthode 'onTaskRemoved' a été ajoutée au niveau de l'API 14 seulement, mais actuellement nous avons ciblé des appareils avec le niveau d'API 7. Merci pour l'information cependant. –

Questions connexes