web-dev-qa-db-fra.com

Android Broadcast Receiver vs Service

J'essaie de clarifier la différence entre un récepteur de diffusion et un service dans Android.

Je comprends qu’une activité peut démarrer un service en appelant startService avec une intention.

Un récepteur de diffusion peut être enregistré dans le code ou le manifeste et peut être appelé avec sendBroadcast.

Quand utiliseriez-vous l'un ou l'autre?

Je comprends que plusieurs récepteurs de radiodiffusion peuvent être à l’écoute avec la même intention et ce n’est PAS le cas avec un service.

76
Chris Muench

Les services sont destinés à exécuter une action en arrière-plan pendant un certain temps, indépendamment de ce que l'utilisateur fait en avant-plan (l'utilisateur peut basculer entre Activités). Un bon exemple serait un service de lecteur de musique: l'utilisateur commence à lire de la musique via une application de lecteur de musique, mais lorsqu'il quitte l'application, la musique continue de jouer.

Les services sont également utiles pour fournir/gérer un accès commun à une ressource dans plusieurs applications. Ceci est souvent utilisé pour les ressources système, telles que les capteurs.

Les récepteurs de diffusion sont censés répondre à une intention (généralement celle envoyée par un service ou un événement système), faire quelque chose et être fait. Par exemple, l’utilisateur peut associer un tag à un téléphone compatible NFC, le système en crée l’intention et un destinataire enregistré le gère pour modifier certains paramètres (modification du volume, activation du Bluetooth, etc.).

Lorsqu'une intention est diffusée via sendBroadcast, elle est envoyée aux récepteurs tous dotés de filtres d'intention correspondants. Toutefois, il est important de noter que dans API26 +, la plupart des destinataires inscrits dans le manifeste ne sont plus appelés, voir la documentation Google pour plus d'informations .


Exemple 1: Supposons que vous souhaitiez exposer une fonction (disponible depuis n'importe quelle application voulant l'utiliser) demandant à un site Web de calculer les degrés de séparation de Kevin Bacon.

Notez que cet exemple est "faire quelque chose et revenir", par opposition à une opération d'arrière-plan longue durée.

Vous pouvez implémenter cela de plusieurs manières:

Créez un projet de bibliothèque que tous les utilisateurs compilent dans leur application.

  • Il existe maintenant plusieurs copies de votre code et il pourrait s'agir de versions différentes.
  • Vous ne pouvez pas mettre en lots ou mettre en cache des demandes puisque chaque demande est traitée indépendamment.

Créez un récepteur de diffusion pour traiter chaque demande.

  • Votre application enregistre un récepteur de diffusion pour accepter une intention de poser la question Bacon.
  • Chaque application envoie une intention de poser la question.
  • Le récepteur de radiodiffusion accepte l’intention et soit
    • Transmet la demande à un service pour effectuer le traitement, qui envoie une intention au demandeur avec le résultat
    • Envoie une demande au serveur qui répondra à l'aide de Google Cloud Messaging une fois l'opération terminée.
  • Toutes les demandes passant par une seule application, vous pouvez regrouper/mettre en cache les résultats.
  • C'est toujours asynchrone
  • L'API est une "intention" - n'est pas le moyen le plus convivial d'exposer vos fonctionnalités

Créez un service pour gérer chaque demande

  • Votre application crée un service pour gérer les demandes et expose une API via un classeur ou à l'aide d'AIDL.
  • L'API peut être synchrone (appel direct et retour) ou asynchrone (autoriser l'enregistrement du programme d'écoute et appeler le programme d'écoute lorsque le résultat est prêt). Vous ne devez choisir synchrone que si le traitement doit être très rapide. les appels de serveur doivent plus souvent être traités de manière asynchrone
  • L'API est un "appel de méthode" - un moyen beaucoup plus convivial d'exposer des fonctionnalités

Exemple 2: vous souhaitez effectuer une analyse de données pour rechercher des modèles dans vos données

Thread d'arrière-plan Si tout le traitement doit avoir lieu alors que l'utilisateur est dans la même application et sur la même activité, un thread d'arrière-plan (ou une AsyncTask qui gère un arrière-plan fil) serait une bonne approche

Service Si vous souhaitez autoriser l'utilisateur à quitter l'application pendant l'exécution du traitement (et lui notifier ultérieurement les résultats), ou lui permettre progresser dans plusieurs activités de la même application pendant le traitement, un service serait une meilleure approche

106
Scott Stanchfield

Récepteur de diffusion

Citant Dianne Hackborn sur le Android blog des développeurs :

Lors du traitement d'une diffusion, l'application dispose d'un ensemble de temps précis (actuellement 10 secondes) pour effectuer son travail. Si elle ne se termine pas à ce moment-là, l'application est considérée comme se comportant mal et son processus est immédiatement jeté dans l'état d'arrière-plan pour être supprimé pour mémoire s'il le faut.

Les récepteurs de diffusion sont limités par le temps maximum (10 secondes en général), ils doivent terminer.

Service

Si votre action prend plus de temps (la connexion à Internet peut en prendre un peu plus). Plus préférablement comme exécution en arrière-plan. À cette fin, vous devez absolument appeler un service du destinataire ou de l’Activité. Ils sont les derniers à être tués par Android Système d'exploitation.

Conclusion:

  1. De manière générale, tout le travail (extraction, analyse, mise en cache, mise à jour de la base de données) important pour votre application doit être déplacé vers Service car il dure depuis longtemps sur Android. Comme vous avez presque pensé que tous les sites de réseaux sociaux ont là STICKY_SERVICES qui fait tout le travail pénible.

  2. BroadcastReceiver sont principalement utilisés pour démarrer le service. Cela dépend généralement de l'application. La plupart des applications utilisent ConnectivityManager pour diffuser chaque fois que le réseau est UP OR DOWN. À l'aide de ces Service, ils sont démarrés par BroadcastReceiver.

70
Vikalp Patel

Commencez par lire la documentation de Broadcast Receiver et Services .

Vous pouvez trouver des tutoriels utiles ici et ici .

enfin, pour faire la longue histoire courte:

Le service commence à votre demande (startService (intention)). Vous pouvez considérer le récepteur Broadcast comme un auditeur d'intention.

5
a fair player