75 votes

le flux onCreate continue après finish()

J'aimerais terminer une activité à partir de l'intérieur de l'espace de travail. onCreate méthode. Lorsque j'appelle finish() , onDestroy() n'est pas immédiatement appelé, le code continue à passer devant finish() . onDestroy() n'est pas appelé avant que le onCreate() l'accolade de fermeture.

Par le onCreate() description à l'adresse developer.Android.com/reference.

Vous pouvez appeler finish() à partir de cette fonction, auquel cas onDestroy() sera immédiatement appelé sans le reste du cycle de vie de l'activité cycle de vie de l'activité (onStart(), onResume(), onPause(), etc.).

La raison de ma question est la suivante : Je voudrais vérifier les données du Bundle transmis à onCreate() . Bien sûr, j'ai le contrôle de ce qui est transmis à onCreate mais je continue à penser qu'il devrait être contrôlé au moment de la livraison.

Mon code contient la classe A qui commence par l'activité B . Je pense que les deux dernières balises "en dehors de la clause if" ne devraient pas être appelées parce que la balise finish dans la méthode if La déclaration aurait dû détruire l'activité. Cela n'a rien à voir avec la clause if, car la ligne de balise après la deuxième instruction finish() L'appel est toujours aussi lu.

Mon code :

Classe A

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // goToBButton: when pressed sends message to class B.    
    Button goToBButton = (Button)this.findViewById(R.id.go_to__b_btn);
    goToBButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick (View v) {      
            Log.i(TAG,"A Class: goToBButton, onClick");
            Intent i = new Intent(A.this, B.class);
            startActivityForResult(i,REQ_TO_B);
        }       
    });                
} // end onCreate

Mon code ClasseB

    public class B extends Activity{

private static final String TAG = "tag";

@Override
   public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);

  // set as true, should always print Tag: one line before first finish"
  if (true)  {

    Log.i(TAG,"B Class: one line before 1st finish");
    finish();
  }

  // shouldn't get here after first finish
  Log.i(TAG,"B Class: outside of if clause, before second finish");
  finish();
  // shouldn't get here after second finish
  Log.i(TAG,"B Class: outside of if clause, after finish");                  
   } // end onCreate

@Override
public void onStart () {
    super.onStart();
    Log.i(TAG,"B Class: onStart");
}

@Override
public void onRestart() {
    super.onRestart();
    Log.i(TAG,"B Class: onRestart");
}

@Override
public void onResume () {
    super.onResume();
    Log.i(TAG,"B Class: onResume");
}

@Override
public void onPause () {
    super.onPause();
    Log.i(TAG,"B Class: onPause");
}

@Override
public void onStop () {
    super.onStop();
    Log.i(TAG,"B Class: onStop");
}

@Override
public void onDestroy () {
    super.onDestroy();
    Log.i(TAG,"B Class: onDestroy");
}

 } // end B Class

Voici les résultats de mes tags :

11-26 15:53:40.456 : INFO/tag(699) : Classe A : goToBButton, onClick

11-26 15:53:40.636 : INFO/tag(699) : Une classe : onPause

11-26 15:53:40.865 : INFO/tag(699) : Classe B : une ligne avant la 1ère arrivée

11-26 15:53:40.896 : INFO/tag(699) : Classe B : en dehors de la clause if, avant la deuxième arrivée

11-26 15:53:40.917 : INFO/tag(699) : Classe B : en dehors de la clause if, après la fin

11-26 15:53:41.035 : INFO/tag(699) : Une classe : onResume

11-26 15:53:41.165 : INFO/tag(699) : Classe B : onDestroy

118voto

triggs Points 2986

Je suppose que c'est parce que finish() ne provoque pas le retour de la méthode onCreate. Vous pouvez essayer d'ajouter simplement

finish();
return;

Ou utiliser un if else

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);
  if(good data){
      //do stuff
  }else{
      finish();
  }
}

23voto

Hicham Points 448

Il semble que finish() ne fonctionne pas jusqu'à ce que onCreate() retourner le contrôle au système. Veuillez vous référer à ce post : à propos de finish() dans Android . Vous devez prendre en compte ce problème si vous ne voulez pas qu'une partie de votre code soit exécutée après avoir appelé finish.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X