76

onCreateメソッド内からアクティビティを終了したいと思います。を呼び出すとfinish()onDestroy()がすぐに呼び出されず、コードが を通過し続けますfinish()。閉じ中括弧onDestroy()の後まで呼び出されません。onCreate()

onCreate()developer.android.com/referenceの説明に従ってください。

この関数内から finish() を呼び出すことができます。この場合、残りのアクティビティ ライフサイクル (onStart()、onResume()、onPause() など) が実行されることなく、onDestroy() がすぐに呼び出されます。

質問する理由: に渡されたバンドルのデータを確認したいonCreate()。もちろん、 に何を渡すかは私が管理していonCreateますが、それでも配達時にチェックする必要があると思います。

A私のコードには、 Activity を開始するclass が含まれていますB。ステートメントfinish内のメソッドがアクティビティを破棄する必要があるため、最後の 2 つの「if 句の外側」タグを呼び出すべきではないと思います。2 番目の呼び出しの後のタグ行も読み取られるifため、if 句とは関係ありません。finish()

私のコード:

クラス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): クラス: goToBButton、onClick

11-26 15:53:40.636: 情報/タグ (699): クラス: onPause

11-26 15:53:40.865: INFO/tag(699): B クラス: 1st フィニッシュの 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: 情報/タグ (699): クラス: onResume

11-26 15:53:41.165: 情報/タグ (699): B クラス: onDestroy

4

2 に答える 2

123

それは、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();
  }
}
于 2011-11-27T00:21:15.330 に答える
23

システムに制御を戻すfinish()まで動作しないようです。onCreate()この投稿を参照してください:Androidのfinish()について。finishの呼び出し後にコードを実行したくない場合は、この問題を考慮する必要があります。

それが役に立てば幸い。

于 2011-11-27T00:31:53.260 に答える