onCreate
メソッド内からアクティビティを終了したいと思います。 finish()
を呼び出すと、onDestroy()
はすぐには呼び出されず、コードはfinish()
を通過し続けます。 onDestroy()
は、onCreate()
閉じ括弧の後まで呼び出されません。
Developer.Android.com/referenceのonCreate()
の説明に従って。
この関数内からfinish()を呼び出すことができます。この場合、onDestroy()は、アクティビティライフサイクル(onStart()、onResume()、onPause()など)を実行せずにすぐに呼び出されます。
私が尋ねる理由は:onCreate()
に渡されたバンドルのデータを確認したいです。もちろん、onCreate
に渡すものを制御できますが、配信時にチェックする必要があると思います。
私のコードには、アクティビティA
を開始するクラスB
が含まれています。 finish
ステートメントのif
メソッドがアクティビティを破壊したはずなので、最後の2つの「if節外」タグは呼び出さないでください。 2番目のfinish()
呼び出しの後のタグ行もまだ読み取られるため、if節とは関係ありません。
私のコード:
クラス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
私のコード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
タグの結果は次のとおりです。
11-26 15:53:40.456:INFO/tag(699):Aクラス:goToBButton、onClick
11-26 15:53:40.636:INFO/tag(699):Aクラス:onPause
11-26 15:53:40.865:INFO/tag(699):Bクラス:最初のフィニッシュの1行前
11-26 15:53:40.896:INFO/tag(699):Bクラス:if節の外側、2番目の終了前
11-26 15:53:40.917:INFO/tag(699):Bクラス:if句の外側、終了後
11-26 15:53:41.035:INFO/tag(699):クラス:onResume
11-26 15:53:41.165:INFO/tag(699):Bクラス:onDestroy
Finish()がonCreateメソッドを返さないためだと思います。単純に追加してみてください
finish();
return;
または、if elseを使用します
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layoutb);
if(good data){
//do stuff
}else{
finish();
}
}
finish()
は、onCreate()
が制御をシステムに戻すまで機能しないようです。この投稿を参照してください: Androidのfinish()について 。 finishを呼び出した後にコードを実行したくない場合は、この問題を考慮する必要があります。
それが役に立てば幸い。