qu'est-ce exactement Activité.finish() la méthode est en train de faire?

je développe des applications android pour un certain temps, et a suivi beaucoup de messages sur le cycle de vie de l'activité, et le cycle de vie de l'application.

je sais Activity.finish() appels de méthode quelque part dans le chemin à Activity.onDestroy() , et aussi enlever l'activité de la pile, et je suppose que d'une certaine façon, il pointe au système d'exploitation et collecteur de déchets qu'il peut" faire son tour " et libérer la mémoire quand il trouve un bon moment le faire....

je suis venu à ce post - est-ce que quitter une application est mal vu? et lire la réponse de Mark Murphy.

cela m'a quelque peu déconcerté sur ce que fait exactement la méthode finish() .

est-ce qu'il y a une chance que j'appelle finish() et onDestroy() ne sera pas appelé?

119
demandé sur Community 2012-06-01 13:13:01

12 réponses

lors de l'appel finish() sur une activité, la méthode onDestroy() est exécutée cette méthode peut faire des choses comme:

  1. rejeter tout dialogue que l'activité gérait.
  2. fermez les curseurs que l'activité gérait.
  3. Fermer tout dialogue de recherche ouvert

aussi, onDestroy() n'est pas destructeur. Il ne fait pas de détruire l'objet. C'est juste une méthode qui est basée sur un certain état. Donc votre instance est toujours vivante et très bien* après les runs et retours du onDestroy() de la superclass.Android maintient les processus autour dans le cas où l'utilisateur veut redémarrer l'application, ce qui rend la phase de démarrage plus rapide. Le processus ne fera rien et si la mémoire doit être récupérée, le processus sera tué

136
répondu K_Anas 2016-04-11 21:19:44

mes 2 cents sur @K_Anas réponse. J'ai effectué un test simple sur la méthode finish (). Répertorié important de méthodes de rappel de l'activité du cycle de vie

  1. l'Appel de finition() dans onCreate(): onCreate() -> onDestroy()
  2. l'Appel de finition() dans onStart() : onCreate() -> onStart() -> onStop() -> onDestroy()
  3. l'Appel de finition() dans onResume(): onCreate() -> onStart () - > onResume () - > onPause () - > onStop () - > onDestroy ()

ce que je veux dire, c'est que les contreparties des méthodes avec n'importe quelle méthode entre les deux sont appelées quand finish() est exécutée.

par exemple:

 onCreate() counter part is onDestroy()
 onStart() counter part is onStop()
 onPause() counter part is onResume()
52
répondu Prakash 2016-08-22 14:24:07

onDestroy() est destiné au nettoyage final - libérer des ressources que vous pouvez sur votre propre,la fermeture des connexions ouvertes,lecteurs,écrivains,etc. Si vous ne l'annulez pas, le système fait ce qu'il doit faire.

d'un autre côté, finish() permet simplement au système de savoir que le programmeur veut que le courant Activity soit terminé. Et donc, il appelle onDestroy() après ça.

quelque Chose à noter:

ce n'est pas faut que seulement un appel à finish() déclenche un appel à onDestroy() . Aucun. Comme nous le savons, le système android est libre de tuer des activités s'il estime qu'il ya des ressources nécessaires par l'actuel Activity qui sont nécessaires pour être libéré.

12
répondu Kazekage Gaara 2012-06-01 09:29:24

aussi noter Si vous appelez finish () après une intention, vous ne pouvez pas revenir à l'activité précédente avec le bouton" back

startActivity(intent);
finish();
9
répondu Dan Wears Prada 2017-04-12 08:11:26
La méthode

Finish () détruira l'activité courante. Vous pouvez utiliser cette méthode dans les cas où vous ne voulez pas que cette activité se charge encore et encore lorsque l'utilisateur appuie sur le bouton Précédent. En gros, ça élimine l'activité de la.pile actuelle.

6
répondu Udit Kapahi 2013-08-12 11:13:33

diverses réponses et notes prétendent que finish() peut sauter onPause() et onStop() et exécuter directement onDestroy(). Pour être honnête, la documentation Android sur ce ( http://developer.android.com/reference/android/app/Activity.html ) notes "L'activité se termine ou est détruite par le système" ce qui est assez ambigu mais pourrait suggérer que finish() peut sauter à onDestroy().

le JavaDoc à l'arrivée () est tout aussi décevant ( http://developer.android.com/reference/android/app/Activity.html#finish () ) et ne note pas réellement quelle(S) méthode (s) sont appelées en réponse à finish ().

donc j'ai écrit cette mini-application ci-dessous qui enregistre chaque État à l'entrée. Il inclut un bouton qui appelle finish() -- de sorte que vous pouvez voir les journaux des méthodes qui sont utilisées. Cette expérience suggère que finish () fait en effet aussi appel à onPause() et onStop(). Ici est la sortie que j'obtiens:

2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onCreate
2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onStart
2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onResume
2170-2170/? D/LIFECYCLE_DEMO﹕ User just clicked button to initiate finish() 
2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onPause
2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onStop 
2170-2170/? D/LIFECYCLE_DEMO﹕ INSIDE: onDestroy

package com.mvvg.apps.lifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AndroidLifecycle extends Activity {

    private static final String TAG = "LIFECYCLE_DEMO";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "INSIDE: onCreate");
        setContentView(R.layout.activity_main);
        LinearLayout layout = (LinearLayout) findViewById(R.id.myId);
        Button button = new Button(this);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(AndroidLifecycle.this, "Initiating finish()",
                        Toast.LENGTH_SHORT).show();
                Log.d(TAG, "User just clicked button to initiate finish()");
                finish();
            }

        });

        layout.addView(button);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "INSIDE: onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "INSIDE: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "INSIDE: onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "INSIDE: onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "INSIDE: onResume");
    }

}
4
répondu CoderOfTheNight 2015-05-11 12:25:09

@user3282164 selon le activité cycle de vie il devrait passer par onPause() -> onStop() -> onDestroy() en appelant finish() .

le diagramme ne montre aucune trajectoire droite entre [activité en cours] et [ onDestroy() ] causée par le système.

onStop () doc says " noter que cette méthode peut jamais être appelé, en mémoire basse les situations où le système n'a pas assez de mémoire pour maintenir le processus de votre activité après que sa méthode onPause() est appelée. "

3
répondu Marie 2017-01-10 11:16:46

mon étude montre que la méthode finish() place en fait certaines opérations de destruction dans la file d'attente, mais l'activité n'est pas détruite immédiatement. La destruction est prévue.

par exemple, si vous placez finish() dans onActivityResult() callback, alors que onResume() n'a pas encore couru, alors d'abord onResume() sera exécuté, et seulement après que onStop() et onDestroy() sont appelés.

NOTE: onDestroy() ne peut pas être appelé du tout, comme indiqué sur la documentation .

2
répondu rommex 2016-02-28 12:52:04

appelant finish in onCreate() n'appellera pas onDestroy () directement comme @prakash l'a dit. L'opération finish() ne commencera même pas tant que vous n'aurez pas retourné le contrôle à Android.

l'Appel de finition() dans onCreate() : onCreate() -> onStart() -> onResume() . Si l'utilisateur quitte l'application, il appellera - > onPause () - > onStop () - > onDestroy()

l'Appel de finition() dans onStart() : onCreate () - > onStart () - > onStop () - > onDestroy ()

Calling finish() in onResume () : onreate () - > onStart () - > onResume () - > onPause () - > onStop () - > onDestroy () "151970920

Pour la vérification des références de regarder cette oncreate continue après la finition & sur finish()

1
répondu anand krish 2017-05-23 12:18:15

en plus de la réponse de @rommex ci-dessus, j'ai aussi remarqué que finish() fait la queue pour la destruction de l'activité et que cela dépend de la priorité de l'activité.

si j'appelle finish() après onPause() , je vois onStop() , et onDestroy() immédiatement appelé.

si j'appelle finish() après onStop() , Je ne vois onDestroy() que 5 minutes plus tard.

D'après mes observations, on dirait la finition est mis en attente et quand j'ai regardé le adb shell dumpsys activity activities il était finishing=true , mais puisqu'il n'est plus au premier plan, il n'était pas prioritaire pour la destruction.

En résumé, onDestroy() n'est jamais garanti d'être appelé, mais même dans le cas où il est appelé, il pourrait être retardée.

1
répondu Brandon Lim 2018-08-31 04:25:27

il semble que la seule réponse correcte jusqu'ici ait été donnée par romnex:"onDestroy() ne peut pas être appelé du tout". Même si dans la pratique, dans presque tous les cas, il n'y a aucune garantie: la documentation on finish() ne fait que promettre que le résultat de l'activité est retransmis à l'appelant, mais rien de plus. De plus, la documentation sur le cycle de vie clarifie que l'activité peut être tuée par L'OS dès que l'onStop() finitions (ou même plus tôt sur les appareils plus anciens), qui, même si peu probable et donc rare à observer dans un test simple, pourrait signifier que l'activité pourrait être tuée pendant ou même avant onDestroy () est exécutée.

donc si vous voulez vous assurer qu'un peu de travail est fait quand vous appelez finish(), vous ne pouvez pas le mettre dans onDestroy(), mais vous devrez le faire au même endroit où vous appelez finish(), juste avant de l'appeler.

0
répondu urps 2016-04-09 00:59:46

finish () renvoie juste à l'activité précédente dans android, ou peut-être que vous pouvez dire qu'il va un pas en arrière dans l'application

-5
répondu kapil 2014-03-29 11:49:00