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
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();
}
}
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.