Comparaison d'un service de classe de base local, en cours de traitement ✱ à un AsyncTask:
✱ (Cette réponse ne concerne pas les services exportés, ni aucun service qui s'exécute dans un processus différent de celui du client, car les cas d'utilisation attendus diffèrent considérablement de ceux d'un AsyncTask. Aussi, dans un souci de concision, la nature de certains Servicesous - classes (par exemple IntentService, JobService) seront ignorées ici.)
Durée de vie du processus
A Servicereprésente, pour l'OS, "le désir d'une application d'effectuer une opération de plus longue durée sans interagir avec l'utilisateur" [ ref ].
Pendant que vous Serviceexécutez, Android comprend que vous ne voulez pas que votre processus soit tué. Cela est également vrai chaque fois que vous avez un Activityécran, et cela est particulièrement vrai lorsque vous exécutez un service de premier plan . (Lorsque tous les composants de votre application disparaissent, Android pense: "Oh, c'est le bon moment pour tuer cette application, afin que je puisse libérer des ressources".)
En outre, en fonction de la dernière valeur de retour de Service.onCreate(), Android peut tenter de "relancer" les applications / services qui ont été tués en raison de la pression des ressources [ ref ].
AsyncTasksne faites rien de tout cela. Peu importe le nombre de threads d'arrière-plan que vous exécutez ou leur travail: Android ne maintiendra pas votre application en vie simplement parce que votre application utilise le processeur. Il doit avoir un moyen de savoir que votre application a encore du travail à faire; c'est pourquoi Servicessont enregistrés avec le système d'exploitation et AsyncTasksne le sont pas.
Multithreading
AsyncTasks il s'agit de créer un thread d'arrière-plan sur lequel effectuer le travail, puis de présenter le résultat de ce travail au thread d'interface utilisateur de manière threadsafe.
Chaque nouvelle AsyncTaskexécution entraîne généralement plus de concurrence (plus de threads), sous réserve des limitations du AsyncTasks'sthread-pool [ ref ].
Serviceles méthodes, en revanche, sont toujours appelées sur le thread d'interface utilisateur [ ref ]. Cela vaut à onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), etc. Donc, dans un certain sens, Servicesne le font pas « run » en arrière - plan. Une fois qu'ils ont démarré ( onCreate()), ils sont simplement "assis" là - jusqu'à ce qu'il soit temps de nettoyer, d'exécuter un onStartCommand(), etc.
En d'autres termes, l'ajout supplémentaire Servicesn'entraîne pas plus de concurrence. Les méthodes de service ne sont pas un bon endroit pour effectuer de grandes quantités de travail, car elles s'exécutent sur le thread d'interface utilisateur .
Bien sûr, vous pouvez étendre Service, ajouter vos propres méthodes et les appeler à partir de n'importe quel thread de votre choix. Mais si vous faites cela, la responsabilité de la sécurité des threads incombe à vous - pas au cadre.
Si vous souhaitez ajouter un thread d'arrière-plan (ou une autre sorte de worker) à votre Service, vous êtes libre de le faire. Vous pouvez démarrer un thread d'arrière-plan / AsyncTaskin Service.onCreate(), par exemple. Mais tous les cas d'utilisation ne l'exigent pas. Par exemple:
- Vous souhaiterez peut-être continuer à
Servicefonctionner afin de pouvoir continuer à obtenir des mises à jour de localisation en «arrière-plan» (c'est-à-dire sans nécessairement en avoir à l' Activitiesécran).
- Ou, vous pouvez garder votre application en vie juste pour que vous puissiez conserver un
BroadcastReceiverenregistrement "implicite" à long terme (après l'API 26, vous ne pouvez pas toujours le faire via le manifeste, vous devez donc vous inscrire au moment de l'exécution. [ réf ]).
Aucun de ces cas d'utilisation ne nécessite une grande activité du processeur; ils exigent simplement que l'application ne soit pas tuée .
En tant que travailleurs
Servicesne sont pas axés sur les tâches. Ils ne sont pas configurés pour «exécuter une tâche» et «fournir un résultat», comme le AsyncTaskssont. Servicesne résolvez aucun problème de sécurité des threads (nonobstant le fait que toutes les méthodes s'exécutent sur un seul thread). AsyncTasks, d'un autre côté, gérez cette complexité pour vous.
Notez qu'il AsyncTaskest prévu de devenir obsolète . Mais cela ne signifie pas que vous devriez remplacer le vôtre AsyncTaskspar Services! (Si vous avez appris quelque chose de cette réponse, cela devrait être clair.)
TL; DR
Servicessont pour la plupart là pour «exister». Ils sont comme un hors écran Activity, fournissant une raison pour que l'application reste en vie, tandis que d'autres composants se chargent de faire le «travail». AsyncTasks«travailler», mais ils ne maintiendront pas en eux-mêmes un processus en vie.