J'ai un service qui vérifie en permanence les nouvelles tâches. S'il y a une nouvelle tâche, je souhaite actualiser l'interface utilisateur de l'activité pour afficher ces informations. J'ai trouvé https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/ cet exemple. Est-ce une bonne approche? D'autres exemples?
Merci.
Réponses:
Voir ci-dessous ma réponse originale - ce modèle a bien fonctionné, mais récemment, j'ai commencé à utiliser une approche différente de la communication Service / Activité:
Utilisez RxJava pour exécuter des opérations asynchrones.
Si le service doit continuer les opérations en arrière-plan même lorsqu'aucune activité n'est en cours d'exécution, démarrez également le service à partir de la classe Application afin qu'il ne soit pas arrêté lorsqu'il n'est pas lié.
Les avantages que j'ai trouvés dans cette approche par rapport à la technique startService () / LocalBroadcast sont
Quelques exemples de code. D'abord le service:
Et une activité qui se lie au service et reçoit des mises à jour d'altitude pression:
La disposition de cette activité est:
Si le service doit s'exécuter en arrière-plan sans activité liée, il peut également être démarré à partir de la classe Application en
OnCreate()
utilisantContext#startService()
.Ma réponse originale (à partir de 2013):
Dans votre service: (en utilisant COPA comme service dans l'exemple ci-dessous).
Utilisez un LocalBroadCastManager. Dans onCreate de votre service, configurez le diffuseur:
Lorsque vous souhaitez informer l'interface utilisateur de quelque chose:
Dans votre activité:
Créez un auditeur sur onCreate:
et enregistrez-le dans onStart:
la source
onStart()
ouonResume()
. En général, si l'activité demande au service de faire quelque chose, mais se ferme avant de recevoir le résultat, il est raisonnable de supposer que le résultat n'est plus nécessaire. De même, lors du démarrage d'une activité, il doit supposer qu'il n'y a pas de demandes en cours de traitement par le service.pour moi la solution la plus simple était d'envoyer une diffusion, dans l'activité oncreate, j'ai enregistré et défini la diffusion comme ceci (updateUIReciver est défini comme une instance de classe):
Et à partir du service, vous envoyez l'intention comme ceci:
n'oubliez pas de désenregistrer la récupération dans l'activité sur destroy:
la source
J'utiliserais un service lié pour le faire et communiquerais avec lui en implémentant un auditeur dans mon activité. Donc, si votre application implémente myServiceListener, vous pouvez l'enregistrer en tant qu'auditeur dans votre service après vous être lié avec elle, appelez listener.onUpdateUI à partir de votre service lié et mettez à jour votre interface utilisateur!
la source
Je recommanderais de consulter Otto , un EventBus spécialement conçu pour Android. Votre activité / interface utilisateur peut écouter les événements publiés sur le bus à partir du service et se dissocier du backend.
la source
La solution de Clyde fonctionne, mais c'est une diffusion, ce qui, j'en suis sûr, sera moins efficace que d'appeler directement une méthode. Je peux me tromper, mais je pense que les diffusions sont davantage destinées à la communication inter-applications.
Je suppose que vous savez déjà comment lier un service à une activité. Je fais quelque chose comme le code ci-dessous pour gérer ce genre de problème:
J'ai omis des bits pour la sécurité des threads, ce qui est essentiel. Assurez-vous d'utiliser des verrous ou quelque chose du genre lors de la vérification et de l'utilisation ou de la modification des références de fragment sur le service.
la source
la source
Ma solution n'est peut-être pas la plus propre, mais elle devrait fonctionner sans problème. La logique consiste simplement à créer une variable statique pour stocker vos données sur le
Service
et mettre à jour votre vue chaque seconde sur votreActivity
.Disons que vous avez un
String
sur votreService
que vous souhaitez envoyer à unTextView
sur votreActivity
. ça devrait ressembler à çaTon service:
Votre activité:
la source
android
oui, si sa liste, essayez de créer un adaptateur ou persistent données à l' aide SqlLite / domaine db.