Service vs IntentService dans la plateforme Android

774

Je cherche un exemple de quelque chose qui peut être fait avec un IntentServicequi ne peut pas être fait avec un Service(et vice-versa)?

Je crois également qu'un an IntentServices'exécute dans un thread différent et un Servicenon. Donc, pour autant que je puisse voir, démarrer un service dans son propre thread est comme démarrer un IntentService. Est-ce exact?

roiberg
la source
45
IntentService is used for short tasks (etc) and a service is for long onesoù avez-vous lu cela?
njzk2
9
Aussi, je vous suggère de lire le code source d'IntentService. Cela montre clairement ce que c'est et ce qu'il fait.
njzk2
1
J'ai modifié ma question après vous avoir vu commenter.
roiberg
2
Le lien dans le commentaire précédent (par greg7gkb) est une excellente lecture.
DSlomer64

Réponses:

1349

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

  • Le Service et IntentService peuvent être déclenchés à partir de n'importe quel thread, activité ou autre composant d'application.

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()ou stopService(). (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().

José Juan Sánchez
la source
11
court et doux, mais c'est mieux si vous modifiez votre réponse, y compris les points par CommonsWare, car beaucoup de gens ne lisent que les réponses acceptées ou les plus appréciées
Shirish Herwade
12
@Darpan A Service est un composant d'application qui peut effectuer des opérations de longue durée en arrière-plan et ne fournit pas d'interface utilisateur. Un service s'exécute dans le thread principal de son processus d'hébergement. Le service ne crée pas son propre thread et ne s'exécute pas dans un processus distinct (sauf indication contraire). Cela signifie que, si votre service doit effectuer des travaux gourmands en processeur ou des opérations de blocage (telles que la lecture MP3 ou la mise en réseau), vous devez créer un nouveau thread dans le service pour effectuer ce travail.
José Juan Sánchez
8
"L'IntentService doit être déclenché à partir du thread principal." Êtes-vous sûr? Dans mon MainActivity onCreate (), lorsque j'appelle un IntentService à partir d'un nouveau thread (code ci-dessous), cela fonctionne toujours pour moi. new Thread (new Runnable () {@Override public void run () {Intent intention = new Intent (context, HelloIntentService.class); startService (intention);}}). start ();
Ashok Bijoy Debnath
9
@AshokBijoyDebnath Vous avez raison! Les services et IntentServices peuvent être démarrés à partir de n'importe quel thread, activité ou autre composant d'application. Je viens de modifier le texte de la réponse pour résoudre ce problème. Merci pour votre suggestion de modification! :)
José Juan Sánchez
2
Pas de problème, foncez!
José Juan Sánchez
165

Si quelqu'un peut me montrer un exemple de quelque chose qui peut être fait avec un IntentServiceet ne peut pas être fait avec un Serviceet inversement.

Par définition, c'est impossible. IntentServiceest une sous-classe de Service, écrite en Java. Par conséquent, tout ce que IntentServicefait, Servicepourrait faire, en incluant les bits de code pertinents qui IntentServiceutilisent.

Démarrer un service avec son propre thread, c'est comme démarrer un IntentService. N'est-ce pas?

Les trois principales caractéristiques d'un IntentServicesont:

  • le fil de fond

  • la mise en file d'attente automatique des Intents livrés à onStartCommand(), donc si l'un Intentest en cours de traitement par onHandleIntent()sur le thread d'arrière-plan, d'autres commandes font la queue en attendant leur tour

  • l'arrêt automatique du IntentService, via un appel à stopSelf(), une fois la file d'attente vide

Tout cela pourrait être mis en œuvre par un Servicesans s'étendre IntentService.

CommonsWare
la source
6
Un peu tard, mais je constate que l' Serviceappel avec startServicene peut fonctionner que pendant environ 10 secondes avant de lancer un ANR - un IntentServicedébut de diffusion d'une intention ne semble pas avoir cette limitation
troisième
16
@edthethird: C'est parce que vous étiez en train de bloquer le thread principal de l'application. Toutes les méthodes de cycle de vie sur tous les composants, y compris onStartCommand()a Service, 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.
CommonsWare
3
ouais j'ai commenté trop tôt. Je faisais le travail onStartCommandau lieu de onHandleIntent- on dirait qu'il onStartCommandest exécuté sur le thread d'interface utilisateur, mais un thread séparé est généré pour l' onHandleIntentexécution.
troisième
3
@IgorGanapolsky: IntentServiceappelle cela lui-même, après les onHandleIntent()retours, s'il n'y a plus de travail à faire.
CommonsWare
1
Le problème n'est pas l'anglais, mais la programmation. Par exemple, "j'ai FERMÉ l'application" n'a pas de définition précise, donc je ne peux pas vous dire ce qui se passe quand cela se produit. Je ne sais pas non plus comment "j'ai FERMÉ l'application" se rapporte à "se téléchargera après 1 heure". Vous pourriez envisager de poser une question distincte sur le débordement de la pile, où vous pouvez fournir un exemple reproductible minimal de «téléchargement après 1 heure». Là, vous pouvez expliquer en détail ce que signifie «j'ai FERMÉ l'application» (par exemple, que fait spécifiquement l'utilisateur pour fermer l'application?).
CommonsWare
39

Un service

  • Invoquer par startService()
  • Déclenché à partir de tout Thread
  • Fonctionne sur Main Thread
  • Peut bloquer le thread principal (UI). Utilisez toujours le thread dans le service pour les tâches longues
  • Une fois la tâche terminée, il est de notre responsabilité d'arrêter le service en appelant stopSelf()oustopService()

IntentService

  • Il effectue une tâche longue, généralement aucune communication avec le thread principal si la communication est nécessaire, elle est effectuée par HandlerouBroadcastReceiver
  • Appeler via Intent
  • Déclenché à partir de Main Thread
  • Fonctionne sur le thread séparé
  • Impossible d'exécuter la tâche en parallèle et plusieurs intentions sont mises en file d'attente sur le même thread de travail.
Umang Kothari
la source
19

Ne réinventez pas la roue

IntentService étend le service classe de , ce qui signifie clairement qu'elle IntentServiceest 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 )

  • Détruire le Service

Donc NON , Servicepeut faire n'importe quelle tâche qui le IntentServiceferait. 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 car IntentServicec'est la roue inventée.

La différence "principale"

Le service s'exécute sur le thread d'interface utilisateur tandis qu'un IntentService s'exécute sur un thread distinct

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 IntentServicec'est parfait.

Comment IntentServiceest 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 exemple BroadcastReceiver, ContentProvideret Service). 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 traiter synchronization. IntentServicereçoit une implémentation par défaut qui effectue ces tâches pour vous.
Selon la page du développeur

  1. IntentService crée un fil de travail

  2. IntentServicecrée une file d'attente de travail qui envoie une requête à la onHandleIntent()méthode une par une

  3. Quand il n'y a pas de travail alors IntentServiceappellestopSelf() méthode
  4. Fournit une implémentation par défaut pour une onBind()méthode qui est nulle
  5. Implémentation par défaut pour onStartCommand()laquelle envoie la Intentdemande à WorkQueue et éventuellement àonHandleIntent()
Rohit Singh
la source
15

Ajout de 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, 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 ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

Entretenir ensemble une AsyncTask est l'une des meilleures approches pour de nombreux cas d'utilisation où la charge utile n'est pas énorme. ou créez simplement une classe étendant IntentSerivce. À partir d'Android version 4.0, toutes les opérations réseau doivent être en arrière-plan, sinon la compilation / génération de l'application échoue. thread séparé de l'interface utilisateur. La classe AsyncTask fournit l'un des moyens les plus simples de lancer une nouvelle tâche à partir du thread d'interface utilisateur. Pour plus de discussion sur ce sujet, voir le billet de blog

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.

Modèle de conception utilisé dans IntentService

: 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

IntentService est le moyen préféré d'effectuer de simples opérations en arrière-plan

**

Bibliothèque Volley

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

Sree Rama
la source
1
Il pourrait être préférable, si vous pouviez donner une réponse courte, jusqu'à la réponse.
eRaisedToX
12

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.

Stefan de Bruijn
la source
2
Je n'ai pas trouvé d'exemple qui puisse se faire avec l'un et pas avec l'autre. juste quelques explications qui ne m'ont pas aidé.
roiberg
1
Essayez ce site, il a beaucoup de bonnes explications sur les concepts de base d'Android avec des exemples décents vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn
4
C'est un autre exemple de "comment utiliser". pas lorsque vous utilisez spécifiquement le service et lorsque l'intentservice. Veuillez me donner un exemple théorique et non des liens vers "comment utiliser" ou tout autre likns pour ce compteur. Je ne vous demande pas de "travailler" pour moi pendant que je ne fais rien, c'est juste que j'ai déjà vu tous ces goûts et que je ne suis toujours pas sûr.
roiberg
5
c'est une différence assez importante. par exemple, si vous utilisez le service pour maintenir une connexion persistante avec le serveur, vous ne pouvez pas utiliser intentservice pour cela car il se termine juste après avoir terminé toutes ses tâches
pelotasplus
24
quand je google ça, ça m'amène ici. maintenant je suis dans une boucle infinie.
Lou Morda
12

IntentService

IntentServices'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 threads IntentServicesi vous en avez besoin. Vous pouvez y parvenir en utilisant ThreadPoolExecutor. Je dis cela parce que beaucoup de gens m'ont demandé "pourquoi l'utiliser IntentServicecar il ne prend pas en charge l'exécution parallèle". IntentServicen'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 se IntentServicetermine 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'utiliser ThreadPoolExecutordans ces scénarios.

  • Bon pour la synchronisation, le téléchargement, etc.…

Un service

Par défaut Services'exécute sur le thread principal. Vous devez faire tourner un fil de travail pour faire votre travail. Vous devez vous arrêter serviceexplicitement. 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 Headless service.

  • Encore une fois, vous pouvez exécuter plusieurs threads si vous en avez besoin.
  • Peut être utilisé pour des applications comme des lecteurs de musique.

Vous pouvez toujours communiquer avec votre activité en utilisant BroadcastReceiverssi vous en avez besoin.

Sayooj Valsan
la source
8

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.

njzk2
la source
ce qui semble est que la plupart des gens qui veulent exécuter un service de longue durée en arrière-plan finissent par essayer de trouver des informations sur IntentService parce que les documents donnent l'impression que c'est pour cela, mais vous pourriez surtout être aussi bien en utilisant un nouveau Thread (nouveau Runnable ()). start (). en d'autres termes, quand il parle de "générer un nouveau thread" c'est tout ce qu'il fait, il ne le déplace pas vers un processus séparé qui est en fait ce que la plupart des gens cherchent à faire lorsqu'ils veulent séparer du code en cours d'exécution de l'activité ! (parce que le fait de reproduire des fils est de toute façon un liner)
Lassi Kinnunen
l'intentionService prend également en charge le cycle de vie du thread et utilise un looper, qui aide le planificateur. Il s'assure également qu'une seule instance est en cours d'exécution et met en file d'attente les autres appels.
njzk2
5

Si quelqu'un peut me montrer un exemple de quelque chose, vous pouvez en finir avec un IntentServiceet ne pas le faire avec un serviceet inversement.

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é.

user3764748
la source
4

La principale différence entre a Serviceet an IntentServiceest 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 IntentServiceici, 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.

Narendrakumar
la source
3

Android IntentService vs Service

1.Service

  • Un service est appelé à l'aide de startService ().
  • Un service peut être appelé à partir de n'importe quel thread.
  • Par défaut, un service exécute des opérations en arrière-plan sur le thread principal de l'application. Par conséquent, il peut bloquer l'interface utilisateur de votre application.
  • Un service appelé plusieurs fois créerait plusieurs instances.
  • Un service doit être arrêté à l'aide de stopSelf () ou stopService ().
  • Le service Android peut exécuter des opérations parallèles.

2. IntentService

  • Un IntentService est appelé à l'aide d'Intent.
  • Un IntentService ne peut être invoqué qu'à partir du thread principal.
  • Un IntentService crée un thread de travail distinct pour exécuter les opérations en arrière-plan.
  • Un IntentService appelé plusieurs fois ne créera pas plusieurs instances.
  • Un IntentService s'arrête automatiquement une fois la file d'attente terminée. Pas besoin de déclencher stopService () ou stopSelf ().
  • Dans un IntentService, plusieurs appels d'intention sont automatiquement mis en file d'attente et ils seront exécutés séquentiellement.
  • Un IntentService ne peut pas exécuter une opération parallèle comme un service.

Référez-vous d' ici

Deepak gupta
la source