il stream onCreate continua dopo la fine ()

Vorrei terminare un’attività all’interno del metodo onCreate . Quando chiamo finish() , onDestroy() non viene chiamato immediatamente, il codice continua a scorrere fino alla finish() . onDestroy() non viene chiamato fino a dopo la parentesi chiusa di onCreate() .

Per la descrizione di onCreate() su developer.android.com/reference.

È ansible chiamare finish () da questa funzione, nel qual caso onDestroy () verrà immediatamente chiamato senza il resto del ciclo di vita dell’attività (onStart (), onResume (), onPause (), ecc) in esecuzione.

Motivo che chiedo è: vorrei verificare i dati dal Bundle passati a onCreate() . Ovviamente ho il controllo su ciò che è passato a onCreate , ma penso che debba essere controllato al momento della consegna.

Il mio codice contiene la class A , che avvia l’attività B Credo che gli ultimi due tag “outside of if claus”, non dovrebbero essere chiamati perché il metodo di finish nella dichiarazione if avrebbe dovuto distruggere l’attività. Non ha nulla a che fare con la clausola if perché la tag line dopo la seconda chiamata a finish() viene ancora letta.

Il mio codice:

Classe 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 

Il mio codice 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 

Ecco i risultati dei miei tag:

11-26 15: 53: 40.456: INFO / tag (699): A Class: goToBButton, onClick

11-26 15: 53: 40.636: INFO / tag (699): Classe A: onPause

11-26 15: 53: 40.865: INFO / tag (699): Classe B: una riga prima della 1a fine

11-26 15: 53: 40.896: INFO / tag (699): Classe B: fuori da clausola if, prima della seconda finitura

11-26 15: 53: 40.917: INFO / tag (699): Classe B: fuori da clausola if, dopo la fine

11-26 15: 53: 41.035: INFO / tag (699): A Class: onResume

11-26 15: 53: 41.165: INFO / tag (699): Classe B: onDestroy

Suppongo che sia perché finish () non causa il ritorno del metodo onCreate. Potresti provare semplicemente ad aggiungere

 finish(); return; 

Oppure usa un altro

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

Sembra che finish() non funzioni finché onCreate() restituisce il controllo al sistema. Si prega di fare riferimento a questo post: about finish () in Android . È necessario considerare questo problema se non si desidera che il codice venga eseguito dopo aver terminato la chiamata.

Spero che sia d’aiuto.