1. ホーム
  2. android

onCreateフローはfinish()の後も継続する。

2023-08-25 22:09:39

質問

の中からアクティビティを終了させたい。 onCreate メソッドの内部でアクティビティを終了させたいと思います。私が finish() , onDestroy() がすぐに呼び出されないと、コードは常に finish() . onDestroy() が呼び出されるのは onCreate() を閉じた後でないと呼び出されません。

にあたり onCreate() の記述は、developer.android.com/referenceにあります。

この関数内から finish() を呼び出すことができ、その場合 onDestroy()が直ちに呼び出されます。 アクティビティのライフサイクル(onStart(), onResume(), onPause(), etc.)を実行することなく、onDestroy()が即座に呼び出されます。

私が尋ねる理由は、次のとおりです。に渡されたBundleからデータをチェックしたいのです。 onCreate() . もちろん、私は何が onCreate に渡されるものをコントロールすることはできますが、やはり配信の時点でチェックされるべきだと思います。

私のコードには、クラス A というクラスがあり、これが Activity を開始します。 B . 私は、最後の2つの "if節の外側"タグが、呼び出されるべきではないと考えています。 finish メソッドで if ステートメントがアクティビティを破壊しているはずです。 これは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回目の終了の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): A クラス: 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();
  }
}