web-dev-qa-db-fra.com

Communiquer avec l'activité du service (LocalService) - Meilleures pratiques pour Android

Scénario courant - Activité avec un service d'arrière-plan pour interroger le serveur.

Le service sera exécuté périodiquement via AlarmManager et effectuera également des tâches pour l'activité (l'utilisateur clique sur un bouton, va chercher quelque chose sur le serveur).

J'aimerais connaître les meilleures pratiques ici. Je pense que la meilleure conception serait l'exemple Android LocalService: http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

Cependant, dans l'exemple, l'activité a une référence à l'activité mBoundService mais il n'y a pas de connexion inverse ( le service n'a aucun moyen d'appeler l'activité ).

Quelle est la meilleure façon pour le service d’appeler l’activité?

Est-ce que j'utilise Intents, BroadcastReceivers, Messages? Comment?

20
paulpooch

Je pense que la meilleure conception serait l'exemple Android LocalService: http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

Je ne voudrais pas Utilisez le couplage le plus lâche possible que vous puissiez supporter. Par conséquent, visez en moyenne le modèle de commande avec startService() au lieu du modèle de liaison avec bindService(). Notamment, la liaison est un peu pénible pour gérer les changements de configuration (par exemple, les rotations d’écran).

Quelle est la meilleure façon pour le service d’appeler l’activité? Est-ce que j'utilise Intents, BroadcastReceivers, Messages? Comment?

Voir Notifier l'activité du service

9
CommonsWare

Si vous avez besoin d'un couplage étroit entre votre activité à l'aide de bindService (), la façon dont vous communiquez dépend de l'origine de la communication.

Si le service est d'origine (en raison d'une alarme qui a de nouvelles informations à partager), il enverra généralement une diffusion.

Si l'activité est originaire (en raison de votre exemple "va chercher quelque chose sur le serveur"), elle pourrait être gérée de manière asynchrone en utilisant AsyncTask ou similaire. Autrement dit, vous pouvez extraire du serveur dans AsyncTask.doInBackground () et reporter les résultats à l'activité dans AsyncTask.onPostExecute. Ce scénario serait un peu plus compliqué si l'opération demandée devait durer très longtemps. Dans ce cas, je la découplerais et renverrais une diffusion à partir du Service.

1
prunicki

Comme écrit ici

Lorsque vous souhaitez communiquer d'un service à une activité ou à un fragment qui n'a PAS démarré le service ou à plusieurs services/fragments, vous pouvez utiliser le bus d'événement ou les intentions de diffusion, car ils peuvent recevoir un rappel pour un événement de n'importe quelle activité ou fragment. où qu'ils soient mis en œuvre. Si vous souhaitez communiquer du service à une activité/un fragment qui a démarré le service, vous pouvez utiliser En attente d'intention ou Messenger car ils peuvent être placés dans un extra d'intention et transmis au service.

Intention en attente

Nous pouvons utiliser createPendingResult () pour créer un nouvel objet PendingIntent que vous pouvez remettre au service à utiliser et renvoyer les données de résultat à votre activité dans le rappel onActivityResult (int, int, Intent).

Event Bus

Vous pouvez faire en sorte que le service déclenche des événements que des activités ou des fragments peuvent écouter et auxquels utiliser Event Bus.

Messenger

Messenger est un colis, et peut donc être placé dans une intention supplémentaire afin que votre activité puisse transmettre ce Messenger au service. Service renseignera l'objet Message avec les données à envoyer.

Intentions de diffusion

Le service peut envoyer une émission à laquelle l'activité peut répondre.

0
Android Developer