studio programacion herramientas fundamentos con avanzado aplicaciones android oncreate

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(); } }