47 votes

Android - Comment décider si un service doit être exécuté dans un processus distinct ?

Je travaille sur une application Android qui collecte des données de capteurs sur plusieurs heures. Pour cela, nous avons un service qui collecte les données des capteurs (par exemple, accélération, GPS, ), effectue un traitement et les stocke à distance sur un serveur.

Actuellement, ce service s'exécute dans un processus séparé (en utilisant la fonction Android:service=":background" dans le manifeste). Cela complique la communication entre les activités et le service, mais mes prédécesseurs ont créé l'application de cette façon parce qu'ils voulaient pensée que le fait de séparer le Service des Activités le rendrait plus stable.

J'aimerais avoir des raisons plus factuelles pour justifier l'effort que représente l'exécution d'un processus distinct. Quels sont les avantages ? Le fonctionnement est-il vraiment plus stable ? Le service est-il moins susceptible d'être tué par le système d'exploitation (pour libérer des ressources) s'il se trouve dans un processus distinct ?

Notre application utilise startForeground() et des amis pour minimiser les chances de se faire tuer par l'OS.

La documentation Android n'est pas très précise à ce sujet, elle indique principalement que cela dépend de l'objectif de l'application ;-)

TL;DR Quelles sont les raisons objectives de placer un service qui s'exécute longtemps dans un processus distinct (dans Android) ?

22voto

elevine Points 7208

Le premier point de départ est la lecture de la description de l'article suivant le cycle de vie des composants . Ce qu'il faut retenir de tout cela, c'est que vous n'avez aucune garantie qu'une Service ou tout autre composant sera autorisé à fonctionner pendant une longue période de temps.

Cependant, cela ressemble à un Service est le bon choix pour la fonctionnalité que vous décrivez. En effet, vous effectuez des opérations qui ne sont pas destinées à l'utilisateur. Pour en revenir à la description du cycle de vie, chaque fois qu'une activité n'est pas au premier plan, elle est essentiellement candidate à la mort.

Ce que vous devriez envisager de faire, c'est d'utiliser AlarmManager à déclencher périodiquement votre Service . Vous pouvez également envisager d'utiliser le WakefulIntent que @CommonsWare a créé.

Il y a un bon article décrivant le multitâche et les processus sur le blog Android appelé Le multitâche à la manière d'Android qui pourrait vous permettre d'obtenir plus de détails sur les processus qui vous intéressent. Par exemple :

Un malentendu courant sur multitâche Android est la différence entre un processus et une application. Dans Android, il ne s'agit pas d'entités entités étroitement couplées : les applications applications peuvent sembler présentes à l'utilisateur sans processus réel exécutant l'application. l'application ; plusieurs applications peuvent partager processus, ou une application peut utiliser une application peut utiliser plusieurs processus en fonction de selon ses besoins ; le ou les processus d'une application application peuvent être conservés par Android même lorsque cette application n'est l'application n'est pas en train de faire quelque chose.

15voto

vogella Points 4884

L'exécution d'un service dans son propre processus présente le petit avantage que le ramasseur de déchets du service n'affecte pas votre application et que l'empreinte mémoire du service est un peu plus petite s'il fonctionne seul.

Si la consommation du service par d'autres applications n'est pas une exigence pour vous, préférez un service local. Sinon, vous pouvez toujours exécuter le service dans son propre processus et utiliser une communication différente avec votre application, par exemple via un récepteur de diffusion. Voir Tutoriel sur les services Android pour les détails.

9voto

Eli Points 116

Le fait de séparer le service pour qu'il s'exécute dans un processus différent ne le rend pas plus stable, mais dans certains cas, cela rend votre application plus stable, car si ce service tombe en panne, votre application ne tombera pas en panne avec lui et pourra se rétablir.

Eli

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X