2010-06-27 19 views
10

Me he encontrado con problemas últimamente con onSaveInstanceState() y onRestoreInstanceState(). Tengo varias actividades que usan estos métodos para guardar el estado en el caso de que el sistema los limpie. La mayoría de ellos funcionan, excepto uno, y no tengo idea de por qué.onRestoreInstanceState() no se llama cuando se espera

Lo que pasa es específicamente lo siguiente:

  • tengo mi emulador en funcionamiento, y la configuración de las herramientas dev a destroy() todas las actividades cuando ya no son visibles. (Para que pueda probar que guardar/restaurar funciona correctamente)
  • La actividad en cuestión se inicia y procedo a cambiar parte de su estado.
  • Empiezo una nueva actividad, la dejo funcionar por un momento, y luego uso el botón 'volver' para ir a mi actividad anterior.
  • Al volver a la actividad en cuestión, veo que el estado predeterminado está de vuelta, por lo tanto, no tiene el estado que debería.

me he dado cuenta de que el onSaveInstanceState() se llama, onCreate() se llama, pero tiene un paquete nulo, y onRestoreInstanceState() nunca es llamado.

¿Alguien ha visto esto antes?

+0

Lo siento, sé que esto preguntas hace mucho tiempo pero ¿cómo salvaste el estado de tu actividad? ¿Podrías por favor mirar mi pregunta? http://stackoverflow.com/questions/26142255/retrieve-an-activity-after-time-out-warning-notification – Hamid

Respuesta

3

Creo que he resuelto el problema, y ​​es con detalles que no revelé en la pregunta original.

Una de las cosas que estoy guardando en mi paquete es bastante grande (un mapa de bits de 500x1000 píxeles). Cuando lo eliminé de mi paquete, se guardó todo lo demás, se llamó al método onCreate() con el paquete y también se llamó a onRestoreInstanceState().

Por lo tanto, creo que hay un paquete de tamaño máximo que puede guardar en onSaveInstanceState(), que no está documentado. (Al menos por lo que yo puedo decir)

4

Es posible que la configuración de las herramientas de desarrollo que está utilizando no tenga el comportamiento esperado.

Si quiere probar onSaveInstanceState()/onRestoreInstanceState(), lo más simple es cambiar la orientación (<Ctrl>-<F11>). De forma predeterminada, su actividad se destruye y se recrea utilizando el estado de la instancia.

+0

Gracias por su respuesta. Algo que no mencioné es que he bloqueado esta Actividad con los siguientes atributos en el Manifiesto: android: configChanges = "keyboardHidden | orientation" android: screenOrientation = "portrait" –

+0

Traté de cambiar la orientación y eso hizo call ' método onRestoreInstanceState() '. Pero no restauro la variable en este método y todavía mi EditText había ingresado valores previamente, en lugar de no tener nada. ¿Puedes explicar? – Geek

+0

@Akash: hay una implementación incorporada de 'onSaveInstanceState()' y 'onRestoreInstanceState()' que maneja un estado de widget obviamente mutable por el usuario, como el texto en un 'EditText'. – CommonsWare