Service vs IntentService
Quelqu'un peut-il svp me montrer un exemple de quelque chose qui peut être fait avec un IntentService
qui ne peut être fait avec un Service
(et vice-versa)?
Je crois également qu'un IntentService
s'exécute dans un thread différent et un Service
ne le fait pas. Donc, tant que je peux voir, le démarrage d'un service au sein de son propre thread, c'est comme commencer un IntentService
. N'est-il pas?
J'apprécierais si quelqu'un peut m'aider avec mes deux questions.
IntentService is used for short tasks (etc) and a service is for long ones
où avez-vous lu cela ?- aussi, je vous suggère de lire le code source pour IntentService. Il le rend tout à fait clair ce qu'il est et ce qu'il fait.
- J'ai édité ma question après je vous ai vu des commentaires.
- Code pour IntentService: android.googlesource.com/platform/frameworks/base/+/refs/heads/...
- Lien dans le commentaire précédent (par greg7gkb) est une excellente lecture.
Vous devez vous connecter pour publier un commentaire.
Tejas Lagvankar a écrit un joli post sur ce sujet.
Ci-dessous sont certaines des principales différences entre le Service et IntentService.
Quand les utiliser?
La Service peut être utilisé dans les tâches sans INTERFACE utilisateur, mais ne devrait pas être trop long. Si vous avez besoin de réaliser des tâches, vous devez utiliser des threads au sein du Service.
La IntentService peut être utilisé dans de longues tâches généralement avec aucune communication Thread Principal. Si la communication est nécessaire, peut utiliser des Thread Principal gestionnaire ou la diffusion de ses intentions. Un autre cas d'utilisation, c'est quand les rappels sont nécessaires (Intention déclenché des tâches).
Comment déclencher?
La Service est déclenchée par l'appel de méthode
startService()
.La IntentService est déclenchée à l'aide d'une Intention, il donne naissance à un nouveau thread de travail et la méthode
onHandleIntent()
est appelée sur ce fil.Déclenchée À Partir De
S'Exécute Sur
La Service s'exécute en arrière-plan, mais il fonctionne sur le Thread Principal de l'application.
La IntentService s'exécute sur un autre thread de travail.
Limites /Inconvénients
La Service peut bloquer le Thread Principal de l'application.
La IntentService ne peut pas exécuter des tâches en parallèle. Par conséquent, toutes les consécutives intentions d'aller dans la file d'attente de message pour le thread de travail et exécuter séquentiellement.
Quand arrêter?
Si vous implémentez un Service, il est de votre responsabilité d'arrêter le service une fois son travail terminé, en appelant
stopSelf()
oustopService()
. (Si vous voulez seulement de fournir de liaison, vous n'avez pas besoin de mettre en œuvre cette méthode).La IntentService arrête le service de toutes les demandes ont été traitées, de sorte que vous ne jamais avoir à appeler
stopSelf()
.Service
est un objet. Il ne fonctionne pas sur n'importe quel Thread. Le les méthodes d'uneService
peut s'exécuter sur n'importe quel Thread, Le cycle de vie des méthodes (onCreate()
,onStartCommand()
,onDestroy()
sont appelés par l'Androïde cadre sur-le-main (UI) Thread. Lors de la mise en œuvre d'unService
il est courant de commencer votre propreThread
s en tant que travailleur ou threads d'arrière-plan et d'effectuer des opérations de longue durée sur les threads.IntentService
est juste une extenstion deService
qui fait cela pour vous."it is your responsibility to stop the service when its work is done, by calling stopSelf() or stopService()"
Eh bien, c'est pas tout à fait vrai de la science maintenant pour les applications qui le ciblage de l'API 26 et ci-dessus. Service d'arrière-plan est de se faire tuer par des OS lors de l'application estidle
. developer.android.com/about/versions/oreo/background.htmlPar définition, c'est impossible.
IntentService
est une sous-classe deService
, écrit en code Java. Donc, tout ce que lesIntentService
n', unService
pourrait faire, y compris les bits de code quiIntentService
utilise.Les trois principales caractéristiques d'un
IntentService
sont:le thread d'arrière-plan
automatique de files d'attente de
Intent
s) livrés àonStartCommand()
, donc si onIntent
est en cours de traitement paronHandleIntent()
sur le thread d'arrière-plan, d'autres commandes de la queue en attendant leur tourl'arrêt automatique de l'
IntentService
, via un appel àstopSelf()
, une fois la file d'attente est videToutes et à tous, qui pourrait être mis en œuvre par un
Service
sans l'extensionIntentService
.Service
appelé avecstartService
ne peut fonctionner pendant environ 10 secondes avant de lancer une ANR-- unIntentService
a commencé avec la radiodiffusion d'une intention ne semble pas avoir cette limitationonStartCommand()
d'unService
, sont appelées sur le thread principal de l'application. Vous ne pouvez pas attacher ce fil de discussion pour plus de quelques millisecondes sans le gel de votre INTERFACE utilisateur, et si vous prenez de longues secondes, vous obtiendrez l'équivalent d'une ANR.onStartCommand
au lieu deonHandleIntent
-- ressembleonStartCommand
est exécuté sur le thread de l'INTERFACE utilisateur, cependant un thread séparé est généré pouronHandleIntent
exécution.onHandleIntent()
retourne, si il n'y a plus de travail à faire.Service
est une classe Java.IntentService
est une sous-classe deService
. Toutefois, vous pouvez créer d'autres sous-classes deService
ainsi.IntentService
est pas affectée. Si Android termine le processus, laIntentService
disparaît lorsque le processus n'. Et il est possible que vous avez autre chose en tête pour la "suppression".IntentService
est unService
. Tout à fait normalService
règles s'appliquent. En plus, unIntentService
s'arrête automatiquement quand le travail enonHandleIntent()
complète. Notez queIntentService
ne fonctionne pas particulièrement bien sur Android 8.0+ - s'il vous plaît envisager d'utiliserJobIntentService
ou (en 2019 et au-delà)WorkManager
pour ce genre de travail de fond.Service
startService()
Thread
Main Thread
stopSelf()
oustopService()
IntentService
Handler
ouBroadcastReceiver
Intent
Main Thread
L'ajout de points à l'acceptés réponse:
Voir l'utilisation de IntentService au sein de l'API Android.
par exemple:
Pour créer un IntentService composant de votre application, de définir une classe qui étend la classe IntentService, et, en son sein, de définir une méthode qui remplace onHandleIntent().
Aussi, voir le code source de la IntentService, c'est le constructeur et le cycle de vie des méthodes comme onStartCommand...
de Guide pour les développeurs Android:
IntentService est une classe de base pour les Services qui gèrent les requêtes asynchrones (exprimé en Intentions) sur demande. Les Clients envoient des requêtes à travers startService(Intent) appelle; le service est démarré en tant que de besoin, les poignées de chaque Intention, à son tour, à l'aide d'un thread de travail, et s'arrête de lui-même quand il est à court de travail.
:
Ce "travail de la file d'attente du processeur" motif est couramment utilisé pour décharger des tâches à partir d'une application thread principal. Le IntentService il existe des classes pour simplifier ce modèle et de prendre soin de la mécanique. Pour l'utiliser, étendre IntentService et de mettre en œuvre onHandleIntent(Intention). IntentService recevrez les Intentions, le lancement d'un thread de travail, et arrêter le service le plus approprié.
Toutes les demandes sont traitées sur un seul thread de travail -- ils peuvent prendre aussi longtemps que nécessaire (et ne va pas bloquer l'application de la boucle principale), mais une seule demande sera traitée à la fois.
La IntentService classe fournit une simple structure pour l'exécution d'une opération sur un seul thread d'arrière-plan. Cela permet de gérer des opérations de longue durée, sans affecter votre interface utilisateur de la réactivité. Aussi, un IntentService n'est pas affecté par la plupart de l'interface utilisateur événements du cycle de vie, de sorte qu'il continue à fonctionner dans des circonstances qui pourraient arrêter une AsyncTask.
Un IntentService a quelques limitations:
Il ne peut pas interagir directement avec votre interface utilisateur. Pour mettre ses résultats dans l'INTERFACE utilisateur, vous devez les envoyer à une Activité.
Les demandes de travail sont exécutées de manière séquentielle. Si une opération est en cours dans un IntentService, et de vous envoyer une autre demande, la demande attend jusqu'à ce que la première opération est terminée.
Une opération en cours d'exécution sur un IntentService ne peut pas être interrompu.
Cependant, dans la plupart des cas
**
Il y a la bibliothèque appelée volley-bibliothèque pour le développement d'android applications de mise en réseau
Le code source est disponible pour le public sur GitHub.
Android documentation officielle pour Les meilleures pratiques pour les travaux en arrière-plan:
permet de mieux comprendre l'intention du service, du fil, un gestionnaire de service. et aussi Effectuer Les Opérations De Réseau
Je suis sûr que vous pouvez trouver une vaste liste de différences par simple recherche sur google quelque chose comme "Android IntentService vs Service"
L'une des plus importantes différences, par exemple, c'est que IntentService se termine une fois que c'est fait.
Quelques exemples (vite faite) pourrait être;
IntentService: Si vous souhaitez télécharger un tas d'images au début de l'ouverture de votre application. C'est un processus unique et permet de nettoyer lui-même une fois que tout est téléchargé.
Service: Un Service qui va constamment être utilisé pour communiquer entre votre application et le back-end web d'appels d'API. Même si c'est fini avec sa tâche actuelle, vous voulez toujours être autour de quelques minutes plus tard, pour plus de communication.
IntentService
IntentService
s'exécute dans son propre thread.Il arrêtera de lui-même quand il est fait. De plus comme le feu et oublier.
Les appels suivants seront mis en file d'attente. Bon pour les les d'attente des appels.
Vous est également possible de lancer plusieurs threads dans
IntentService
si vous en avez besoin - Vous pouvez le faire en utilisantThreadPoolExecutor
.Je dis cela parce que beaucoup de gens m'ont demandé "pourquoi utiliser
IntentService
car il ne prend pas en charge l'exécution en parallèle".IntentService
est juste un fil. Vous pouvez faire ce que vous avez besoin à l'intérieur d'elle - Même la filature de plusieurs threads. Le seul inconvénient est queIntentService
se termine dès que vous tournez ceux de plusieurs threads. Il n'attendez pas pour ces fils de revenir. Vous devez prendre soin de cela. Je recommande donc à l'aide deThreadPoolExecutor
dans ces scénarios.Service.
Par Défaut
Service
s'exécute sur le thread principal. Vous avez besoin de faire tourner un thread de travail à faire votre travail.Vous devez arrêter de
service
explicitement.Je l'ai utilisé pour une situation où vous avez besoin d'exécuter des trucs dans le fond, même lorsque vous vous éloignez de votre application et de revenir plus pour une Tête
service
.Vous pouvez toujours communiquer avec votre activité à l'aide
BroadcastReceivers
si vous en avez besoin.Un IntentService est une extension d'un Service qui est effectuée afin de faciliter l'exécution d'une tâche qui doit être exécutée en arrière-plan et dans une séparation fil.
IntentService commence, créer un thread et exécute sa tâche dans le thread. une fois fait, il nettoie tout. Une seule instance d'un IntentService peuvent s'exécuter en même temps, plusieurs appels sont en file d'attente.
Il est très simple à utiliser et très pratique pour beaucoup d'utilisations, par exemple de télécharger des trucs. Mais il a des limites qui peuvent faire que vous voulez utiliser à la place la plus basique (pas simple) de Service.
Par exemple, un service connecté à un serveur xmpp et lié par les activités ne peuvent pas être simplement réalisé à l'aide d'un IntentService. Vous obtiendrez d'ignorer ou de la transgression de IntentService animaux.
Ne pas réinventer la roue
IntentService s'étend Service classe qui signifie clairement que
IntentService
est intentionnellement fait pour même but.Alors, quel est le but ?
`IntentService le but est de rendre notre travail plus facile pour exécuter des tâches en arrière-plan, sans même se soucier de
Création de thread de travail
Queuing le traitement de plusieurs demande un par un (
Threading
)Service
Donc PAS,
Service
peut faire n'importe quelle tâche qui unIntentService
ferait. Si vos besoins en matière de tomber sous les critères mentionnés ci-dessus, alors vous n'avez pas à écrire ces logiques dansService
classe.Afin de ne pas réinventer la roue, car
IntentService
est inventé la roue.Le "Principal" différence
Quand utilisez-vous IntentService?
Lorsque vous souhaitez effectuer plusieurs tâches en arrière-plan un par un, qui existent au-delà de la portée de l'Activité puis la
IntentService
est parfait.Comment
IntentService
est fabriqué à partir deService
Un service normal fonctionne sur le Thread d'INTERFACE utilisateur(Android Tout type de Composant s'exécute sur le thread de l'INTERFACE utilisateur par défaut par exemple
Activity
,BroadcastReceiver
,ContentProvider
etService
). Si vous avez à faire un travail qui peut prendre un certain temps, alors vous devez créer un thread. En cas de plusieurs demandes, vous aurez à traiter avecsynchronization
.IntentService
est donné par défaut, certaines de mise en œuvre qui n'ces tâches pour vous.Selon page développeur
IntentService
crée un Thread de travailIntentService
crée une File d'attente de Travail qui envoie la demande à laonHandleIntent()
méthodeIntentService
appelsstopSelf()
méthodeonBind()
méthode qui est nulleonStartCommand()
qui envoieIntent
demande à WorkQueue et, éventuellement, àonHandleIntent()
IntentService
ne peut pas être utilisé pour le Long Temps d'Écoute, Comme pour XMPP Auditeurs, de ses un seul opérateur en temps, faire le travail et au revoir.Aussi il a juste un threadworker, mais avec une astuce, vous pouvez l'utiliser comme illimité.
La Différence Majeure entre un
Service
et unIntentService
est décrite comme suit:Service :
1.Un
Service
par défaut, s'exécute dans le thread principal.(ici, pas de défaut thread de travail est disponible).Ainsi, l'utilisateur doit créer un thread séparé et faire le travail requis dans ce thread.2.Permet à Plusieurs demandes à la fois.(Multi-Threading)
IntentService :
1.Maintenant, venir à
IntentService
, ici un défaut thread de travail est disponible pour effectuer toute opération. Noter que - Vous besoin pour mettre en œuvreonHandleIntent()
méthode ,qui reçoit l'intention pour chaque démarrage, où vous pouvez faire le travail de fond.2.Mais il ne permet qu'une seule requête à la fois.