Question Service vs IntentService


Quelqu'un peut-il me montrer un exemple de quelque chose qui peut être fait avec un IntentService cela ne peut pas être fait avec Service (et vice versa)?

Je crois aussi qu'un IntentService fonctionne dans un fil différent et un Service ne fait pas. Donc, pour autant que je puisse voir, démarrer un service dans son propre fil, c'est comme démarrer un IntentService. N'est-ce pas?

J'apprécierais que quelqu'un puisse m'aider avec mes deux questions.


636
2018-03-20 13:00


origine


Réponses:


Tejas Lagvankar a écrit une belle poster à propos de ce sujet. Voici quelques différences clés entre Service et IntentService.

Quand utiliser?

  • le Un 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 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 Un service est déclenché par la méthode d'appel startService().

  • le IntentService est déclenché en utilisant un Intent, il engendre un nouveau thread de travail et la méthode onHandleIntent() est appelé sur ce fil.

Déclenché à partir de

  • le Un service et IntentService peut être déclenchée à partir de n'importe quel thread, activité ou autre composant d'application.

Fonctionne sur

  • le Un service fonctionne en arrière-plan, mais il fonctionne sur le thread principal de l'application.

  • le IntentService s'exécute sur un thread de travail distinct.

Limitations / Inconvénients

  • le Un service peut bloquer le fil 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 des messages pour le thread de travail et s'exécuteront séquentiellement.

Quand arrêter?

  • Si vous implémentez un 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 que toutes les demandes de démarrage ont été traitées, donc vous ne devez jamais appeler stopSelf().


1168
2018-04-02 18:57



Si quelqu'un peut me montrer un exemple de quelque chose que vous pouvez faire avec un service d'intention et ne peut pas être fait avec un service et l'inverse.

Par définition, c'est impossible. IntentService est une sous-classe de Service, écrit en code Java. Par conséquent, tout ce qu'un IntentService fait, un Service pourrait faire, en incluant les bits pertinents du code IntentService les usages.

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 IntentService sont:

  • le fil d'arrière-plan

  • la mise en file d'attente automatique de Intents livré à onStartCommand(), donc si l'un Intent est en cours de traitement par onHandleIntent() sur le fil de fond, d'autres commandes font la queue en attendant leur tour

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

Tout cela pourrait être mis en œuvre par un Servicesans extension IntentService.


134
2018-03-20 13:19



Un service

  • Invoquer par startService()
  • Déclenché à partir de Thread
  • Fonctionne sur Main Thread
  • Peut bloquer le thread principal (UI). Toujours utiliser le thread dans le service pour une longue tâche
  • Une fois la tâche terminée, il est de notre responsabilité d'arrêter le service en appelant stopSelf() ou stopService()

IntentService

  • Il effectue une longue tâche généralement pas de communication avec le thread principal si la communication est nécessaire, puis il est fait par Handler ou BroadcastReceiver
  • Invoquer via Intent
  • Déclenché à partir de Main Thread
  • Fonctionne sur le fil 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.

26
2018-05-19 04:47



Différences

  1. La classe de service utilise l'application main thread, tandis que IntentService crée un worker thread et utilise ce thread pour exécuter le service.
  2. IntentService crée une file d'attente qui transmet une intention à la fois onHandleIntent(). Ainsi, l'implémentation d'un multi-thread doit être faite en étendant directement la classe Service.
  3. La classe de service nécessite un arrêt manuel en utilisant 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 mises en file d'attente sont gérées.
  4. IntentService implémente onBind() qui renvoie null. Cela signifie que IntentService ne peut pas être lié par défaut.
  5. IntentService implémente onStartCommand() cela envoie Intention à la file d'attente et à onHandleIntent ().

20
2017-09-28 10:49



Ajouter des points à la réponse acceptée:

Voir l'utilisation d'IntentService avec 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 redéfinit onHandleIntent ().

Voir aussi le code source de l'IntentService, ses méthodes consutructor et 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 ensemble un AsyncTask est l'une des meilleures approches pour de nombreux   Usecases où la charge utile n'est pas énorme. ou créez simplement une classe   étendre IntentSerivce. De la version Android 4.0 tout le réseau   les opérations doivent être en arrière-plan, sinon l'application compile / build échoue.   thread 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 d'informations sur ce sujet, consultez le blog

de Guide des développeurs Android:

IntentService est une classe de base pour les services qui gèrent des requêtes asynchrones (exprimées en intentions) à la demande. Les clients envoient des demandes via les 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 automatiquement lorsqu'il est à court de travail.

Motif de conception utilisé dans IntentService

: Ce modèle de "processeur de file d'attente de travail" est généralement utilisé pour décharger des 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 selon le cas.

Toutes les demandes sont traitées sur un thread de travail unique - elles peuvent prendre autant de temps que nécessaire (et ne bloquera 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 thread d'arrière-plan unique. 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, il continue donc à s'exécuter dans des circonstances qui ferment 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 séquentiellement. Si une opération est en cours dans un IntentService et que vous lui envoyez une autre requête, la requête attend jusqu'à la fin de la première opération. Une opération s'exécutant sur un IntentService ne peut pas être interrompue. Cependant, dans la plupart des cas

IntentService est le moyen privilégié pour les opérations en arrière-plan simples

**

Volley Library

Il y a une bibliothèque appelée volley-bibliothèque pour le développement d'applications de réseau Android Le code source est disponible pour public dans github.

La documentation officielle android pour Meilleures pratiques pour les travaux d'arrière-plan: aide à mieux comprendre le service d'intention, le thread, le gestionnaire, le service. et aussi Effectuer des opérations réseau


10
2018-01-02 12:22



Je suis sûr que vous pouvez trouver une longue liste de différences en tapant 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 que c'est fait.

Quelques exemples (rapidement inventés) pourraient être;

IntentService: Si vous voulez télécharger un tas d'images au début de l'ouverture de votre application. C'est un processus ponctuel 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 le back-end avec des appels API Web. Même s'il est terminé avec sa tâche actuelle, vous voulez toujours qu'il soit environ quelques minutes plus tard, pour plus de communication.


9
2018-03-20 13:03



IntentService

IntentService fonctionne sur son propre thread. Il s'arrêtera quand c'est fait. Plus comme le feu et oublier. Les appels suivants seront mis en file d'attente. Bon pour mettre en attente des appels. Vous pouvez également faire tourner plusieurs threads dans IntentServiceSi vous avez besoin de - 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 est juste un fil. Vous pouvez faire tout ce dont vous avez besoin à l'intérieur même de filer plusieurs threads. Seul bémol est que IntentService est fini dès que vous faites tourner ces multiples threads. Il n'attend pas que ces threads reviennent. Vous devez prendre soin de cela. Donc je recommande d'utiliser ThreadPoolExecutor dans ces scénarios.

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

Un service

Par défaut Service fonctionne sur le fil principal. Vous devez créer un fil de travail pour faire votre travail. Tu as besoin d'arrêter service explicitement. Je l'ai utilisé pour la 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 nécessaire.
  • Peut être utilisé pour des applications comme les lecteurs de musique.

Vous pouvez toujours communiquer avec votre activité en utilisant BroadcastReceivers Si tu as besoin de.


8
2017-07-19 15:51



Un IntentService est une extension d'un Service qui est fait 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 fait, 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 choses. 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 fait en utilisant un IntentService. Vous finirez par ignorer ou remplacer les contenus IntentService.


7
2018-03-20 13:20



Si quelqu'un peut me montrer un exemple de quelque chose que vous pouvez faire avec un IntentService et ne peut être fait avec un service et l'inverse.

IntentService ne peut pas être utilisé pour l'écoute longue durée, comme pour les auditeurs XMPP, c'est un opérateur unique, faire le travail et saluer au revoir.

En outre, il n'a qu'un seul threadworker, mais avec un tour, vous pouvez l'utiliser comme illimité.


4
2018-06-22 23:57



Ne réinventez pas la roue

IntentService s'étend Un service classe qui signifie clairement que IntentService est intentionnellement fait pour même objectif.

Alors, quel est le but?

IntentServiceSon but est de rendre notre travail plus facile pour exécuter des tâches en arrière-plan sans même se soucier de

  • Création du fil de travail

  • Mettre en file d'attente la demande multiple de traitement un par un (Threading)

  • Détruire le Service

Alors NON, Service peut faire n'importe quelle tâche qu'un IntentService ferait. Si vos exigences répondent aux critères mentionnés ci-dessus, vous n'avez pas besoin d'écrire ces logiques Service classe. Donc, ne réinventez pas la roue parce que IntentService est la roue inventée.

La différence "Main"

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

Comment IntentService est fait en Service

Un service normal s'exécute sur le thread UI (tout type de composant Android s'exécute sur le thread UI par défaut, 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 faire face à synchronization. IntentService est donné une implémentation par défaut qui fait ces tâches pour vous.
Selon page développeur

  1. IntentService crée un fil de travail

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

  3. Quand il n'y a pas de travail alors IntentService appels stopSelf() méthode
  4. Fournit l'implémentation par défaut pour onBind() méthode qui est nulle
  5. Implémentation par défaut pour onStartCommand() qui envoie Intent demande à WorkQueue et éventuellement à onHandleIntent()

4
2017-11-04 11:19