2011-11-26 10 views
62

onCreateメソッドの中からアクティビティを終了します。 finish()と呼び出すと、すぐにonDestroy()が呼び出されず、コードはfinish()を流れ続けます。 onDestroy()は、onCreate()の閉じ括弧の後に呼び出されます。完了後にフローを作成します。

onCreate()(developer.android.com/reference)に記載されています。

あなたは)(その場合 onDestroy()で、すぐに アクティビティのライフサイクル(ONSTART()、onResume()、onPauseの残りのいずれかなしに呼び出され、この関数内からフィニッシュ()を呼び出すことができます、等)を実行する。

理由:私はonCreate()に渡されたバンドルからのデータをチェックしたいと思います。もちろん、私はonCreateに渡されるもののコントロールを持っていますが、私はまだそれが配信時点でチェックされるべきだと思います。

私のコードにはアクティビティBを開始するクラスAが含まれています。私は、ifステートメントのfinishメソッドがアクティビティを破壊しているはずであるため、最後の2つの "if clauseの外"タグを呼び出すべきではないと考えています。 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 /タグ(699):クラス:goToBButton、onClick

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

11-26 15 onPause:53:40.865:INFO /タグ(699):Bクラス:一行前第1仕上げ

11-26 15:53:40.896:/タグ情報(699):Bクラス:53:40.917:INFO /タグ句場合の外、 第

11-26 15を完了する前(699):Bクラス:if節の外側、 終了後

11-26 15:53:41.035:INFO /タグ(699):Aクラス:onResume

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

+0

"即座に"ドキュメントの非常に悪い言葉の選択だった... – Karu

答えて

103

私はフィニッシュ()が返すようにのonCreateメソッドを起こさないので、それがあることを推測しています。あなたは、単に

finish(); 
return; 

を追加してみてください、またはそれがfinish()ように思える場合は、他の

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layoutb); 
    if(good data){ 
     //do stuff 
    }else{ 
     finish(); 
    } 
} 
+3

"単純にリターン"の最初の提案が働いた!復帰後、再開時にClassAが呼び出され、クラスB onDestroyが呼び出されます。 – flobacca

+1

単にリターンを追加します。その後、到達不能なコードに対するエラーが表示されます。これを回避するには、確認のために 'if'の返信を – Onimusha

19

がシステムにonCreate()復帰制御までは動作しません使用することができます。この投稿:about finish() in androidを参照してください。 finishを呼び出した後にコードを実行したくない場合は、この問題を考慮する必要があります。

希望します。

+0

にしてください。 – flobacca

関連する問題