2010-04-20 12 views
6

Por lo tanto, dentro de mi aplicación hay un formulario para crear un nuevo usuario, con detalles relevantes e información sobre el usuario. No hay problemas allí, es solo lo que sucede cuando el usuario abandona la actividad sin presionar el botón confirmar.Android - Ciclo de vida y guardar una Instancia Estado preguntas

Esto es lo que quiero hacer:

  1. Si el usuario pulsa el botón de retroceso, intento de guardar todos los datos a la base de datos e informar al usuario.
  2. Si la actividad se interrumpe (es decir, mediante una llamada telefónica), guarde todos los datos en una ubicación temporal para que cuando la actividad vuelva a estar en la parte superior de la pila, nada parezca haber cambiado (pero los datos aún no aún se ha guardado en la base de datos).
  3. Si la actividad se elimina para obtener más recursos cuando está en segundo plano, haga lo mismo que en el punto 2 anterior (es decir, cuando la actividad se inicia nuevamente, parece que nada ha cambiado).
  4. Si toda la aplicación se inicia nuevamente (haciendo clic en el ícono nuevamente) y hay datos temporales almacenados en cualquiera de los puntos 2 o 3 anteriores, navegue a la actividad "crear usuario" y visualice los datos como si nada hubiera cambiado.

Así es como actualmente estoy tratando de hacerlo:

  • Uso onDestroy() y isFinishing() funciones de encontrar cuando se mató a la actividad, para cubrir el punto 1 (a continuación, tratar de salvar toda la información).
  • Guardar todos los datos con onSaveInstanceState en un paquete (para cubrir el punto 2 anterior)
  • ¿El paquete creado con onSaveInstanceState sobrevivir a la actividad que está siendo asesinados para obtener más recursos, por lo que cuando su recrea el estado anterior puede ser recuperada (como en el punto 3 arriba)?
  • Ni idea de cómo poner en práctica el punto 4.

Cualquier ayuda se agradece enormemente.

¡Salud!

+0

¿Está seguro de que tiene 3 y 4? Es un comportamiento estándar de Android para el sistema restablecer su pila de tareas y borrar la información cuando los usuarios se van por un largo tiempo, ya sea que la actividad haya sido eliminada o no, por lo que los usuarios esperan esto. Quizás un mejor plan que luchar contra el sistema es reducir la cantidad de información no guardable en una sola pantalla o rediseñar el flujo para que todo se pueda guardar en Pause(); tal vez tenga una pantalla para crear al usuario con su nombre, que solo se guarda al hacer clic en un botón "Crear", luego en una 2da pantalla para ingresar detalles, todo lo cual guarda onPause(). –

+0

Con el punto 3 y 4 creo que estoy tratando de replicar la aplicación de mensajes cuando los mensajes se guardan como borradores. Aunque cortar la información en una actividad con solo el nombre de usuario y otros detalles esenciales, con otras opciones en otra página parece beneficioso. Gracias. –

Respuesta

4

Tengo poco tiempo, así que no puedo dar una respuesta detallada, pero en breve, aquí están mis sugerencias.

  • En lugar de usar onDestroy(), utilice onPause(). Eso está garantizado para ser llamado; de acuerdo con la documentación oficial sobre Lifecycles, solo onPause() está garantizado. onStop y onDestroy no lo son.
  • onSaveInstanceState y onPause son similares. Ambos se llaman cuando la aplicación sale del primer plano (es decir, entra en la zona de peligro potencial por la muerte), pero la diferencia con oSIS es el paquete temporal que proporciona. onPause no proporciona ningún mecanismo de almacenamiento de datos, pero si está utilizando una base de datos, ya tiene una. Según la documentación, no hay un orden garantizado al que se llama primero.
  • punto 3) Eso es exactamente lo OSiS es para
  • punto 4) Se podría hacer una 'fila temporal' en su base de datos, es decir, guardar los datos temporales a la fila 1, pero cada vez que un proceso de almacenamiento se hace correctamente, la fila 1 se en blanco. Luego, en su onCreate(), verifique si la fila 1 tiene datos reales o si está vacía.(Si sus columnas no pueden estar vacías, utilice valores de marcador de posición predeterminados que nunca aparecerían como parte del uso normal.)
+2

Una corrección menor en su 2da viñeta, según la documentación para 'onSaveInstanceState()': "No hay garantías sobre si ocurrirá antes o después de' onPause() '." – CommonsWare

+0

Editado, gracias por la información. –

+2

También tenga en cuenta que onSaveInstanceState() NO se invocará si la actividad está finalizando (dado que el usuario no volverá a esa instancia), y puede verificar isFinishing() en onPause(). – hackbod

1

Sugiero que cree un mecanismo uniforme para guardar el estado temporal. Puede usar cualquiera de los mecanismos sugeridos por Android reference en lugar del paquete

+0

Por alguna razón no lo había pensado así, estaba cegado tratando de usar paquetes, etc. De esta forma estaré en completo control, por lo que debería ser bastante fácil de modificar si lo veo conveniente. –

Cuestiones relacionadas