Me gustaría terminar una actividad desde dentro del onCreate
método. Cuando llamo finish()
, onDestroy()
no se llama inmediatamente, el código sigue fluyendo finish()
. onDestroy()
no se llama hasta después de la onCreate()
llave de cierre.
Según la onCreate()
descripción en developer.android.com/reference.
Puede llamar a finish () desde esta función, en cuyo caso onDestroy () se llamará inmediatamente sin que se ejecute nada del 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 transferido a onCreate()
. Por supuesto, tengo el control de lo que se pasa onCreate
, pero sigo pensando que debería comprobarse en el punto de entrega.
Mi código contiene class A
, que inicia Activity B
. Creo que las dos últimas etiquetas "fuera de la cláusula if" no deberían llamarse porque el finish
método en la if
declaración debería haber destruido la actividad. No tiene nada que ver con la cláusula if porque la línea de etiqueta después de la segunda finish()
llamada también se lee.
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 / tag (699): Clase A: goToBButton, onClick
11-26 15: 53: 40.636: INFO / etiqueta (699): Clase A: en pausa
11-26 15: 53: 40.865: INFO / tag (699): Clase B: una línea antes de la primera meta
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 de terminar
11-26 15: 53: 41.035: INFO / tag (699): Clase A: onResume
11-26 15: 53: 41.165: INFO / etiqueta (699): Clase B: onDestroy
Respuestas:
Supongo que se debe a que finish () no hace que el método onCreate regrese. Podrías 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(); } }
fuente
if
Parece
finish()
que no funciona hasta que seonCreate()
devuelve el control al sistema. Consulte esta publicación: acerca de finish () en Android . Debe considerar este problema si no desea que se ejecute nada de su código después de llamar a finish.Espero eso ayude.
fuente