116 votes

Android détruit les activités, tue les processus

Bonjour, je me demande comment Android gère la mémoire et je ne trouve pas de réponse précise nulle part. Supposons que j'ai une application avec 5 activités sur la pile d'activité courante (4 sont arrêtées et 1 est reprise), il n'y a pas de service connecté. J'appuie sur le bouton HOME pour que toutes mes activités soient arrêtées. Je lance une autre application consommatrice de mémoire et la mémoire globale du dispositif commence à être faible. Et la question est la suivante

... Qu'adviendra-t-il de ma demande ?

  1. Le système peut-il détruire une ou plusieurs de mes activités pour récupérer la mémoire ?
  2. Le système va-t-il tuer tout le processus de ma candidature ? Est-ce que toutes les activités seront bien détruites ?

Que se passera-t-il lorsque je reviendrai à mon application alors qu'elle a été totalement détruite ? Va-t-elle recommencer depuis le début (comme au premier démarrage) ou va-t-elle essayer de récupérer les activités à l'état précédent ? Si oui, est-ce seulement celle qui est en haut de la pile ou toutes ?

UPDATE :

Avant de poser cette question, j'ai vu le cycle de vie des activités à plusieurs reprises, mais il ne répond pas à mes questions. J'ai fait quelques tests et j'ai quelques réponses. "Stop process" dans DDMS était un indice pour les tests.

Je n'ai pas testé la réponse à la question 1, mais comme le dit le guide :

Si une activité est mise en pause ou arrêtée, le système peut la supprimer de la mémoire en lui demandant de se terminer ou en tuant simplement son activité. de la mémoire soit en lui demandant de se terminer, soit en tuant simplement son processus.

Il semble qu'une ou plusieurs des activités puissent être détruites en douceur (avec la méthode onDestroy) sans tuer le processus. Vous obtiendrez simplement (onCreate + bundle) en revenant à elles.

Réponse à la question 2 :

OUI. En général, le système tue l'ensemble du processus, ce qui signifie que toutes les données, y compris les activités et les champs statiques, sont détruites. Ce n'est PAS fait correctement - vous n'obtiendrez pas onDestroy ou finialize() pour aucune de vos activités en pause/arrêt. C'est pourquoi saveInstanceState() est appelé juste avant la méthode onPause. onPause est en fait la dernière méthode où vous devez sauvegarder quelque chose parce qu'après cette méthode vous ne verrez jamais onStop ou onDestroy. Le système peut simplement tuer le processus en détruisant tous vos objets, quels qu'ils soient et quelle que soit leur activité.

Réponse à la question 3 :

Que se passera-t-il lorsque vous reviendrez à une application tuée ?

  • Avant Android 2.2 - l'application démarre depuis le début, avec l'activité du lanceur.
  • À partir de la version 2.2, le système restaurera l'état précédent de l'application. Qu'est-ce que cela signifie ? Cela signifie que la dernière activité visible sera recréée (onCreate + bundle). Que va-t-il se passer avec la pile d'activités ? La pile est bien mais toutes les activités qui s'y trouvent sont mortes. Chacune d'entre elles sera recréée (onCreate + bundle) lorsque vous y reviendrez avec le bouton retour. Il y a une autre chose à propos de cela :

Normalement, le système efface une tâche (supprime toutes les activités de la pile au-dessus de l'activité racine) dans certaines situations lorsque l'utilisateur sélectionne à nouveau cette tâche dans l'écran d'accueil. Typiquement, cela se fait si l'utilisateur n'a pas visité la tâche depuis un certain temps, par exemple 30 minutes.

Conclusion ?

  1. Ne pensez pas que les problèmes de rotation des activités peuvent être résolus par Android:configChanges="orientation". Si vous faites cela, vous obtiendrez vous obtiendrez de nombreux autres problèmes dont vous n'avez même pas conscience.
  2. Testez votre application avec le bouton DDMS - Stop process. Voir ceci
  3. Soyez prudent lorsque vous utilisez des variables statiques. Ne pensez pas que lorsque vous les avez initialisées dans l'activité 1 - vous les aurez initialisées dans l'activité 2. Le seul endroit sûr pour initialiser des variables statiques globales est la classe Application.
  4. N'oubliez pas que vous ne verrez peut-être jamais onStop ou onDestroy. Fermez les fichiers/bases de données, arrêtez les téléchargeurs dans onPause. Lorsque vous voulez que l'application fasse quelque chose en BG - utilisez le service d'avant-plan.

C'est tout... J'espère vous avoir aidé :)

30voto

ss1271 Points 2355

Tout d'abord, jetez un coup d'œil à ceci :

img1

onPause() Appelé lorsque le système est sur le point de reprendre une activité précédente. Ceci est généralement utilisé pour valider des modifications non sauvegardées de données persistantes, arrêter des animations et d'autres choses qui pourraient consommer le CPU, etc. Les implémentations de cette méthode doivent être très rapides car l'activité suivante ne sera pas reprise avant le retour de cette méthode. retourne. Suivie soit par onResume() si l'activité revient à l'avant, soit par onStop() si l'activité ne reprend pas. l'avant, ou onStop() si elle devient invisible pour l'utilisateur.

onStop() Appelé lorsque l'activité n'est plus visible pour l'utilisateur, parce qu'une autre activité a été reprise et couvre cette activité. cette activité. Cela peut se produire soit parce qu'une nouvelle activité est en cours de démarrage, une activité existante est placée devant celle-ci, ou celle-ci est être détruite. Suivi par onRestart() si l'activité est en train de activité revient pour interagir avec l'utilisateur, ou onDestroy() si cette activité disparaît.

Ainsi, lorsque vous appuyez sur le bouton "HOME" de votre appareil, l'activité de premier plan en cours est mise en évidence. onPause() puis onStop() les 4 autres doivent rester onStop()

Selon les documents de Google :

  • Si une activité se trouve au premier plan de l'écran (en haut de la pile), elle est active ou en cours d'exécution.
  • Si une activité a perdu le focus mais est toujours visible (c'est-à-dire qu'une nouvelle activité non pleine ou transparente a le focus sur le dessus de votre activité), elle est mise en pause. Une activité en pause est complètement vivante (elle maintient toutes les informations d'état et de membre et reste attachée au gestionnaire de fenêtre), mais peut être tuée par le système dans des situations extrêmes de faible de mémoire.
  • Si une activité est complètement masquée par une autre activité, elle est arrêtée. Elle conserve cependant toutes les informations relatives à l'état et aux membres, elle n'est plus visible pour l'utilisateur, sa fenêtre est donc cachée et elle sera souvent tuée par le système lorsque la mémoire est nécessaire ailleurs.
  • Si une activité est mise en pause ou arrêtée, le système peut la supprimer de la mémoire soit en lui demandant de se terminer, soit en tuant tout simplement son processus. Lorsqu'elle est affichée à nouveau pour l'utilisateur, elle doit être complètement redémarrée et restaurée à son état précédent.

Et, pour le cycle de vie du processus :

Cycle de vie du processus 3. Une activité d'arrière-plan (une activité qui n'est pas visible pour l'utilisateur et qui a été mise en pause) n'est plus critique. le système peut donc tuer son processus en toute sécurité afin de récupérer de la mémoire pour d'autres processus d'avant-plan ou visibles. processus d'avant-plan ou visibles. Si son processus doit être tué, lorsque l'utilisateur revient à l'activité (ce qui la rend à nouveau visible à l'écran), sa fonction onCreation est activée. l'activité (la rendant à nouveau visible à l'écran), sa méthode onCreate(Bundle) sera appelée avec le savedInstanceState qu'il avait précédemment fourni dans la méthode onSaveInstanceState(Bundle) afin qu'elle puisse redémarrer dans l'état où l'utilisateur l'a laissée. état dans lequel l'utilisateur l'a laissé la dernière fois.

Toutes les citations ci-dessus proviennent de : Référence pour les développeurs Android : Activité

Il est confirmé que le système peut détruire les activités non actives et recycler les mémoires lorsque vous lancez des applications consommatrices de mémoire. Et vous pouvez mettre en œuvre comme : isFinishing() dans votre activité et ensuite utiliser le bouton "kill" dans le DDMS pour détecter laquelle de vos activités est abandonnée par le système. Mais je suppose que le système détruira d'abord la plus ancienne. Cependant, il est inutile de conserver d'autres activités lorsque l'"activité de lancement" a été recyclée.

UPDATE

Voici quelques avis que j'ai trouvés sur ici :

État d'arrêt

Lorsqu'une activité n'est pas visible, mais toujours en mémoire, nous disons qu'elle est dans une état arrêté. Une activité arrêtée peut être ramenée au premier plan pour pour redevenir une activité en cours. Ou bien, elle peut être détruite et supprimée de la mémoire.

Le système maintient les activités dans un état arrêté parce qu'il est car il est probable que l'utilisateur voudra toujours revenir à ces activités un jour ou l'autre, et redémarrer une activité arrêtée est bien moins coûteux que de que de démarrer une activité à partir de zéro. C'est parce que nous avons déjà tous les objets chargés en mémoire et il suffit de les amener au premier plan. premier plan.

Les activités arrêtées peuvent être supprimées de la mémoire à tout moment.

1voto

JJPA Points 4796

Le système peut-il détruire seulement une ou quelques unes de mes activités pour récupérer mémoire ?

Oui. Android tue les activités qui s'exécutent en arrière-plan lorsqu'il y a un besoin de mémoire. La suppression d'une ou de toutes les activités peut dépendre de certaines conditions. Par exemple, une pause ou un arrêt peut amener Android à tuer une activité ou un processus lui-même. Ici sous Cycle de vie des activités vous pouvez obtenir les points suivants. Je vous recommande de parcourir entièrement cette page. Elle éclaircira définitivement vos doutes.

Si une activité a perdu le focus mais qu'elle est toujours visible (c'est-à-dire qu'une nouvelle activité non pleine ou transparente a le focus sur votre activité. activité), elle est mise en pause. Une activité en pause est complètement vivante (elle maintient toutes les informations d'état et de membre et reste attachée au gestionnaire de fenêtre), mais peut être tuée par le système dans des situations extrêmes de faible de mémoire.

Si une activité est complètement masquée par une autre activité, elle est arrêtée. Elle conserve toutes les informations sur l'état et les membres, cependant, elle n'est plus visible pour l'utilisateur et sa fenêtre est masquée. et elle sera souvent tuée par le système lorsque la mémoire est requise ailleurs. ailleurs.

Si une activité est mise en pause ou arrêtée, le système peut abandonner l'activité de la mémoire en lui demandant de se terminer ou simplement en lui demandant d'arrêter. l'activité de la mémoire soit en lui demandant de se terminer, soit simplement en en tuant son processus. Lorsqu'elle est affichée à nouveau pour l'utilisateur, elle doit être complètement redémarrée et restaurée à son état précédent.


Le système va-t-il tuer tout le processus de ma candidature ? Est-ce que toutes les activités seront-elles bien détruites ?

L'activité concerne un individu alors que le processus concerne un groupe d'activités. Regardez le troisième point ci-dessus, il tue le processus comme mentionné.


Que se passera-t-il quand je reviendrai à mon application alors qu'elle a été totalement tuée ?

C'est similaire au redémarrage. Encore une fois, le troisième point vous donnera des réponses telles que When it is displayed again to the user, it must be completely restarted and restored to its previous state

Obtenez plus d'informations sur les questions relatives à la mémoire ici .

Edit :
Toutes les activités d'une application sont exécutées dans un seul processus. Ainsi, lorsqu'un processus est tué, toutes les activités, peu importe qu'il y en ait 5 ou 10, seront tuées, c'est-à-dire redémarrées. Le redémarrage fera en sorte que votre application démarre depuis le début, sans états sauvegardés.

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