onrestart onnewintent management finish create activity activities android android-activity states

android - onnewintent - onSaveInstanceState() y onRestoreInstanceState()



onrestart android (12)

Como solución alternativa, puede almacenar un paquete con los datos que desea mantener en la intención que usa para iniciar la actividad A.

Intent intent = new Intent(this, ActivityA.class); intent.putExtra("bundle", theBundledData); startActivity(intent);

La actividad A tendría que pasar esto de vuelta a la actividad B. Recuperarías el intento en el método onCreate de la actividad B.

Intent intent = getIntent(); Bundle intentBundle; if (intent != null) intentBundle = intent.getBundleExtra("bundle"); // Do something with the data.

Otra idea es crear una clase de repositorio para almacenar el estado de actividad y hacer que cada una de sus actividades haga referencia a esa clase (es posible usar una estructura singleton). Sin embargo, hacerlo probablemente sea más problemático de lo que vale.

Estoy tratando de guardar y restaurar el estado de una Activity usando los métodos onSaveInstanceState() y onRestoreInstanceState() .

El problema es que nunca entra en el método onRestoreInstanceState() . ¿Alguien puede explicarme por qué es esto?


Creo que este hilo era bastante viejo. Solo menciono otro caso, que también se llamará a onSaveInstanceState() cuando llame a Activity.moveTaskToBack(boolean nonRootActivity) .


Descubrí que onSaveInstanceState siempre se invoca cuando otra actividad aparece en primer plano. Y así es onStop.

Sin embargo, onRestoreInstanceState se invocó solo cuando también se llamaron onCreate y onStart. Y, onCreate y onStart NO siempre fueron llamados.

Por lo tanto, parece que Android no siempre borra la información del estado, incluso si la actividad se mueve al fondo. Sin embargo, llama a los métodos del ciclo de vida para guardar el estado solo para estar seguros. Por lo tanto, si el estado no se elimina, Android no llama a los métodos del ciclo de vida para restaurar el estado ya que no son necesarios.

La figura 2 describe esto.


El estado que guarda en onSaveInstanceState() está disponible más tarde en la invocación del método onCreate() . Así que use onCreate (y su parámetro Bundle ) para restaurar el estado de su actividad.


En mi caso, se onRestoreInstanceState cuando se reconstruyó la actividad después de cambiar la orientación del dispositivo. onCreate(Bundle) se llamó primero, pero el paquete no tenía la clave / valores que establecí con onSaveInstanceState(Bundle) .

Inmediatamente después, se onRestoreInstanceState(Bundle) con un paquete que tenía las claves / valores correctos.


Lo principal es que si no almacena en onSaveInstanceState() entonces no se onRestoreInstanceState() . Esta es la principal diferencia entre restoreInstanceState() y onCreate() . Asegúrate de que realmente guardes algo. Lo más probable es que este sea tu problema.



No es necesario que onRestoreInstanceState siempre se invoque después de onSaveInstanceState.

Tenga en cuenta que: onRestoreInstanceState siempre se invocará cuando se gire la actividad (cuando no se gestiona la orientación) o cuando se abra su actividad y luego abra otras aplicaciones para que el OS elimine su instancia de actividad de la memoria.


Por lo general, restaura su estado en onCreate() . También es posible restaurarlo en onRestoreInstanceState() , pero no es muy común. ( onRestoreInstanceState() se onStart() después de onStart() , mientras que onCreate() se onStart() antes de onStart() .

Use los métodos put para almacenar valores en onSaveInstanceState() :

protected void onSaveInstanceState(Bundle icicle) { super.onSaveInstanceState(icicle); icicle.putLong("param", value); }

Y restaurar los valores en onCreate() :

public void onCreate(Bundle icicle) { if (icicle != null){ value = icicle.getLong("param"); } }

No es necesario almacenar estados de vista, ya que se almacenan automáticamente llamando a super.onSaveInstanceState (icicle) ;.


Puedo hacer eso (lo siento es c # no Java, pero no es un problema ...):

private int iValue = 1234567890; function void MyTest() { Intent oIntent = new Intent (this, typeof(Camera2Activity)); Bundle oBundle = new Bundle(); oBundle.PutInt("MYVALUE", iValue); //=> 1234567890 oIntent.PutExtras (oBundle); iRequestCode = 1111; StartActivityForResult (oIntent, 1111); }

Y EN SU ACTIVIDAD PARA EL RESULTADO

private int iValue = 0; protected override void OnCreate(Bundle bundle) { Bundle oBundle = Intent.Extras; if (oBundle != null) { iValue = oBundle.GetInt("MYVALUE", 0); //=>1234567890 } } private void FinishActivity(bool bResult) { Intent oIntent = new Intent(); Bundle oBundle = new Bundle(); oBundle.PutInt("MYVALUE", iValue);//=>1234567890 oIntent.PutExtras(oBundle); if (bResult) { SetResult (Result.Ok, oIntent); } else SetResult(Result.Canceled, oIntent); GC.Collect(); Finish(); }

FINALMENTE

protected override void OnActivityResult(int iRequestCode, Android.App.Result oResultCode, Intent oIntent) { base.OnActivityResult (iRequestCode, oResultCode, oIntent); iValue = oIntent.Extras.GetInt("MYVALUE", -1); //=> 1234567890 }


Si está manejando los cambios de orientación de la actividad con android:configChanges="orientation|screenSize" y onConfigurationChanged(Configuration newConfig) , onRestoreInstanceState() no se onRestoreInstanceState() .


onRestoreInstanceState() se onRestoreInstanceState() solo cuando se recrea actividad después de que el sistema operativo lo mató . Tal situación sucede cuando:

  • la orientación del dispositivo cambia (su actividad se destruye y recrea)
  • hay otra actividad delante de usted y en algún momento el SO mata su actividad para liberar memoria (por ejemplo). La próxima vez que inicie su actividad se onRestoreInstanceState() .

En contraste: si está en su actividad y presiona el botón Back en el dispositivo, su actividad finaliza () ed (es decir, piense que se trata de una aplicación de escritorio) y la próxima vez que inicie su aplicación se inicia "nueva", es decir sin estado guardado porque intencionalmente saliste cuando tocas Back .

Otra fuente de confusión es que cuando una aplicación pierde el foco en otra aplicación se llama a onSaveInstanceState() pero cuando navega de regreso a su aplicación no se puede llamar onRestoreInstanceState() . Este es el caso descrito en la pregunta original, es decir, si su actividad NO fue eliminada durante el período en el que estaba onRestoreInstanceState() otra actividad onRestoreInstanceState() NO se llamará porque su actividad está prácticamente "viva".

En general, como se indica en la documentación de onRestoreInstanceState() :

La mayoría de las implementaciones simplemente usarán onCreate (Bundle) para restaurar su estado, pero a veces es conveniente hacerlo aquí después de que se haya realizado toda la inicialización o para permitir que las subclases decidan si usarán su implementación predeterminada. La implementación predeterminada de este método realiza una restauración de cualquier estado de vista que haya sido previamente congelado por onSaveInstanceState (Bundle).

A medida que lo leo: no hay ninguna razón para anular onRestoreInstanceState() menos que esté subclasificando Activity y se espera que alguien pueda subclasificar su subclase.