Ich möchte eine Aktivität innerhalb der onCreate
Methode beenden . Wenn ich anrufe finish()
, onDestroy()
nicht sofort aufgerufen wird, fließt der Code weiter vorbei finish()
. onDestroy()
wird erst nach der onCreate()
schließenden Klammer aufgerufen .
Gemäß der onCreate()
Beschreibung unter developer.android.com/reference.
Sie können finish () innerhalb dieser Funktion aufrufen. In diesem Fall wird onDestroy () sofort aufgerufen, ohne dass der Rest des Aktivitätslebenszyklus (onStart (), onResume (), onPause () usw.) ausgeführt wird.
Der Grund, den ich frage, ist: Ich möchte Daten aus dem an übergebenen Bundle überprüfen onCreate()
. Natürlich habe ich die Kontrolle darüber, was weitergegeben wird onCreate
, aber ich denke immer noch, dass es zum Zeitpunkt der Lieferung überprüft werden sollte.
Mein Code enthält eine Klasse A
, die Activity startet B
. Ich glaube, die letzten beiden "außerhalb der if-Klausel" -Tags sollten nicht aufgerufen werden, da die finish
Methode in der if
Anweisung die Aktivität hätte zerstören sollen. Es hat nichts mit der if-Klausel zu tun, da die Tag-Zeile nach dem zweiten finish()
Aufruf auch noch gelesen wird.
Mein Code:
Klasse 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
Mein 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
Hier sind die Ergebnisse meiner Tags:
11-26 15: 53: 40.456: INFO / tag (699): Eine Klasse: goToBButton, onClick
11-26 15: 53: 40.636: INFO / tag (699): Eine Klasse: onPause
11-26 15: 53: 40.865: INFO / Tag (699): B Klasse: eine Zeile vor dem 1. Ziel
11-26 15: 53: 40.896: INFO / tag (699): B Klasse: außerhalb der if-Klausel vor dem zweiten Ziel
11-26 15: 53: 40.917: INFO / tag (699): B Klasse: außerhalb der if-Klausel nach Beendigung
11-26 15: 53: 41.035: INFO / tag (699): Eine Klasse: onResume
11-26 15: 53: 41.165: INFO / tag (699): B Klasse: onDestroy
Antworten:
Ich vermute, dass es daran liegt, dass finish () die onCreate-Methode nicht zurückgibt. Sie könnten versuchen, einfach hinzuzufügen
finish(); return;
Oder verwenden Sie ein if else
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layoutb); if(good data){ //do stuff }else{ finish(); } }
quelle
if
Es scheint, als würde
finish()
es nicht funktionieren, bisonCreate()
die Kontrolle an das System zurückgegeben wird. Bitte beziehen Sie sich auf diesen Beitrag: about finish () in android . Sie müssen dieses Problem berücksichtigen, wenn Sie nicht möchten, dass Ihr Code nach dem Aufruf von finish ausgeführt wird.Ich hoffe es hilft.
quelle