onCreate el flujo continúa después de finalizar ()

76

Me gustaría terminar una actividad desde dentro del onCreatemé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 finishmétodo en la ifdeclaració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

Flobacca
fuente
"inmediatamente" fue una elección de palabras muy pobre en los documentos ...
Karu

Respuestas:

122

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();
  }
}
disparos
fuente
4
¡La primera sugerencia de "simplemente agregar retorno" funcionó! Una vez que vuelve, se llama a ClassA on resume, luego se llama a Class B onDestroy.
flobacca
1
Simplemente agregando retorno; muestra errores a partir de entonces para el código inalcanzable. Para evitar esto, use la devolución enif
Onimusha
23

Parece finish()que no funciona hasta que se onCreate()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.

Hicham
fuente