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.

651
demandé sur Jared Rummler 2013-03-20 17:00:26

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

1197
répondu José Juan Sánchez 2014-12-04 09:31:15

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 un Intent est en cours de traitement par onHandleIntent() 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 .

137
répondu CommonsWare 2014-04-04 22:18:19

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

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 ou BroadcastReceiver
  • 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.
28
répondu Umang Kothari 2018-04-16 10:54:37

différences

La classe de Service
  1. utilise le filetage main de L'application, tandis Qu'IntentService crée un filetage worker et utilise ce fil pour exécuter le service.

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

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

  4. IntentService mise en œuvre des onBind() qui renvoie la valeur null. Cela signifie que IntentService ne peut pas être lié par défaut.

  5. IntentService mise en œuvre des onStartCommand() qui envoie l'Intention de file d'attente et de onHandleIntent().
21
répondu varun 2016-09-05 11:28:08

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

11
répondu Sree Rama 2018-08-30 07:32:06

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.

10
répondu Stefan de Bruijn 2013-03-20 13:14:06

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.

9
répondu Sayooj Valsan 2018-08-28 10:14:43

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.

8
répondu njzk2 2013-03-20 13:20:30

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

5
répondu user3764748 2016-02-02 11:15:39

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

  1. IntentService crée un travailleur Filetage

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

  3. quand il n'y a pas de travail alors IntentService appelle stopSelf() méthode
  4. fournit l'implémentation par défaut pour la méthode onBind() qui est nulle
  5. implementation par défaut pour onStartCommand() qui envoie Intent demande de WorkQueue et éventuellement à onHandleIntent()
5
répondu Rohit Singh 2018-08-28 11:58:02

principale différence:

  1. Service la classe a besoin d'un arrêt manuel avec stopSelf() . Pendant ce temps, IntentService s'arrête automatiquement quand il n'y a pas d'intention dans la file d'attente.

  2. 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 dans Service .

4
répondu Arpana 2018-04-16 10:57:00

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.

3
répondu Narendrakumar 2018-04-16 10:57:44