web-dev-qa-db-fra.com

Android - Comment décider d'exécuter un service dans un processus séparé?

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

Actuellement, ce service s'exécute dans un processus séparé (en utilisant 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 pensaient que séparer le service des activités le rendrait plus stable.

J'aimerais avoir des raisons plus factuelles pour les efforts déployés pour exécuter un processus distinct. Quels sont les avantages? Est-ce 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 fait partie d'un processus distinct?

Notre application utilise startForeground () et des amis pour minimiser le risque d'être tué par le système d'exploitation.

Les Android ne sont pas très précis à ce sujet, la plupart du temps, ils indiquent que cela dépend de l'objectif de l'application ;-)

TL; DR Quelles sont les raisons objectives de placer un service de longue date dans un processus séparé (sous Android)?

45
pableu

Le premier endroit pour commencer est de lire la description de cycle de vie des composants . En fait, vous n'êtes pas vraiment assuré qu'un Service ou un autre composant sera autorisé à fonctionner pendant une longue période.

Cependant, cela ressemble à un Service est le bon choix pour la fonctionnalité que vous décrivez. Cela est dû au fait que vous effectuez certaines 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 est d'utiliser AlarmManager pour déclencher périodiquement votre Service. Vous pouvez également envisager d'utiliser la bibliothèque WakefulIntent que @CommonsWare a créée.

Il existe un bon article décrivant le multitâche et les processus sur le blog Android appelé Multitasking the Android Way qui pourrait vous donner plus de détails sur les processus que vous êtes intéressé. Par exemple:

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

20
Eric Levine

Réduction RAM Utilisation

La documentation du développeur Android pour les développeurs suggère que cela pourrait être approprié pour réduire l'utilisation RAM de la RAM).

De Gestion de la mémoire de votre application: utilisez plusieurs processus :

Un exemple de cas où plusieurs processus peuvent être appropriés est lors de la construction d'un lecteur de musique qui lit la musique d'un service pendant une longue période de temps. Si l'application entière s'exécute dans un processus, la plupart des allocations effectuées pour son interface utilisateur d'activité doivent être conservées tant qu'elle lit de la musique, même si l'utilisateur est actuellement dans une autre application et que le service contrôle la lecture. Une application comme celle-ci peut être divisée en deux processus: un pour son interface utilisateur et l'autre pour le travail qui continue de s'exécuter dans le service d'arrière-plan.

L'exécution du service dans un processus séparé pourrait donc réduire l'impact sur les performances de l'application tout en réduisant la probabilité que le service soit tué lorsque le système manque de RAM.

Impact réduit sur les performances

De Gérer la mémoire de votre application: Changer d'application :

Si votre application dispose d'un processus mis en cache et qu'elle conserve de la mémoire dont elle n'a actuellement pas besoin, votre application, même si l'utilisateur ne l'utilise pas, limite les performances globales du système. Ainsi, comme le système manque de mémoire, il peut tuer les processus dans le cache LRU en commençant par le processus le moins récemment utilisé, mais en tenant également compte des processus les plus gourmands en mémoire.

Réduction de la probabilité d'être tué

De Gestion de la mémoire de votre application: libérez la mémoire lorsque la mémoire devient trop faible :

Remarque: Lorsque le système commence à tuer des processus dans le cache LRU, bien que cela fonctionne principalement de bas en haut, il prend en compte les processus qui consomment le plus mémoire et fournira ainsi au système plus de gain de mémoire s'il est tué. Ainsi, moins vous consommez de mémoire dans l'ensemble de la liste LRU, meilleures sont vos chances de rester dans la liste et de pouvoir reprendre rapidement.

Ainsi, votre service a moins de chances d'être tué lorsqu'il est dans un processus séparé puisque l'utilisation RAM de la RAM) sera plus petite car le service ne partage pas les ressources de l'interface utilisateur.

Quand faire ça

Si votre service n'utilise pas startForeground(), j'ai trouvé que Android le tuera juste quand il aura besoin de libérer de la RAM, donc le service RAM n'est pas trop importante. Donc, si vous ne considérez que l'impact sur les performances du système d'exploitation et d'autres applications, je ne pense pas que cela vaille la peine d'exécuter le service dans un processus séparé.

Cependant, si vous faites utilisez startForeground(), Android essaiera de maintenir votre service en vie autant que possible, donc tout RAM que le processus utilise will impact sur le système d'exploitation et d'autres applications. Donc, dans ce cas, je recommande d'utiliser un processus séparé, qui pourrait économiser au moins 10 Mo de RAM, donc vous ne ralentissez pas les appareils de vos utilisateurs.

Notez également que rendre votre application multi-processus est pas facile; Android SharedPreferences ne prend pas en charge plusieurs processus. J'ai fait ne implémentation multi-processus SharedPreferences dans l'un de mes projets , mais je ne l'ai pas encore publié pour réutilisation.

21
Sam

L'exécution d'un service dans son propre processus présente les petits avantages que le garbage collector du service n'affecte pas votre application et que l'encombrement mémoire du service est un peu plus petit s'il s'exécute 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 ex. via un récepteur de diffusion. Voir tutoriel du service Android pour plus de détails.

14
vogella

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, rend votre application plus stable, car si ce service tombe en panne, votre application ne plantera pas avec lui et pourra récupérer.

Eli

9
Eli