android tuto - Comment faire en sorte que le service Android communique avec l'activité




5 Answers

Il y a trois façons évidentes de communiquer avec les services:

  1. Utiliser des intentions
  2. Utiliser AIDL
  3. Utilisation de l'objet de service lui-même (en tant que singleton)

Dans votre cas, je voudrais aller avec l'option 3. Faire une référence statique au service lui-même et le peupler dans onCreate ():

void onCreate(Intent i) {
  sInstance = this;
}

Créer une fonction statique MyService getInstance() , qui retourne l'static sInstance .

Ensuite, dans Activity.onCreate() vous démarrez le service, attendez de manière asynchrone jusqu'à ce que le service soit réellement démarré (vous pouvez demander à votre service d'informer votre application qu'il est prêt en envoyant une intention à l'activité) et obtenir son instance. Lorsque vous avez l'instance, enregistrez votre objet écouteur de service sur votre service et vous êtes défini. NOTE: lors de la modification des vues dans l'activité, vous devez les modifier dans le thread de l'interface utilisateur, le service exécutera probablement son propre thread, vous devez donc appeler Activity.runOnUiThread() .

La dernière chose que vous devez faire est de supprimer la référence à votre objet écouteur dans Activity.onPause() , sinon une instance de votre contexte d'activité fuira, pas bon.

REMARQUE: cette méthode n'est utile que lorsque votre application / activité / tâche est le seul processus qui accède à votre service. Si ce n'est pas le cas, vous devez utiliser l'option 1. ou 2.

intentservice foreground

J'écris ma première application Android et j'essaie de comprendre les services et les activités. J'ai un service qui fonctionnera en tâche de fond et effectuera une journalisation basée sur le temps et le GPS. J'aurai une activité qui sera utilisée pour démarrer et arrêter le service.

Donc d'abord, je dois être capable de comprendre si le Service est en cours d'exécution lorsque l'activité est démarrée. Il y a d'autres questions à ce sujet, alors je pense que je peux comprendre cela (mais n'hésitez pas à donner des conseils).

Mon vrai problème: si l'activité est en cours et que le service est démarré, j'ai besoin d'un moyen pour le service d'envoyer des messages à l'activité. Strings simples et entiers à ce stade - messages d'état pour la plupart. Les messages ne se produiront pas régulièrement, donc je ne pense pas que l'interrogation du service est un bon moyen d'y aller s'il y a un autre moyen. Je ne souhaite cette communication que lorsque l'activité a été démarrée par l'utilisateur. Je ne souhaite pas démarrer l'activité à partir du service. En d'autres termes, si vous démarrez l'activité et que le service est en cours d'exécution, vous verrez des messages d'état dans l'interface utilisateur d'activité lorsque quelque chose d'intéressant se produit. Si vous ne démarrez pas l'activité, vous ne verrez pas ces messages (ils ne sont pas si intéressants).

Il semble que je devrais être en mesure de déterminer si le service est en cours d'exécution et, si c'est le cas, ajouter l'activité en tant qu'écouteur. Ensuite, supprimez l'activité en tant qu'écouteur lorsque l'activité s'interrompt ou s'arrête. Est-ce réellement possible? La seule façon que je peux comprendre pour le faire est de mettre en œuvre l'activité Parcelable et de construire un fichier AIDL afin que je puisse le passer à travers l'interface à distance du Service. Cela semble toutefois exagéré, et je n'ai aucune idée de la façon dont l'activité devrait implémenter writeToParcel () / readFromParcel ().

Y a-t-il un moyen plus facile ou meilleur? Merci pour toute aide.

MODIFIER:

Pour ceux qui sont intéressés par cela plus tard, il existe un exemple de code de Google pour gérer cela via AIDL dans le répertoire des exemples: /apis/app/RemoteService.java







Je suis surpris que personne n'a fait référence à l'événement Otto Bus bibliothèque

http://square.github.io/otto/

J'ai utilisé ceci dans mes applications android et cela fonctionne parfaitement.




Une autre façon pourrait être d'utiliser des observateurs avec une fausse classe de modèle à travers l'activité et le service lui-même, en implémentant une variation de modèle MVC. Je ne sais pas si c'est la meilleure façon d'y arriver, mais c'est la façon dont cela a fonctionné pour moi. Si vous avez besoin d'un exemple demandez-le et je posterai quelque chose.







Related