web-dev-qa-db-fra.com

le flux onCreate continue après la fin ()

Je voudrais terminer une activité depuis l'intérieur de la méthode onCreate. Lorsque j'appelle finish(), onDestroy() n'est pas appelé immédiatement, le code continue de couler finish(). onDestroy() n'est appelée qu'après l'accolade fermante onCreate().

Par la description de onCreate() sur developer.Android.com/reference.

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

La raison pour laquelle je pose la question est: je voudrais vérifier les données du bundle passées à onCreate(). Bien sûr, j'ai le contrôle de ce qui est passé à onCreate, mais je pense toujours que cela devrait être vérifié au point de livraison.

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

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

My Code ClassB

    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): Classe A: 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 l'arrivée

11-26 15: 53: 41.035: INFO/tag (699): Classe A: onResume

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

74
flobacca

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 utilisez un if else

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

Il semble que finish() ne fonctionne pas tant que onCreate() ne retourne pas le contrôle au système. Veuillez vous référer à cet article: à propos de finish () dans Android . Vous devez considérer ce problème si vous ne voulez pas que votre code soit exécuté après avoir appelé finish.

J'espère que ça aide.

23
Hicham