android - programacion - El flujo de onCreate continúa después de finalizar()
manual de android en pdf (2)
Me gustaría finalizar una actividad desde dentro del método onCreate
. Cuando llamo a finish()
, onDestroy()
no se llama de inmediato, el código sigue fluyendo pasado finish()
. onDestroy()
no se llama hasta después de la onCreate()
cierre onCreate()
.
Según la descripción de onCreate()
en developer.android.com/reference.
Puede llamar a finish () desde esta función, en cuyo caso se llamará inmediatamente a onDestroy () sin que se ejecute el resto del ciclo de vida de la actividad (onStart (), onResume (), onPause (), etc.).
La razón por la que pregunto es: me gustaría verificar los datos del paquete pasado a onCreate()
. Por supuesto, tengo control de lo que se pasa a onCreate
, pero sigo creyendo que debería verificarse en el momento de la entrega.
Mi código contiene la clase A
, que inicia la Actividad B
Creo que las dos últimas etiquetas "fuera de si cláusula" no deberían llamarse porque el método de finish
en la sentencia if
debería haber destruido la actividad. No tiene nada que ver con la cláusula if porque la línea de la etiqueta después de la segunda llamada a finish()
también sigue siendo leída.
Mi código:
Clase 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
Mi código 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
Aquí están los resultados de mis etiquetas:
11-26 15: 53: 40.456: INFO / etiqueta (699): Clase A: goToBButton, onClick
11-26 15: 53: 40.636: INFO / tag (699): Clase A: onPause
11-26 15: 53: 40.865: INFO / tag (699): Clase B: una línea antes del 1er final
11-26 15: 53: 40.896: INFO / tag (699): Clase B: fuera de la cláusula if, antes del segundo final
11-26 15: 53: 40.917: INFO / tag (699): Clase B: fuera de la cláusula if, después del final
11-26 15: 53: 41.035: INFO / tag (699): Clase A: onResume
11-26 15: 53: 41.165: INFO / tag (699): Clase B: onDestroy
Parece que finish()
no funciona hasta que onCreate()
devuelva el control al sistema. Por favor, consulte esta publicación: about finish () en android . Debe considerar este problema si no desea que se ejecute ningún código después de finalizar la llamada.
Espero eso ayude.
Supongo que es porque finish () no hace que el método onCreate vuelva. Puedes intentar simplemente agregar
finish();
return;
O usa un if else
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layoutb);
if(good data){
//do stuff
}else{
finish();
}
}