2010-06-15 6 views
14

J'ai un service fonctionnant dans le même processus que mon application.Service Android tué

Parfois, l'OS Android décide de tuer mon service (probablement en raison de la mémoire insuffisante).

Ma question est: est-ce que mon application est tuée avec le service? ou comment ça marche exactement?

Merci!

Répondre

35

Tout d'abord assurez-vous de lire: http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

La clé est que sur Android un processus est un conteneur pour le code - - ou spécifiquement un ou plusieurs composants (activités, services, récepteurs, fournisseurs). Par défaut, tous les composants d'un .apk obtiennent leur propre processus dédié, qu'ils exécutent tous ensemble. C'est presque toujours ce que tu veux. Lorsque l'utilisateur interagit directement avec un composant de ce processus (c'est-à-dire une activité), Android fera tout son possible pour que ce processus continue, et vous ne le verrez pas tuer sauf dans des circonstances extraordinaires.

Lorsque l'utilisateur n'interagit plus directement avec le processus, il devient alors inutilisable par rapport aux autres processus décrits dans la documentation référencée. En d'autres termes, les processus vides (aucun composant intéressant) seront supprimés avant les processus contenant des activités que l'utilisateur a utilisées et qui seront supprimés avant les processus avec des services en cours d'exécution. Donc, avoir un service en cours aura tendance à garder votre processus au détriment d'autres processus.

Dans le même temps, nous devons faire face à de plus en plus d'applications laissant les services en cours d'exécution, souvent indéfiniment, et souvent avec des fuites de mémoire. Alors un service fonctionne de plus en plus longtemps, Android essaiera de moins en moins de continuer son processus. Effectivement, cela signifie le déplacer vers le seau d'arrière-plan jusqu'à ce que le tueur de mémoire l'enlève. Après cela, si le service veut encore s'exécuter, un nouveau processus sera créé pour le redémarrer.

Le résultat est que pour les services normaux qui durent longtemps, il est attendu que leur processus va être tué après un certain temps.Cela n'a pas besoin d'arrêter le service; un service qui veut continuer à fonctionner le fera, il devra juste être instancié dans un nouveau processus.

Bien sûr, tant que l'utilisateur interagit avec une activité dans votre processus, le processus ne sera pas tué, car cela l'amène à la catégorie de premier plan, indépendamment de ce qui se passe avec les services.

+0

merci pour votre réponse utile! donc pour être un peu plus spécifique: Je sous-classe de l'application et dans ce je tiens une référence à mon objet de service. Quand mon service est tué, comment puis-je obtenir une référence à la nouvelle? ou est-ce que mon objet Application meurt également et quand il est ré-instancié, tout est le même que lorsque je lance l'application pour la première fois? – Erdal

+2

Lors de la suppression de quelque chose pour la mémoire, le processus entier (y compris l'objet application) est tué et aucun code n'est exécuté à ce stade. Si le service vient d'être détruit car il n'a plus besoin de s'exécuter, onDestroy() sera appelé et lorsque le service est nécessaire, une nouvelle instance est créée et onCreate() est appelée. Personnellement, je recommande généralement de ne pas utiliser Application; cela ne vous donne vraiment rien de plus que l'utilisation de classes de singleton statiques, et je pense que cela crée des attentes pour les gens (avec un modèle d'application plus traditionnel) qui ne tiennent pas vraiment. – hackbod

+0

Je vois ce que tu veux dire. Le seul problème que j'avais, me forçant à utiliser la classe Application était que je ne voulais pas me lier au Service de toutes mes différentes Activités. J'appelle uniquement bind pendant la méthode onCreate de mon application et toutes les autres activités accèdent au service via mon application singleton. Suggéreriez-vous quelque chose de mieux? – Erdal

3

Les processus sont supprimés par le tueur à faible mémoire, pas les applications. Donc, à moins que vous n'effectuiez un travail supplémentaire pour faire fonctionner votre service dans un processus différent, vos activités sont détruites avec votre service. Le tueur de mémoire faible n'essaye pas de détruire des objets dans votre processus, bien que le gestionnaire d'activité puisse appeler des objets onDestroy on Activity qui ne sont plus nécessaires. Mais cela se produit dans le cadre du cycle de vie de l'activité régulière, pas en raison de conditions de mémoire insuffisantes.

(Soit dit en passant, je ne suis pas certain que vous voulez dire « application » en général, ou votre objet qui étend l'application, ou si vous voulez dire vos activités qui montrent l'interface utilisateur.)

+0

par application, je veux dire mon objet qui s'étend de l'application – Erdal

1

Une application est quelque chose qui a une interface utilisateur et si vous avez inclus un service avec elle, alors certainement il sera tué puisque les applications sont terminées une fois que la file d'attente d'application en cache est pleine

alors créez un service distinct de l'application ou en d'autres termes créez un autre projet pour cela :)

btw, je ne suis pas un Android expérimenté de veloper mais c'est je pense ce que j'appris en regardant les vidéos du cycle de vie de développement Android de Google

+1

Certainement pas créer un autre projet. Aussi, ne pas avoir le service exécuté dans un autre processus (via android: processus) sauf dans des circonstances très particulières. – hackbod

+0

oui, j'essaie de garder mon service dans le même processus. Il est probablement plus rapide et plus facile pour moi de simplement appeler des méthodes statiques que d'implémenter l'aide – Erdal