Salut, je me demande comment Android gère la mémoire et je ne trouve nulle part de réponse précise. Supposons que j'ai une application avec 5 activités sur la pile d'activité actuelle (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 de l'appareil commence à être faible. Et la question est
... Qu'arrivera-t-il à ma candidature?
- Le système peut-il détruire une ou certaines de mes activités pour récupérer de la mémoire?
- Le système va-t-il tuer tout le processus de mon application? Toutes les activités seront-elles bien détruites?
- Que se passera-t-il lorsque je reviendrai à mon application lorsqu'elle a été totalement supprimée? Va-t-il commencer à partir du début (comme le premier démarrage) ou va-t-il essayer de récupérer les activités à l'état précédent / si oui - est-ce seulement celle qui se trouve en haut de la pile ou toutes?
METTRE À JOUR:
Avant de poser cette question, j'ai vu le cycle de vie de l'activité à plusieurs reprises, mais il n'a pas de réponses à mes questions. J'ai fait quelques tests et j'ai quelques réponses. «Arrêter le processus» dans DDMS était un indice pour les tests.
Je n'ai pas testé la réponse à la question 1, mais comme le guide le dit:
Si une activité est mise en pause ou arrêtée, le système peut supprimer l'activité de la mémoire en lui demandant de terminer ou simplement en tuant son processus.
Il semble qu'une ou plusieurs des activités peuvent être détruites doucement (avec la méthode onDestroy) sans tuer le processus. Vous obtiendrez simplement (onCreate + bundle) lorsque vous y reviendrez.
Réponse à la question 2:
OUI. En général, le système tue l'ensemble du processus, cela 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 interrompues / arrêtées. C'est pourquoi saveInstanceState () est appelée juste avant la méthode onPause. onPause est fondamentalement la dernière méthode où vous devriez enregistrer quelque chose car après cette méthode, vous ne pourriez jamais voir onStop ou onDestroy. Le système peut simplement tuer le processus en détruisant tous vos objets quoi qu'ils contiennent et quoi qu'ils fassent.
Réponse à la question 3:
Que se passe-t-il lorsque vous revenez à une application supprimée?
- Avant Android 2.2 - l'application démarrera dès 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 ça veut dire? Cela signifie que la dernière activité visible sera recréée (onCreate + bundle). Que se passera-t-il avec la pile d'activités? La pile est bonne mais toutes les activités dessus sont mortes. Chacun d'entre eux sera recréé (onCreate + bundle) lorsque vous y reviendrez avec le bouton retour. Il y a encore une chose à ce sujet:
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 à partir de l'écran d'accueil. En règle générale, cela est fait si l'utilisateur n'a pas visité la tâche pendant un certain temps, par exemple 30 minutes.
Conclusion?
- Ne pensez pas que la gestion des problèmes de rotation des activités peut être résolue par android: configChanges = "orientation". Lorsque vous faites cela, vous aurez de nombreux autres problèmes dont vous n'êtes même pas au courant.
- Testez votre application avec DDMS - bouton Arrêter le processus. Regarde ça
- Soyez prudent lorsque vous utilisez des variables statiques. Ne pensez pas que lorsque vous les initialiserez dans l'activité 1 - vous les aurez initialisés dans l'activité 2. Le seul endroit sûr pour initialiser la statique globale serait 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 dans BG - utilisez le service de premier plan.
Ce serait ça ... J'espère que j'ai aidé avec mon essey :)