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 :)
la source
Réponses:
Jetez d'abord un œil à ceci:
Ainsi, lorsque vous appuyez sur le bouton « HOME » sur votre appareil, votre activité de premier plan en cours est mis sur
onPause()
puisonStop()
, l'autre 4 devrait resteronStop()
Selon les documents de Google:
Et, pour le cycle de vie des processus:
Toutes les citations ci-dessus proviennent de: Référence des 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 certaines applications consommatrices de mémoire. Et vous pouvez implémenter comme:
isFinishing()
dans votre activité, puis en utilisant le bouton "tuer" dans 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 le plus ancien. Cependant, il ne sert à rien de conserver d'autres activités lorsque l '«activité de lancement» a été recyclée.METTRE À JOUR
Voici quelques opinions que j'ai trouvées d' ici :
la source
Oui. Android tue les activités qui s'exécutent en arrière-plan lorsqu'il y a un besoin de mémoire. Tuer un ou tous peut dépendre de certaines conditions. Pour une instance mise en pause ou arrêtée, Android peut tuer une activité ou un processus lui-même. Ici, sous Cycle de vie des activités, vous pouvez obtenir les points ci-dessous. Je vous recommande de parcourir cette page complètement. Cela effacera certainement vos doutes.
L'activité se rapporte à un individu tandis que le processus se rapporte à un groupe d'activités. Regardez à nouveau le troisième point ci-dessus, il tue le processus comme mentionné.
C'est similaire à redémarrer. Encore une fois, le troisième point vous donnera des réponses comme
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 éléments liés à la mémoire ici .
Modifier:
toutes les activités d'une application s'exécutent en un seul processus. Ainsi, lorsqu'un processus est tué, toutes les activités, peu importe 5 ou 10, seront tuées, c'est-à-dire redémarrées. Le redémarrage fera démarrer votre application à partir d'un début sans état enregistré.
la source