Service vs IntentService
est-ce que quelqu'un peut me montrer un exemple de quelque chose qui peut être fait avec un IntentService
qui ne peut pas être fait avec un Service
(et vice-versa)?
je crois aussi qu'un IntentService
fonctionne dans un fil différent et un Service
ne fonctionne pas. Donc, pour autant que je puisse voir, Démarrer un service dans son propre fil est comme Démarrer un IntentService
. N'est-il pas?
j'apprécierais que quelqu'un puisse m'aider avec mes deux questions.
12 réponses
Tejas Lagvankar a écrit un joli post à propos de ce sujet. Vous trouverez ci-dessous quelques différences clés entre le Service et IntentService.
quand utiliser?
-
le Service peut être utilisé dans des tâches sans interface utilisateur, mais ne devrait pas être trop long. Si vous avez besoin d'effectuer de longues tâches, vous devez utiliser des threads dans le Service.
-
le IntentService peut être utilisé dans de longues tâches généralement sans communication avec le fil principal. Si la communication est nécessaire, peut utiliser Main Thread handler ou broadcast intents. Un autre cas d'utilisation est lorsque des callbacks sont nécessaires (tâches déclenchées par L'intention).
comment déclencher?
-
le Service est déclenché par méthode d'appel
startService()
. -
le IntentService est déclenché en utilisant une intention, il produit un nouveau fil ouvrier et la méthode
onHandleIntent()
est appelée sur ce fil.
Déclenchée De
- le Service et IntentService peut être déclenché à partir de n'importe quel fil, activité ou autre composante de l'application.
Fonctionne Sur
-
le Service fonctionne en arrière-plan mais il fonctionne sur le fil principal de l'application.
-
le IntentService fonctionne sur un fil ouvrier séparé.
Limitations /Inconvénients
-
le Service peut bloquer le fil principal de la demande.
-
le IntentService ne peut exécuter des tâches en parallèle. Par conséquent, toutes les intentions consécutives iront dans la file d'attente de messages pour le thread worker et s'exécuteront séquentiellement.
Quand arrêter?
-
si vous mettez en œuvre un Service , il est de votre responsabilité d'arrêter le service lorsque son travail est terminé, en appelant
stopSelf()
oustopService()
. (Si vous voulez seulement fournir la liaison, vous n'avez pas besoin d'implémenter cette méthode). -
Le IntentService arrête le service de toutes les demandes ont été traitées, de sorte vous n'avez jamais à appeler
stopSelf()
.
Si quelqu'un peut me montrer un exemple de quelque chose que vous pouvez faire avec un intentService et ne peut pas être fait avec un Service et l'autre manière autour.
Par définition, c'est impossible. IntentService
est une sous-classe de Service
, écrite en code Java. Par conséquent, tout ce qu'un IntentService
fait, un Service
pourrait le faire, en incluant les bits de code pertinents que IntentService
utilise.
Démarrer un service avec son propre fil est comme Démarrer un IntentService. N'est-il pas?
Les trois principales caractéristiques d'un IntentService
sont:
-
le thread d'arrière plan
-
la queue automatique de
Intent
s livré àonStartCommand()
, donc si unIntent
est en cours de traitement paronHandleIntent()
sur le fil de fond, d'autres commandes file d'attente leur tour -
l'arrêt automatique du
IntentService
, via un appel àstopSelf()
, une fois la file d'attente vide
Tout ce qui pourrait être mis en œuvre par un Service
sans étendre IntentService
.
Service
- invoquer par
startService()
- déclenché par l'un des
Thread
- fonctionne sur
Main Thread
- peut bloquer le fil principal (UI). Toujours utiliser le fil dans le service pour la tâche longue
- une fois que la tâche est terminée, il est de notre responsabilité d'arrêter le service en appelant
stopSelf()
oustopService()
IntentService
- il exécute la tâche longue généralement aucune communication avec le fil principal si la communication est nécessaire, alors il est fait par
Handler
ouBroadcastReceiver
- Invoquer via
Intent
- déclenché de
Main Thread
- fonctionne sur le fil séparé
- ne peut pas exécuter la tâche en parallèle et plusieurs intentions sont en attente sur le même thread de travail.
différences
La classe de Service- utilise le filetage
main
de L'application, tandis Qu'IntentService crée un filetageworker
et utilise ce fil pour exécuter le service.
- IntentService crée une file d'attente qui passe une intention à la fois à
onHandleIntent()
. Ainsi, la mise en œuvre d'un multi-thread devrait être faite en étendant la classe de Service directement.
- La classe Service a besoin d'un arrêt manuel avec
stopSelf()
. Pendant ce temps, IntentService s'arrête automatiquement lorsqu'il n'y a pas d'intention dans la file d'attente, toutes les intentions dans la file d'attente sont traitées.
- IntentService mise en œuvre des
onBind()
qui renvoie la valeur null. Cela signifie que IntentService ne peut pas être lié par défaut.
- IntentService mise en œuvre des
onStartCommand()
qui envoie l'Intention de file d'attente et de onHandleIntent().
ajouter des Points à la réponse acceptée:
voir l'utilisation D'IntentService dans L'API Android. par exemple:
public class SimpleWakefulService extends IntentService {
public SimpleWakefulService() {
super("SimpleWakefulService");
}
@Override
protected void onHandleIntent(Intent intent) { ...}
pour créer un composant IntentService pour votre application, définissez une classe qui étend IntentService, et à l'intérieur de celle-ci, définissez une méthode qui l'emporte sur onHandleIntent().
aussi, voir le code source de IntentService, c'est le constructeur et les méthodes de cycle de vie comme onStartCommand...
@Override
public int More ...onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
Service d'une AsyncTask est l'une des meilleures approches pour beaucoup utilisez des cas où la charge utile n'est pas énorme. ou tout simplement créer une classe l'extension de IntentSerivce. De Android version 4.0 tout le réseau les opérations doivent être dans le processus de fond sinon l'application compiler / construire échoue. séparer le fil de L'interface utilisateur. La classe AsyncTask fournit l'une des façons les plus simples de lancer une nouvelle tâche à partir du thread de L'interface utilisateur. Pour plus de discussion sur ce sujet, voir le billet de blog
à partir de développeurs Android guide :
IntentService est une classe de base pour les Services qui gèrent les requêtes asynchrones (exprimé en Intentions) sur demande. Les Clients envoient leurs demandes par l'intermédiaire d'appels de service(intention); le service est lancé au besoin, traite chaque intention, à son tour, en utilisant un worker thread, et s'arrête lorsqu'il est à court de travail.
Design schéma utilisé dans IntentService
: Ce modèle de" processeur de file d'attente de travail " est couramment utilisé pour décharger des tâches à partir du thread principal d'une application. La classe IntentService existe pour simplifier ce modèle et prendre soin de la mécanique. Pour l'utiliser, étendre IntentService et mettre en œuvre onHandleIntent(intention). IntentService recevra les intentions, lancera un thread de worker et arrêtera le service si nécessaire.
Toutes les demandes sont traitées sur un thread de worker unique -- ils peuvent prendre autant de temps que nécessaire (et ne bloqueront pas la boucle principale de l'application), mais une seule requête sera traitée à la fois.
la classe IntentService fournit une structure simple pour exécuter une opération sur un seul filetage d'arrière-plan. Cela lui permet de gérer des opérations de longue durée sans affecter la réactivité de votre interface utilisateur. En outre, un IntentService N'est pas affecté par la plupart des événements du cycle de vie de l'interface utilisateur, de sorte qu'il continue à courir dans des circonstances qui fermeraient un 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 s'exécutent de façon séquentielle. Si une opération est exécutée dans un IntentService, et que vous lui envoyez une autre requête, la requête attend que la première opération soit terminée. Une opération en cours sur un IntentService ne peut pas être interrompu. Toutefois, dans la plupart des cas
IntentService est le moyen privilégié de simples opérations d'arrière-plan
* *
Bibliothèque Volley
Il ya la bibliothèque appelée volley-bibliothèque pour le développement d'applications de réseau android Le code source est disponible pour le public dans GitHub.
Le android la documentation officielle de Meilleures pratiques pour les travaux en arrière-plan : aide à mieux comprendre le service intention, thread, handler, service. et aussi effectuer des opérations de réseau
je suis sûr que vous pouvez trouver une longue liste de différences en googlant simplement quelque chose comme 'Android IntentService vs Service'
une des différences les plus importantes par exemple est que IntentService se termine une fois qu'il est fait.
Quelques exemples (vite fait):
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 peut nettoyer lui-même une fois que tout est téléchargé.
Service: un Service qui sera constamment utilisé pour communiquer entre votre application et back-end avec des appels API web. 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
fonctionne sur son propre fil.
Il arrêtera de lui-même quand il est fait. De plus comme le feu et oublier.
Les appels subséquents seront placés en file d'attente. Bon pour les les d'attente des appels.
Vous pouvez également lancer plusieurs threads dans IntentService
si vous avez besoin - vous pouvez atteindre cet objectif en utilisant ThreadPoolExecutor
.
Je dis cela parce que beaucoup de gens m'ont demandé "Pourquoi utiliser IntentService
car il ne supporte pas l'exécution parallèle".
IntentService
n'est qu'un fil. Vous pouvez faire ce que vous besoin à l'intérieur - même filage fils multiples. La seule mise en garde est que IntentService
se termine dès que vous faites tourner ces fils multiples. Ça n'attend pas que ces fils reviennent. Vous devez prendre soin de cela. Je recommande donc d'utiliser ThreadPoolExecutor
dans ces scénarios.
- Bon pour la Synchronisation, téléchargement, etc ...
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 service
explicitement.
Je l'ai utilisé pour une situation où vous devez exécuter des choses dans l'arrière-plan, même lorsque vous vous éloignez de votre application et revenir plus pour un service
Sans Tête .
- encore une fois, vous pouvez exécuter plusieurs threads si vous en avez besoin.
- Peut être utilisé pour des applications comme les lecteurs de musique.
vous pouvez toujours communiquer à votre activité en utilisant 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 démarre, crée un thread et exécute sa tâche dans le thread. une fois fait, il nettoie tout. Une seule instance D'IntentService peut être exécutée en même temps, plusieurs appels sont demandés.
C'est très simple à utiliser et très pratique pour beaucoup d'utilisations, par exemple télécharger les choses. Mais il a des limites qui peuvent vous donner envie d'utiliser à la place le Service plus basique (pas simple).
par exemple, un service connecté à un serveur xmpp et lié par des activités ne peut pas être simplement fait en utilisant un IntentService. Vous finirez par ignorer ou passer outre les affaires IntentService.
Si quelqu'un peut me montrer un exemple de quelque chose que vous pouvez faire avec un
IntentService
et ne peut pas être fait avec unservice
et dans l'autre sens.
IntentService
ne peut pas être utilisé pour L'écoute de longue durée, comme pour les auditeurs XMPP, son un seul opérateur de temps, faire le travail et dire au revoir de la main.
aussi il a juste un threadworker, mais avec un truc, vous pouvez l'utiliser comme illimité.
Ne pas réinventer la roue
IntentService s'étend Service "1519280920 classe", ce qui signifie clairement que IntentService
est intentionnellement fait pour les même but.
Alors quel est le but ?
le but de IntentService est de rendre notre travail plus facile pour exécuter des tâches de fond sans même se soucier de
-
création de fil ouvrier
-
Queuing le traitement de plusieurs demande un par un (
Threading
) - détruisant le
Service
Donc NON , Service
peut faire n'importe quelle tâche, qui 151900920" allait faire. Si vos exigences tombent sous les critères mentionnés ci-dessus, alors vous n'avez pas à écrire logics dans la classe Service
.
Alors ne réinventez pas la roue parce que IntentService
est la roue inventée.
la "principale" différence
le service fonctionne sur le fil UI tandis qu'un IntentService fonctionne sur un filetage séparé
Comment IntentService
est faite à partir de Service
un service normal fonctionne sur le Thread UI(tout type de Composant Android fonctionne sur le thread UI par défaut) par exemple Activity
, BroadcastReceiver
, ContentProvider
et Service
). Si vous avez à faire un travail qui peut prendre un certain temps, alors vous devez créer un thread. En cas de demandes multiples, vous devrez traiter avec synchronization
.
IntentService
est donné une implémentation par défaut qui fait ces tâches pour vous.
Selon page de développeur
-
IntentService
crée un travailleur Filetage -
IntentService
crée une file d'attente de travail qui envoie la requête àonHandleIntent()
méthode un par un - quand il n'y a pas de travail alors
IntentService
appellestopSelf()
méthode - fournit l'implémentation par défaut pour la méthode
onBind()
qui est nulle - implementation par défaut pour
onStartCommand()
qui envoieIntent
demande de WorkQueue et éventuellement àonHandleIntent()
principale différence:
-
Service
la classe a besoin d'un arrêt manuel avecstopSelf()
. Pendant ce temps,IntentService
s'arrête automatiquement quand il n'y a pas d'intention dans la file d'attente. -
le
IntentServic
e peut être utilisé dans les tâches longues généralement, mais si vous avez besoin d'effectuer des tâches longues, vous devez utiliser des threads dansService
.
la principale différence entre un Service
et un IntentService
est décrite comme suit:
Service:
1.Un Service
par défaut, s'exécute sur le thread principal de l'application.(ici, aucun thread de worker par défaut n'est disponible).Donc l'utilisateur doit créer un thread séparé et faire le travail requis dans ce thread.
2.Permet plusieurs requêtes à la fois.(Filetage Multiple)
IntentService:
1.Maintenant, pour en venir à IntentService
, voici un thread de worker par défaut est disponible pour effectuer n'importe quelle opération. notez que - vous devez mettre en œuvre la méthode onHandleIntent()
, qui reçoit l'intention pour chaque demande de démarrage, où vous pouvez faire le travail de fond.
2.Mais il ne permet qu'une seule requête à la fois.