Quelqu'un peut-il me montrer un exemple de ce 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
s'exécute dans un autre thread et un Service
pas. Donc, autant que je sache, démarrer un service dans son propre thread revient à lancer un IntentService
. N'est-ce pas?
J'apprécierais que quelqu'un puisse m'aider avec mes deux questions.
Tejas Lagvankar a écrit un Nice post sur ce sujet. Vous trouverez ci-dessous 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 service IntentService peut être utilisé dans les tâches longues, généralement sans communication avec le thread principal. Si une communication est requise, vous pouvez utiliser le gestionnaire de thread principal ou les intentions de diffusion. Un autre cas d'utilisation est lorsque des rappels sont nécessaires (tâches déclenchées par l'intention).
Comment déclencher?
Le service est déclenché par l'appel de la méthode startService()
.
Le service IntentService est déclenché par une intention, il génère un nouveau thread de travail et la méthode onHandleIntent()
est appelée sur ce thread.
Déclenché depuis
Fonctionne sur
Le service s'exécute en arrière-plan mais sur le thread principal de l'application.
Le service IntentService s'exécute sur un thread de travail distinct.
Limitations/Inconvénients
Le service peut bloquer le thread principal de l'application.
L'intentService ne peut pas exécuter de tâches en parallèle. Par conséquent, toutes les intentions consécutives iront dans la file de messages du thread de travail et s'exécuteront de manière séquentielle.
Quand arrêter?
Si vous implémentez un service , il vous incombe d'arrêter le service une fois son travail terminé, en appelant stopSelf()
ou stopService()
. (Si vous souhaitez uniquement fournir une liaison, vous n'avez pas besoin d'implémenter cette méthode).
Le service IntentService arrête le service une fois que toutes les demandes de démarrage ont été traitées. Vous n'avez donc jamais à appeler stopSelf()
.
Si quelqu'un peut me montrer un exemple de quelque chose qui peut être fait avec un
IntentService
et ne peut pas être fait avec unService
et vice-versa.
Par définition, c'est impossible. IntentService
est une sous-classe de Service
, écrite en Java. Par conséquent, tout ce qu'un IntentService
puisse faire, un Service
pourrait le faire en incluant les bits de code pertinents que IntentService
utilise.
Démarrer un service avec son propre thread est comme démarrer un IntentService. N'est-ce pas?
Les trois caractéristiques principales d'un IntentService
sont:
le fil de fond
la mise en file d'attente automatique de Intent
s remise à onStartCommand()
, donc si un Intent
est en cours de traitement par onHandleIntent()
sur le thread d'arrière-plan, d'autres commandes sont mises en file d'attente et attendent leur tour
l'arrêt automatique de la IntentService
, via un appel à stopSelf()
, une fois la file d'attente vide
Tout cela pourrait être implémenté par un Service
sans prolonger IntentService
.
Service
startService()
Thread
Main Thread
stopSelf()
ou stopService()
.IntentService
Handler
ou BroadcastReceiver
Intent
Main Thread
Ajout de points à la réponse acceptée:
Voir l'utilisation d'IntentService dans Android API. 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 définissez, à l'intérieur de celle-ci, une méthode qui substitue onHandleIntent ().
Voir aussi le code source de IntentService, son constructeur et ses 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;
}
Servir ensemble une AsyncTask est l'une des meilleures approches pour de nombreux cas d'utilisation où la charge utile n'est pas énorme. ou simplement créer une classe prolongeant IntentSerivce. À partir de Android version 4.0, toutes les opérations réseau doivent être en arrière-plan, sinon la compilation/création de l'application échoue. fil séparé de l'interface utilisateur. La classe AsyncTask fournit l'un des moyens les plus simples de déclencher une nouvelle tâche à partir du thread d'interface utilisateur. Pour plus de discussion sur ce sujet, voir l'article du blog
à partir de Guide du développeur Android :
IntentService est une classe de base pour les services qui gèrent les demandes asynchrones (exprimées en tant qu'intentions) à la demande. Les clients envoient des demandes via des appels startService (Intent); le service est démarré en fonction des besoins, gère chaque intention à son tour, à l'aide d'un thread de travail, et s'arrête lui-même lorsqu'il manque de travail.
Modèle de conception utilisé dans IntentService
Remarque: Ce modèle "processeur de file d’attente de travail" est couramment utilisé pour décharger des tâches du thread principal d’une application. La classe IntentService existe pour simplifier ce modèle et prendre en charge les mécanismes. Pour l'utiliser, développez IntentService et implémentez onHandleIntent (Intent). IntentService recevra les intentions, lancera un thread de travail et arrêtera le service selon le cas.
Toutes les demandes sont traitées sur un seul thread de travail - elles peuvent prendre aussi longtemps que nécessaire (sans bloquer 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 en 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 service IntentService n'est pas affecté par la plupart des événements de cycle de vie d'interface utilisateur. Il continue donc à s'exécuter dans des circonstances susceptibles de fermer une tâche asynchrone.
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 manière séquentielle. Si une opération est en cours d'exécution dans un service IntentService et que vous lui envoyez une autre demande, celle-ci attend jusqu'à la fin de la première opération. Une opération exécutée sur un service IntentService ne peut pas être interrompue. Cependant, dans la plupart des cas
IntentService est le moyen préféré pour les opérations en arrière-plan simples
**
Volley Library
Il y a la bibliothèque appelée volley-bibliothèque pour développer Android applications résea Le code source est disponible pour le public dans GitHub.
La documentation officielle de Android pour Meilleures pratiques pour les tâches en arrière-plan : permet de mieux comprendre le service intentionnel, le thread, le gestionnaire et le service. et aussi Performing Network Operations
IntentService étend Service la classe qui signifie clairement que IntentService
est intentionnellement créé pour identique objectif.
Quel est l'objectif?
`IntentService a pour but de rendre notre travail plus facile à exécuter des tâches en arrière-plan sans même vous soucier de
Création de thread ouvrier
Mise en file d'attente du traitement des demandes multiples une à une (Threading
)
Service
Ainsi, NO, Service
ne peut effectuer aucune tâche qu'une IntentService
ferait. Si vos exigences répondent aux critères susmentionnés, vous n'avez pas à écrire ces logiques dans la classe Service
. Donc, ne réinventez pas la roue car IntentService
est la roue inventée.
Le service s'exécute sur le thread d'interface utilisateur alors qu'un IntentService s'exécute sur un thread séparé
Lorsque vous souhaitez effectuer plusieurs tâches en arrière-plan une par une qui existent au-delà de la portée d'une activité, la variable IntentService
est parfaite.
IntentService
est fabriqué à partir de Service
Un service normal s'exécute sur le thread d'interface utilisateur (tout type de composant Android s'exécute par défaut sur un thread d'interface utilisateur, par exemple Activity
, BroadcastReceiver
, ContentProvider
et Service
) . Si vous devez effectuer un travail qui peut prendre un certain temps, vous devez créer un fil de discussion. En cas de demandes multiples, vous devrez traiter synchronization
. IntentService
est doté d'une implémentation par défaut qui effectue ces tâches pour vous.
Selon page du développeur
IntentService
crée un fil de travail
IntentService
crée une file d'attente de travail qui envoie une requête à la méthode onHandleIntent()
une par une
IntentService
appelle la méthode stopSelf()
onBind()
qui est nullonStartCommand()
qui envoie la requête Intent
à WorkQueue et éventuellement à onHandleIntent()
IntentService
fonctionne sur son propre thread. Ça va s'arrêter quand c'est fait. Plus comme le feu et oublie. Les appels suivants seront mis en file d'attente. Bon pour les appels en file d'attente. Vous pouvez également faire tourner plusieurs threads dans IntentService
si vous en avez besoin. Vous pouvez y parvenir 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 tout ce dont vous avez besoin à l'intérieur, même en faisant tourner plusieurs fils. Le seul inconvénient est que IntentService
se termine dès que vous faites tourner ces multiples threads. Il n'attend pas que ces discussions reviennent. Vous devez prendre soin de cela. Je recommande donc d'utiliser ThreadPoolExecutor
dans ces scénarios.
Par défaut, Service
s'exécute sur le thread principal. Vous devez faire tourner un thread de travail pour faire votre travail. Vous devez arrêter service
explicitement. Je l'ai utilisé pour une situation où vous devez exécuter des tâches en arrière-plan, même lorsque vous vous éloignez de votre application et que vous revenez plus souvent pour un service
sans tête _.
Vous pouvez toujours communiquer avec votre activité en utilisant BroadcastReceivers
si vous en avez besoin.
Je suis sûr que vous pouvez trouver une longue liste de différences en recherchant simplement quelque chose comme "Android IntentService vs Service".
L'une des différences les plus importantes par exemple est qu'IntentService se termine une fois que c'est fait.
Quelques exemples (rapidement constitués) pourraient être:
IntentService: Si vous souhaitez télécharger plusieurs 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 utilisé en permanence pour la communication entre votre application et le back-end avec des appels d'API Web. Même si la tâche en cours est terminée, vous souhaitez tout de même que celle-ci soit distribuée quelques minutes plus tard, pour davantage de communication.
Un service Intent est une extension d'un service conçue pour faciliter l'exécution d'une tâche devant ê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 fait, ça nettoie tout. Une seule instance d'IntentService peut être exécutée simultanément, plusieurs appels sont mis en file d'attente.
Il est très simple à utiliser et très pratique pour de nombreuses utilisations, par exemple le téléchargement de fichiers. Mais il a des limitations qui peuvent vous inciter à utiliser plutôt le service de base (pas simple).
Par exemple, un service connecté à un serveur xmpp et lié à des activités ne peut pas être simplement créé à l'aide d'un IntentService. Vous finirez par ignorer ou remplacer les éléments IntentService.
Si quelqu'un peut me montrer un exemple de quelque chose que vous pouvez faire avec un
IntentService
et qui ne peut pas être fait avec unservice
et vice-versa.
IntentService
ne peut pas être utilisé pour l'écoute longue durée, comme pour les auditeurs XMPP, c'est un opérateur unique qui fait le travail et fait ses adieux.
En outre, il ne dispose que d’un seul threadworker, mais avec une astuce, vous pouvez l’utiliser de manière illimitée.
La différence majeure entre une Service
et une IntentService
est décrite comme suit:
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). Par conséquent, l'utilisateur doit créer un thread séparé et effectuer le travail requis dans ce thread.
2. Permet plusieurs demandes à la fois. (Multi Threading)
IntentService:
1.Maintenant, pour arriver à IntentService
, un thread de travail par défaut est disponible pour effectuer toute opération. Notez que - Vous devez implémenter la méthode onHandleIntent()
, qui reçoit l'intention de chaque demande de démarrage, où vous pouvez effectuer le travail en arrière-plan.
2.Mais il n'autorise qu'une demande à la fois.