web-dev-qa-db-fra.com

Qu'est-ce que l'ondestroy () détruit exactement?

J'ai été dérangé par cette "caractéristiques": lorsque j'utilise le bouton arrière pour quitter mon application, je peux dire qu'Owestroy () est appelé, mais la prochaine fois que je gère mon application, tous les membres statiques de la classe d'activité conservent toujours leur valeurs. Voir le code ci-dessous:

public class HelloAndroid extends Activity {

private static int mValue;   // a static member here

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText((mValue != 0) ? 
        ("Left-over value = " + mValue) : "This is a new instance");
    setContentView(tv);
}

public void onDestroy() {
    super.onDestroy();
    mValue++;
}

}

Le code ci-dessus affiche la valeur de gauche en mvalue et s'incrémente lorsque la session se termine de manière à ce que je sache avec certitude que l'Ondestroy () est appelé.

J'ai trouvé une réponse utile sur ce forum, et je comprends dans le code ci-dessus, Mvalue est un membre de la classe, au lieu d'un membre d'instance. Mais n'est-il pas vrai que, dans ce cas particulier, je n'ai qu'une seule activité Helloandrroid, et donc quand il meurt, tout est nettoyé, et la prochaine fois que je reviens, tout recommence, tout recommence? (Ou, existe-t-il une autre chose mystérieuse dans le système qui lui reste toujours après OnDestroy () pour que cela ne mourra pas ???)

(Ce qui précède est juste une variable, que se passe-t-il si c'est une bande de références Objec? Chaque pièce est une mémoire recouvrable séparément. Y a-t-il une chance que gc recueille certains d'entre eux mais pas tous? Cela me renonce vraiment. )

29
wwyt

L'OS décide quand les choses "vont". Le onDestroy est là pour laisser votre application avoir une finale chance Pour nettoyer les choses avant que l'activité ne soit détruite, mais cela ne signifie pas que l'activité sera, en fait, être Ged. Voici un bon article que je recommande aux gens de lire qui concerne la création d'un bouton de sortie. Bien que ce ne soit pas exactement ce que vous avez demandé, les concepts vous aideront à comprendre ce qui se passe.

35
Andrew White

Vous n'avez pas seulement l'activité cependant. Vous avez également la demande et son processus en cours d'exécution dans un VM Dalvik. =Android laissera généralement l'application en marche en arrière-plan jusqu'à ce qu'elle nécessite la récupération de la mémoire utilisée pour une autre application. Votre membre statique doit rester en mémoire tant que le processus est exécuté. Si Vous essayez d'exécuter une application à forte intensité de mémoire ou fermer avec force l'application en cours d'exécution avec un gestionnaire de tâches, vous pouvez voir la valeur de la valeur statique.

9
Jems