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.
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
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
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