Estoy tratando de guardar y restaurar el estado de un Activity
usando los métodos onSaveInstanceState()
y onRestoreInstanceState()
.
El problema es que nunca ingresa al onRestoreInstanceState()
método. ¿Alguien puede explicarme por qué es esto?
android
android-activity
states
BlaBRA
fuente
fuente
Respuestas:
Por lo general, restaura su estado
onCreate()
. Es posible restaurarloonRestoreInstanceState()
también, pero no es muy común. (onRestoreInstanceState()
se llama despuésonStart()
, mientras queonCreate()
se llama antesonStart()
.Use los métodos put para almacenar valores en
onSaveInstanceState()
:Y restaurar los valores en
onCreate()
:fuente
onRestoreInstanceState()
solo se llama cuando se recrea la actividad después de que el sistema operativo la eliminó . Tal situación ocurre cuando:Por el contrario: si está en su actividad y
Back
presiona el botón en el dispositivo, su actividad se termina () edita (es decir, piensa que es una aplicación de escritorio existente) y la próxima vez que inicie su aplicación, se iniciará "fresca", es decir, sin estado guardado porque lo saliste intencionalmente cuando golpeasteBack
.Otra fuente de confusión es que cuando una aplicación pierde el foco
onSaveInstanceState()
se llama a otra aplicación, pero cuando navegas de regreso a tu aplicación, esonRestoreInstanceState()
posible que no se llame. Este es el caso descrito en la pregunta original, es decir, si su actividad NO se eliminó durante el período en que otra actividad estaba al frenteonRestoreInstanceState()
NO se llamará porque su actividad está prácticamente "viva".En general, como se indica en la documentación para
onRestoreInstanceState()
:Mientras lo leo: no hay razón para anular a
onRestoreInstanceState()
menos que esté subclasificandoActivity
y se espera que alguien subclasifique su subclase.fuente
El estado en el que guarda
onSaveInstanceState()
está disponible más tarde en laonCreate()
invocación del método. Entonces useonCreate
(y suBundle
parámetro) para restaurar el estado de su actividad.fuente
Como solución alternativa, puede almacenar un paquete con los datos que desea mantener en la intención que utiliza para iniciar la actividad A.
La Actividad A tendría que devolver esto a la Actividad B. Recuperaría la intención en el método onCreate de la Actividad B.
Otra idea es crear una clase de repositorio para almacenar el estado de la actividad y hacer que cada una de sus actividades haga referencia a esa clase (posible utilizando una estructura singleton). Sin embargo, hacerlo probablemente sea más problemático de lo que vale.
fuente
Lo principal es que si no almacena en,
onSaveInstanceState()
entoncesonRestoreInstanceState()
no será llamado. Esta es la principal diferencia entrerestoreInstanceState()
yonCreate()
. Asegúrate de guardar algo realmente. Lo más probable es que este sea tu problema.fuente
Descubrí que onSaveInstanceState siempre se llama cuando otra actividad aparece en primer plano. Y también lo es onStop.
Sin embargo, onRestoreInstanceState solo se llamó cuando onCreate y onStart también se llamaron. Y, onCreate y onStart NO siempre se llamaban.
Por lo tanto, parece que Android no siempre elimina la información de estado, incluso si la Actividad se mueve a un segundo plano. Sin embargo, llama a los métodos del ciclo de vida para guardar el estado solo para estar seguro. 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.
fuente
Creo que este hilo era bastante viejo. Solo menciono otro caso, que
onSaveInstanceState()
también se llamará, es cuando llamasActivity.moveTaskToBack(boolean nonRootActivity)
.fuente
Si está manejando los cambios de orientación de la actividad con
android:configChanges="orientation|screenSize"
yonConfigurationChanged(Configuration newConfig)
,onRestoreInstanceState()
no se llamará.fuente
No es necesario que onRestoreInstanceState siempre se llame después de onSaveInstanceState.
Tenga en cuenta que: onRestoreInstanceState siempre se llamará, cuando se gira la actividad (cuando no se maneja la orientación) o abra su actividad y luego abra otras aplicaciones para que el sistema operativo borre su instancia de actividad de la memoria.
fuente
De la documentación Restaurar el estado de la IU de la actividad utilizando el estado de instancia guardado se indica como:
En mi opinión, esta es una forma más clara que verificar esto en onCreate, y se ajusta mejor con el principio de responsabilidad única.
fuente
En mi caso,
onRestoreInstanceState
se llamó cuando la actividad se reconstruyó después de cambiar la orientación del dispositivo.onCreate(Bundle)
se llamó primero, pero el paquete no tenía la clave / los valores que configuréonSaveInstanceState(Bundle)
.Justo después,
onRestoreInstanceState(Bundle)
fue llamado con un paquete que tenía la clave / valores correctos.fuente
Me encontré con esto y me di cuenta de que la documentación tenía mi respuesta:
"Esta función nunca se llamará con un estado nulo".
https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)
En mi caso, me preguntaba por qué no se llamaba a onRestoreInstanceState en la instanciación inicial. Esto también significa que si no almacena nada, no se llamará cuando vaya a reconstruir su vista.
fuente
Puedo hacer eso (lo siento, es C #, no Java, pero no es un problema ...):
Y EN TU ACTIVIDAD PARA EL RESULTADO
FINALMENTE
fuente