Je cherche 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 également qu'un an IntentService
s'exécute dans un thread différent et un Service
non. Donc, pour autant que je puisse voir, démarrer un service dans son propre thread est comme démarrer un IntentService
. Est-ce exact?
IntentService is used for short tasks (etc) and a service is for long ones
où avez-vous lu cela?Réponses:
Tejas Lagvankar a écrit un bel article sur ce sujet. Voici quelques différences clés entre 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 devez effectuer de longues tâches, vous devez utiliser des threads dans Service.
Le IntentService peut être utilisé dans des tâches longues généralement sans communication thread principal. Si une communication est requise, peut utiliser le gestionnaire de thread principal ou des intentions de diffusion. Un autre cas d'utilisation est lorsque des rappels sont nécessaires (tâches déclenchées par intention).
Comment déclencher?
Le service est déclenché par la méthode d'appel
startService()
.Le IntentService est déclenchée à l' aide d' une intention, il engendre un nouveau thread de travail et la méthode
onHandleIntent()
est appelée sur ce fil.Déclenché à partir de
Fonctionne sur
Le service s'exécute en arrière-plan mais il s'exécute sur le thread principal de l'application.
Le IntentService fonctionne sur un thread de travail séparé.
Limitations / inconvénients
Le service peut bloquer le thread principal de l'application.
Le IntentService ne peut pas 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 de travail et s'exécuteront séquentiellement.
Quand arrêter?
Si vous implémentez un Service , il est de votre responsabilité d'arrêter le service lorsque son travail est terminé, en appelant
stopSelf()
oustopService()
. (Si vous souhaitez uniquement fournir une liaison, vous n'avez pas besoin d'implémenter cette méthode).Le IntentService arrête le service après toutes les demandes de départ ont été traitées, de sorte que vous ne devez jamais appel
stopSelf()
.la source
Par définition, c'est impossible.
IntentService
est une sous-classe deService
, écrite en Java. Par conséquent, tout ce queIntentService
fait,Service
pourrait faire, en incluant les bits de code pertinents quiIntentService
utilisent.Les trois principales caractéristiques d'un
IntentService
sont:le fil de fond
la mise en file d'attente automatique des
Intent
s livrés àonStartCommand()
, donc si l'unIntent
est en cours de traitement paronHandleIntent()
sur le thread d'arrière-plan, d'autres commandes font la queue en attendant leur tourl'arrêt automatique du
IntentService
, via un appel àstopSelf()
, une fois la file d'attente videTout cela pourrait être mis en œuvre par un
Service
sans s'étendreIntentService
.la source
Service
appel avecstartService
ne peut fonctionner que pendant environ 10 secondes avant de lancer un ANR - unIntentService
début de diffusion d'une intention ne semble pas avoir cette limitationonStartCommand()
aService
, sont appelées sur le thread d'application principal. Vous ne pouvez pas bloquer ce fil pendant plus de quelques millisecondes sans geler votre interface utilisateur, et si vous prenez plusieurs secondes, vous obtiendrez l'équivalent de service d'un ANR.onStartCommand
au lieu deonHandleIntent
- on dirait qu'ilonStartCommand
est exécuté sur le thread d'interface utilisateur, mais un thread séparé est généré pour l'onHandleIntent
exécution.IntentService
appelle cela lui-même, après lesonHandleIntent()
retours, s'il n'y a plus de travail à faire.Un service
startService()
Thread
Main Thread
stopSelf()
oustopService()
IntentService
Handler
ouBroadcastReceiver
Intent
Main Thread
la source
Ne réinventez pas la roue
IntentService étend le service classe de , ce qui signifie clairement qu'elle
IntentService
est intentionnellement conçue pour le même objectif.Quel est donc le but?
`Le but d'IntentService est de rendre notre travail plus facile à exécuter des tâches d'arrière-plan sans même se soucier
Création d'un thread de travail
Mettre en file d'attente le traitement des demandes multiples une par une (
Threading
)Service
Donc NON ,
Service
peut faire n'importe quelle tâche qui leIntentService
ferait. Si vos besoins correspondent aux critères mentionnés ci-dessus, vous n'avez pas à écrire ces logiques dans leService
classe. Alors ne réinventez pas la roue carIntentService
c'est la roue inventée.La différence "principale"
Quand utilisez-vous IntentService?
Lorsque vous souhaitez effectuer plusieurs tâches d'arrière-plan une par une qui existent au-delà de la portée d'une activité, alors
IntentService
c'est parfait.Comment
IntentService
est fabriqué à partir deService
Un service normal s'exécute sur le thread d'interface utilisateur (tout type de composant Android s'exécute sur le thread d'interface utilisateur par défaut
Activity
, par exempleBroadcastReceiver
,ContentProvider
etService
). Si vous devez effectuer un travail qui peut prendre un certain temps, vous devez créer un fil. En cas de demandes multiples, vous devrez traitersynchronization
.IntentService
reçoit une implémentation par défaut qui effectue ces tâches pour vous.Selon la page du développeur
IntentService
crée un fil de travailIntentService
crée une file d'attente de travail qui envoie une requête à laonHandleIntent()
méthode une par uneIntentService
appellestopSelf()
méthodeonBind()
méthode qui est nulleonStartCommand()
laquelle envoie laIntent
demande à WorkQueue et éventuellement àonHandleIntent()
la source
Ajout de points à la réponse acceptée:
Voir l'utilisation d'IntentService dans l'API Android. par exemple:
Pour créer un composant IntentService pour votre application, définissez une classe qui étend IntentService et, à l'intérieur, définissez une méthode qui remplace onHandleIntent ().
Voir aussi le code source de IntentService, ses méthodes de constructeur et de cycle de vie comme onStartCommand ...
du guide des développeurs Android :
IntentService est une classe de base pour les services qui gèrent les demandes asynchrones (exprimées en intentions) à la demande. Les clients envoient des demandes via des appels startService (Intent); le service est démarré selon les besoins, gère chaque intention, à son tour, à l'aide d'un thread de travail, et s'arrête lorsqu'il est à court de travail.
: Ce modèle de "processeur de file d'attente de travail" est couramment utilisé pour décharger les tâches 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, étendez IntentService et implémentez onHandleIntent (Intent). IntentService recevra les intentions, lancera un thread de travail et arrêtera le service comme il convient.
Toutes les demandes sont traitées sur un seul thread de travail - elles peuvent prendre aussi longtemps que nécessaire (et ne bloqueront pas la boucle principale de l'application), mais une seule demande sera traitée à la fois.
La classe IntentService fournit une structure simple pour exécuter une opération sur un seul thread 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 de cycle de vie de l'interface utilisateur, il continue donc de s'exécuter dans des circonstances qui arrêteraient 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 s'exécutent séquentiellement. Si une opération s'exécute dans un IntentService et que vous lui envoyez une autre demande, la demande attend la fin de la première opération. Une opération exécutée sur un IntentService ne peut pas être interrompue. Cependant, dans la plupart des cas
**
Il y a la bibliothèque appelée volley-bibliothèque pour développer des applications de mise en réseau Android Le code source est disponible pour le public dans GitHub.
La documentation officielle Android pour les meilleures pratiques pour les travaux en arrière-plan : permet de mieux comprendre le service intentionnel, le thread, le gestionnaire, le service. et également effectuer des opérations réseau
la source
Je suis sûr que vous pouvez trouver une liste complète des différences en recherchant simplement quelque chose comme «Android IntentService vs Service»
L'une des différences les plus importantes par exemple est que IntentService se termine une fois terminé.
Quelques exemples (rapidement inventés) pourraient ê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 peut se nettoyer une fois que tout est téléchargé.
Service: Un service qui sera constamment utilisé pour communiquer entre votre application et votre back-end avec des appels d'API Web. Même s'il a terminé sa tâche en cours, vous souhaitez qu'il soit environ quelques minutes plus tard, pour plus de communication.
la source
IntentService
IntentService
s'exécute sur son propre thread. Il s'arrêtera une fois terminé. Plus comme le feu et oubliez. Les appels suivants seront mis en file d'attente. Bon pour les appels en file d'attente. Vous pouvez également faire tourner plusieurs threadsIntentService
si vous en avez besoin. Vous pouvez y parvenir en utilisantThreadPoolExecutor
. Je dis cela parce que beaucoup de gens m'ont demandé "pourquoi l'utiliserIntentService
car il ne prend pas en charge l'exécution parallèle".IntentService
n'est qu'un fil. Vous pouvez faire tout ce dont vous avez besoin à l'intérieur - même en faisant tourner plusieurs threads. La seule mise en garde est que cela seIntentService
termine dès que vous faites tourner ces multiples threads. Il n'attend pas que ces fils reviennent. Vous devez vous en occuper. Je recommande donc d'utiliserThreadPoolExecutor
dans ces scénarios.Un service
Par défaut
Service
s'exécute sur le thread principal. Vous devez faire tourner un fil de travail pour faire votre travail. Vous devez vous arrêterservice
explicitement. Je l'ai utilisé pour une situation où vous devez exécuter des choses en arrière-plan même lorsque vous vous éloignez de votre application et revenez plus pour un Headlessservice
.Vous pouvez toujours communiquer avec votre activité en utilisant
BroadcastReceivers
si vous en avez besoin.la source
Un IntentService est une extension d'un service qui est faite pour faciliter l'exécution d'une tâche qui doit être exécutée en arrière-plan et dans un thread séparé.
IntentService démarre, crée un thread et exécute sa tâche dans le thread. une fois terminé, il nettoie tout. Une seule instance d'un IntentService peut s'exécuter en même temps, plusieurs appels sont mis en file d'attente.
Il est très simple à utiliser et très pratique pour de nombreuses utilisations, par exemple pour télécharger des trucs. Mais il a des limites qui peuvent vous donner envie d'utiliser à la place le service le plus basique (pas simple).
Par exemple, un service connecté à un serveur xmpp et lié par des activités ne peut pas être simplement effectué à l'aide d'un IntentService. Vous finirez par ignorer ou remplacer les éléments IntentService.
la source
IntentService
ne peut pas être utilisé pour l'écoute longue durée, comme pour les écouteurs XMPP, c'est un opérateur à temps unique, faites le travail et dites au revoir.De plus, il n'a qu'un seul threadworker, mais avec une astuce, vous pouvez l'utiliser comme illimité.
la source
La principale différence entre a
Service
et anIntentService
est décrite comme suit:Un service :
1.A
Service
par défaut, s'exécute sur le thread principal de l'application (ici, aucun thread de travail par défaut n'est disponible). L'utilisateur doit donc créer un thread séparé et effectuer le travail requis dans ce thread.2. autorise plusieurs demandes à la fois. (Multi Threading)
IntentService:
Maintenant, à venir
IntentService
ici, un thread de travail par défaut est disponible pour effectuer n'importe quelle opération. Notez que - Vous devez implémenteronHandleIntent()
méthode, qui reçoit l'intention pour chaque demande de démarrage, où vous pouvez effectuer le travail d'arrière-plan.2.Mais il n'autorise qu'une seule demande à la fois.
la source
Android IntentService vs Service
1.Service
2. IntentService
Référez-vous d' ici
la source