web-dev-qa-db-fra.com

Pourquoi utiliser le service s'il s'exécute dans le même thread dans android

Je passais par Bound Service in Android Website développeur. Je pensais que je comprenais assez le service mais je viens de trouver un autre moyen de connecter le service à l'aide d'un Messenger classe spécialement pour le service local. Là je me suis trompé. Peut-être que j'ai mal compris le concept.

Voici ma compréhension de Android Service . Vous créez un service lorsque

  1. Vous souhaitez effectuer des tâches distinctes en arrière-plan .
  2. Vous voulez en faire un processus distinct.
  3. Vous souhaitez le faire fonctionner dans un cycle de vie indépendant du composant qui l'a démarré.

La confusion est le premier élément de la liste, la définition de l'arrière-plan. L'arrière-plan n'est-il pas un fil conducteur ou un processus? Je n'ai jamais pensé qu'il puisse fonctionner sur le thread principal.

Voici la prudence du service dans les pages de développement sur.

Attention : 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 si vous spécifiez le 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. En utilisant un thread séparé, vous réduirez le risque d'erreurs d'application ne répondant pas (ANR) et le thread principal de l'application peut rester dédié à l'interaction de l'utilisateur avec vos activités.

Des questions

  1. Pourquoi choisit-on d'utiliser le service si la fonction de service s'exécutera de toute façon sur le thread principal?
  2. Devons-nous écrire un service uniquement pour bloquer ANR même si le travail fastidieux est effectué dans le thread principal? Supposons que le service est uniquement pour mon application.
  3. Existe-t-il des cas pratiques ou des raisons d'utiliser un service comme privé et fonctionnant dans le même thread?
29
Jaekwan

Le thread principal de l'application n'est pas toujours le thread de l'interface utilisateur. Par exemple, lorsque Activity est arrêté, la onStop() est invoquée, d'où le thread d'interface utilisateur est retiré de cette Activity et déplacé vers une autre activité dans la même ou une autre application. Cependant, cela ne signifie pas que l'application n'est plus active, elle peut continuer à fonctionner en arrière-plan jusqu'à ce qu'elle soit fermée par le système d'exploitation ou par l'utilisateur. Alors, qui le fait fonctionner en arrière-plan? Il s'agit du thread principal et non du thread d'interface utilisateur.

Quels sont les services

Dans Android, un service est un composant d'application qui peut effectuer des opérations de longue durée en arrière-plan sur le thread d'interface utilisateur. En arrière-plan, cela signifie qu'il n'a pas d'interface utilisateur. Un service s'exécute par défaut sur le thread principal du processus du composant appelant (et peut donc dégrader la réactivité et provoquer des ANR), vous devez donc créer un nouveau thread pour effectuer des opérations de longue durée. Un service peut également être configuré pour s'exécuter dans un processus complètement différent.

Contrairement aux composants d'activité, les services n'ont pas d'interface graphique. Les récepteurs de diffusion sont également destinés à recevoir des messages de diffusion (diffusion, multidiffusion, unicast) et à effectuer de courtes tâches, tandis que les services sont destinés à effectuer un traitement long comme la musique en streaming, les transactions réseau, les E/S de fichiers, interagir avec les bases de données, etc. Lors du démarrage d'un service par un composant d'application comme une activité, il s'exécute en arrière-plan et continue de fonctionner même si l'utilisateur passe à une autre application ou si le composant de départ est lui-même détruit

Pourquoi utiliser le service

Les services ont une priorité plus élevée que les autres processus d'arrière-plan et il est donc moins probable que Android y mettra fin. Bien qu'il puisse être configuré pour redémarrer une fois qu'il y aura à nouveau suffisamment de ressources disponibles. Vous devriez parcourir les différents processus et leur niveau de priorité/important dans la documentation sur les processus et les threads. Leur attribuer la même priorité que les activités de premier plan est définitivement possible, auquel cas il faudra avoir une notification visible active (généralement utilisée pour les services jouant de la musique).

Utilisez IntentService si vous ne voulez pas vous débrouiller seul avec la gestion des threads. Sinon, utilisez AsyncTasks.

Veuillez lire cet excellent article pour comprendre plus en détail et aussi lire cette réponse .

33
Samvid Kulkarni