web-dev-qa-db-fra.com

Notifier l'activité du service

J'essaie de démarrer une Service de ma Activity afin de rechercher les modifications sur une page Web, c'est une application privée pour que je ne dérange pas la vie de la batterie ...

Mais j'aimerais passer des données de ma Service à ma Activity... Je n'arrive pas à trouver le moyen d'appeler la Activity depuis ma Service. Comment puis-je atteindre cet objectif?

41
Mars

Comme Alex l'a indiqué, vous pouvez vous connecter au service et transmettre une sorte d'écouteur ou un rappel au service à utiliser pour les événements.

Ou bien, vous pouvez utiliser une diffusion Intent, en utilisant peut-être des méthodes telles que setPackage() sur la Intent pour limiter la portée de la diffusion.

Vous pouvez également utiliser createPendingResult() pour créer une PendingIntent que vous transmettez en tant que Intent extra au service. Le service peut ensuite utiliser cette PendingIntent pour déclencher onActivityResult() dans votre activité.

Ou, vous pouvez utiliser un ResultReceiver.

Ou, vous pouvez utiliser un Messenger.

(Certes, je n'ai pas essayé ces deux dernières approches, mais je pense qu'elles vont fonctionner ici)

47
CommonsWare

Une autre alternative: si votre service met à jour le fournisseur de contenu, l'activité peut être notifiée via ContentObserver . Cela serait suffisant si votre service télécharge certaines données du serveur et que vous souhaitez simplement afficher le nouveau contenu de l'activité.

3
Juozas Kontvainis

Quelques manières laides:

1.) Si l'activité n'a pas encore commencé, utilisez intent et startActivity, mais rappelez-vous intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2.) Sinon, si l'activité a déjà commencé, vous pouvez écrire votre propre méthode de rappel dans l'activité et enregistrer la méthode dans le service, puis appeler directement la méthode dans le service. 

J'espère trouver un moyen intelligent.

Je pense que la diffusion fonctionne aussi bien, vous pouvez écrire une classe interne statique pour recevoir la diffusion et commencer l'activité. Mais c'est aussi moche à mon avis.

1
vvsueprman

Le mécanisme ResultReceiver a été expliqué dans un autre article: - Service API reposant Cependant, il ne fonctionnerait pas dans tous les cas. S'il vous plaît se référer à mon commentaire sur ce post. Le mécanisme de diffusion à portée limitée ou PendingIntent semble plus approprié.

0
Nikhil_Katre