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 contre l’autre?

Je comprends que plusieurs récepteurs de diffusion peuvent écouter la même intention et ce n’est PAS le cas avec un service.

Les services sont conçus pour effectuer 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 d’une activité à l’autre). Un bon exemple serait un service de lecture de musique – l’utilisateur commence à lire de la musique via une application de lecteur de musique, mais à la sortie de l’application, la musique continue de jouer.

Les services sont également utiles pour fournir / gérer un access commun à une ressource sur 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 terminé. Un exemple pourrait être que l’utilisateur touche un téléphone compatible NFC avec un tag, le système crée une intention pour lui et un récepteur enregistré le gère pour modifier certains parameters (changer de volume, activer le Bluetooth, etc.).

Lorsqu’une intention est diffusée via sendBroadcast, elle est envoyée à tous les récepteurs dotés de filtres d’intention correspondants. Cependant, il est important de noter que dans API26 + la plupart des récepteurs enregistrés dans le manifeste ne sont plus appelés dans de telles situations, consultez le document Google pour plus d’informations .


Exemple 1: Supposons que vous souhaitiez exposer une fonction (disponible dans n’importe quelle application qui veut l’utiliser) qui demande à un site Web de calculer les degrés de séparation de Kevin Bacon.

Notez que cet exemple est “faire quelque chose et retourner”, par opposition à effectuer une opération d’arrière-plan longue.

Vous pouvez l’implémenter de plusieurs manières:

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

  • Il existe maintenant plusieurs copies de votre code et elles peuvent toutes être différentes.
  • Vous ne pouvez pas grouper ou mettre en cache des demandes car chaque requête est gérée indépendamment.

Créez un récepteur de diffusion pour gérer 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 diffusion 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 requête au serveur qui répondra en utilisant Google Cloud Messaging
  • Étant donné que toutes les demandes passent par une application, vous pouvez grouper / mettre en cache les résultats
  • C’est toujours asynchrone
  • L’API est “Intents” – pas le moyen le plus convivial pour exposer vos fonctionnalités

Créer 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 en utilisant AIDL
  • L’API peut être synchrone (appel direct et retour) ou asynchrone (autoriser l’enregistrement de l’auditeur et appeler l’écouteur lorsque le résultat est prêt). Vous ne devez choisir que synchrone si le traitement est censé être très rapide; les appels de serveur devraient plus souvent être traités de manière asynchrone
  • L’API est des “appels de méthode” – une manière beaucoup plus conviviale d’exposer des fonctionnalités

Exemple 2: Vous souhaitez effectuer une parsing de données pour trouver des modèles dans vos données

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

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

Récepteur de diffusion

Citant Dianne Hackborn sur le blog Android Developers :

Lors du traitement d’une diffusion, l’application dispose d’un délai fixe (actuellement 10 secondes) pour effectuer son travail. Si elle ne se termine pas à ce moment-là, l’application est considérée comme se conduisant mal et son processus est immédiatement renvoyé à l’état d’arrière-plan pour être détruit si nécessaire.

Les récepteurs de diffusion sont limités par la durée maximale (10 secondes en général) qu’ils doivent terminer.

Un service

Si votre action prend un peu plus de temps (la connexion à Internet peut prendre un certain temps). Vous devez absolument appeler un service du récepteur ou de l’activité à cet effet. Ils sont les derniers à être tués par le système d’exploitation Android.

Conclusion:

  1. En règle générale, tout le travail (récupérer, parsingr, mettre en cache, mettre à jour la firebase database) qui est important pour votre application doit être déplacé vers Service car ils vivent longtemps sur Android. Comme vous avez presque considéré que tous les sites de réseautage social ont STICKY_SERVICES qui fait tout le travail STICKY_SERVICES .

  2. BroadcastReceiver est principalement utilisé pour démarrer le service. Cela dépend généralement de l’application. La plupart de l’application utilise ConnectivityManager pour diffuser chaque fois que le réseau est UP ou DOWN. Avec l’aide de ces Service sont lancés par BroadcastReceiver .

Tout d’abord, lisez la documentation à la fois pour Receiver Receiver et Services .

Vous pouvez trouver des tutoriels utiles ici et ici .

enfin, pour faire la longue histoire:

Le service démarre à votre demande (startService (intent)). Vous pouvez penser au récepteur de diffusion comme un auditeur intentionnel.