web-dev-qa-db-fra.com

Service vs IntentService

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.

741
roiberg

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

  • Les services et IntentService peuvent être déclenchés à partir de tout thread, activité ou autre composant d'application.

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

1306

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 un Service 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 Intents 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.

156
CommonsWare

Service

  • Invoquer par startService()
  • Déclenchée depuis n'importe quel Thread
  • Fonctionne sur Main Thread
  • Peut bloquer le thread principal (UI). Toujours utiliser le fil 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() ou stopService().

IntentService

  • Il effectue une tâche longue, généralement pas de communication avec le thread principal si la communication est nécessaire, elle est effectuée 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.
37
Umang Kothari

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

15
Sree Rama

Ne réinventez pas la roue

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)

  • Détruire le 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.

La différence "principale"

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

Quand utilisez-vous IntentService?

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.

Comment 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

  1. IntentService crée un fil de travail

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

  3. Quand il n'y a pas de travail, alors IntentService appelle la méthode stopSelf()
  4. Fournit l'implémentation par défaut de la méthode onBind() qui est null
  5. Implémentation par défaut pour onStartCommand() qui envoie la requête Intent à WorkQueue et éventuellement à onHandleIntent()
13
Rohit Singh

IntentService

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

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

Un service

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

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

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

12
Sayooj Valsan

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.

12
Stefan de Bruijn

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.

8
njzk2

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 un service 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.

5
user3764748

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.

4
Narendrakumar