web-dev-qa-db-fra.com

android finish () n'efface pas l'application de la mémoire

J'ai une activité et j'appelle la méthode finish () et l'activité n'est pas effacée de la mémoire.

Après avoir appelé finish (), je vois que la méthode onDestroy () est exécutée avec succès (et j'efface toutes mes variables et tout ce qui s'y trouve).

Doit-il être effacé de la mémoire ou de son fonctionnement Android fonctionne? Si je comprends bien, le cycle de vie de l'activité est terminé.

Et s'il garde l'application en mémoire afin qu'elle s'exécute plus rapidement la deuxième fois que l'utilisateur l'utilise, quel type d'objets puis-je laisser en mémoire pour la réutiliser? Si je comprends bien, je suis censé tout effacer sur onDestroy.

26
Daniel Benedykt

Android conserve les processus au cas où l'utilisateur souhaite redémarrer l'application, ce qui accélère la phase de démarrage. Le processus ne fera rien et si la mémoire doit être récupérée, le processus sera tué. Ne vous en faites pas :)

33
Romain Guy

Le meilleur moyen est tout d'abord d'utiliser finish() et ensuite d'utiliser System.exit(0) pour effacer les variables statiques. Cela vous donnera de l'espace libre.

De nombreuses applications laissent des processus et des variables de travail ce qui me met en colère. Après 30 minutes d'utilisation, la mémoire est pleine et je dois exécuter le Gestionnaire des tâches - Mémoire claire de niveau 2

Ce n'est pas vrai que ce sont des problèmes de connexion, je l'ai essayé pendant plus de 3 ans dans mes applications. Ne jamais tomber en panne ou redémarrer après avoir utilisé Exit()

27
Tefel

Essayez d'utiliser

System.exit (0);

11
Zahid

Une fois que onDestroy () est appelé, votre activité est vouée à l'échec. Période.

Cela étant dit, le processus (et donc l'espace d'adressage) alloué à votre application peut toujours être utilisé par une autre partie de votre application - une autre activité ou service. Il est également possible que votre processus soit vide et que le système d'exploitation ne soit pas encore parvenu à le récupérer; ce n'est pas instantané.

Voir le document Process Lifecycle pour plus d'informations:
http://developer.Android.com/reference/Android/app/Activity.html#ProcessLifecycle

Quoi qu'il en soit, si votre activité est relancée, elle devra recommencer toute la séquence de démarrage, en commençant par onCreate (). Ne présumez pas que tout peut être implicitement réutilisé.

6
Trevor Johns

Si vous devez fermer l'application de la sous-activité, je peux vous suggérer de la faire de la manière suivante: 1) à partir de l'activité A, appelez l'activité B comme startActivityForResult (intention, REQUEST_CODE);

Intent intent = new Intent()
            .setClass(ActivityA.this, ActivityB.class);
            startActivityForResult(intent, REQUEST_CODE);

2) dans l'activité A, vous devez ajouter la méthode:

protected void onActivityResult(int requestCode, int resultCode,
        Intent data) {
    if (requestCode == REQUEST_CODE) {
        if (resultCode == RESULT_CLOSE_APPLICATION) {
            this.finish();
        }
    }
}

3) dans l'activité B fin d'appel:

this.setResult(RESULT_CLOSE_APPLICATION);
this.finish();
4
Anton Derevyanko

Selon this presentation from Google I/O 2008, Finish devrait également entraîner la mort du processus, mais j'ai écrit un application rapide pour tester cela et sur Android 1.5 ce n'est pas le cas.

Comme l'a dit Romain (qui est d'ailleurs un ingénieur UI Toolkit pour Android), votre processus ne fera rien de toute façon, donc il n'y a rien à craindre.

1
Frank

Comme solution rapide, vous pouvez utiliser ce qui suit pour tuer votre application:

Android.os.Process.killProcess(Android.os.Process.myPid());

Mais je ne recommanderais pas cela pour les applications commerciales, car cela va à l'encontre du fonctionnement du système de gestion de la mémoire Android.

1
Rab Ross