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 ?
- Le système peut-il détruire une ou plusieurs de mes activités pour récupérer la mémoire ?
- 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 ?
- 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.
- Testez votre application avec le bouton DDMS - Stop process. Voir ceci
- 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.
- 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é :)