83 votes

Android Récepteur de Radiodiffusion vs Service

Je suis en train d'essayer de clarifier la différence entre un Récepteur de Radiodiffusion et de Service dans android.

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

Un récepteur de radiodiffusion peuvent être inscrits dans le code ou le manifeste et peut être appelée avec sendBroadcast.

Quand voulez-vous utiliser l'un vs l'autre?

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

121voto

Scott Stanchfield Points 15863

Les Services sont destinés à effectuer une action en arrière-plan pendant une certaine période de temps, indépendamment de ce que l'utilisateur est en train de faire en premier plan (l'utilisateur peut basculer entre les activités). Un bon exemple serait un lecteur de musique service - l'utilisateur commence à jouer de la musique via une application lecteur de musique, mais quand ils sortent de l'application de la musique continue à jouer.

Des Services sont également utiles pour fournir et de gérer d'accès à une ressource entre plusieurs applications. Ceci est souvent utilisé pour les ressources du système, tels que les capteurs.

Récepteurs de radiodiffusion sont destinés à répondre à une intention (généralement celui qui est envoyé par un service ou un événement système), faire quelque chose, et être fait. Un exemple pourrait être l'utilisateur touche à la technologie NFC, le téléphone à un tag, le système crée une intention pour cela, et inscrit récepteur poignées pour modifier certains paramètres (changement de volume, activer le bluetooth, etc).

Lorsque l'intention est diffusé via sendBroadcast, il sera envoyé à tous les récepteurs qui ont des filtres d'intention.


Exemple 1: Supposons que vous souhaitez exposer une fonction (disponible à partir de toute application qui veut l'utiliser) qui demande un site pour calculer les degrés de séparation de Kevin Bacon.

Notez que cet exemple est "faire quelque chose en retour", par opposition à exécuter une opération en arrière-plan.

Vous pourriez mettre en œuvre ce de plusieurs façons:

Créer un projet de bibliothèque que tous les utilisateurs de compiler dans leur application.

  • Il y a maintenant plusieurs copies de votre code, et qu'ils pourraient tous être des versions différentes.
  • Vous ne pouviez pas de lot ou de demandes de cache que chaque demande est traitée de manière indépendante.

Créer un récepteur de radiodiffusion de traiter chaque demande.

  • Votre application enregistre un récepteur de radiodiffusion afin d'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 requête à un service pour le traitement, qui envoie une Intention de l'auteur de la demande le résultat
    • Envoie une requête au serveur qui va répondre à l'aide de Google Cloud Messaging quand c'est fait
  • Parce que toutes les requêtes passent par une application, vous pouvez batch/mettre en cache les résultats
  • C'est toujours asynchrone
  • L'API est "Intentions" - pas le plus sympathique façon d'exposer votre fonctionnalité

Créer un service pour traiter chaque demande

  • Votre application crée un service pour gérer les demandes, et expose une API par l'intermédiaire d'un Liant ou à l'aide de AIDL
  • L'API peut être synchrone (appel direct et retour) ou asynchrone (permet à l'auditeur d'enregistrement et appel de l'auditeur lorsque le résultat est prêt). Vous devez seulement choisir synchrone si le traitement devrait être très rapide; des appels au serveur devrait plus souvent être traitées de manière asynchrone
  • L'API est "les appels de méthode" - un beaucoup plus conviviale de manière à exposer les fonctionnalités

Exemple 2: Vous voulez faire quelque chose d'analyse de données pour trouver quelques modèles dans vos données

Thread d'arrière-plan Si tout le traitement devrait se produire lorsque l'utilisateur est dans la même application et 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 permettre à l'utilisateur de quitter l'application, tandis que le traitement est en cours (et de les informer des résultats par la suite), ou de leur permettre de progresser au travers de plusieurs activités dans la même application, tandis que le traitement est effectué, le Service serait une meilleure approche

89voto

Vikalp Patel Points 3966

Récepteur De Radiodiffusion

Lors de la manipulation de diffusion, de l'application est donné à un ensemble fixe de temps (10 secondes) pour faire son travail. Si elle n'est pas effectuée dans ce délai, la demande sera considérée comme défaillante, et de son processus immédiatement jeté dans le contexte de l'état à être tués pour la mémoire si nécessaire.

Récepteurs de radiodiffusion sont limitées par la quantité maximale de temps(10 secondes en général), ils ont à la fin.

Service

Si votre action prend plus de temps (de la connexion à l'internet peut prendre).Plus de préférence en tant que l'exécution en arrière-plan.Vous definitelly doit appeler un service à partir du récepteur ou de l'Activité à cet effet. Ils sont les derniers à être tué par le Système d'Exploitation android.

Conclusion :

  1. En général tout le travail (extraction, l'analyse, la mise en cache, la mise à jour de la base de données) qui est importante pour votre application doit être déplacé Service comme ils sont de longue durée sur android. Comme vous l'avez presque considéré que tous les sites de réseaux sociaux a là - STICKY_SERVICES qui ne tous les pénibles travaux.

  2. BroadCastReceiver sont principalement utilisés pour démarrer le service. Il dépend généralement de la demande. La plupart de l'application utilise Connectivity Manager de diffuser chaque fois que le réseau est en HAUT OU en BAS. Avec l'aide de ces Service sont démarrés par BroadCast Receiver.

6voto

a fair player Points 2514

Tout d'abord, lisez la documentation de Récepteur de Radiodiffusion et des Services.

Vous pouvez trouver des tutoriels utiles ici et ici.

enfin, pour faire de la longue histoire courte:

Service démarre au moment de votre demande (startService(intent)). Vous pouvez penser Au récepteur de Radiodiffusion, comme une intention de l'auditeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X