2009-12-22 18 views
88

Estoy creando una aplicación de búsqueda de eventos, establezco los criterios de búsqueda de una pantalla en otra pantalla y el usuario puede editar los criterios de búsqueda desde la 3ª pantalla y va a la 4ª pantalla.Ciclo de vida de objetos estáticos Android

Para lograr la tarea anterior, estoy usando un objeto estático que recuerda los valores de la aplicación y no necesito hacer nada extra.

Pero me temo que si sobre el ciclo de vida del objeto estático en Android si la memoria baja se encuentra android eliminar objetos estáticos ???

Como android admite tareas múltiples, si el usuario cambia a otra aplicación y cuando el usuario vuelve la aplicación comienza a actuar de forma alocada, ¿se elimina el objeto estático cuando se realiza una tarea múltiple? alguna idea ?? y también sugieren mantener el objeto estático a través del método singleton es un mejor enfoque ???

Respuesta

215

Comencemos con un poco de antecedentes: ¿Qué sucede cuando inicia una aplicación?
El SO inicia un proceso y le asigna una identificación de proceso única y asigna una tabla de proceso. Un proceso inicia una instancia de DVM (Dalvik VM); Cada aplicación se ejecuta dentro de un DVM.
A DVM gestiona la clase de descarga de carga, ejemplo del ciclo de vida, GC etc.

vida útil de una variable estática: una variable estática entra en existencia cuando una clase se carga por la JVM y muere cuando se descarga la clase.

Así que si crea una aplicación para Android e inicializar una variable estática, que permanecerá en la JVM hasta que uno de los siguientes casos: 1.
la clase se descarga
2. la JVM se apaga
3. el proceso muere

Tenga en cuenta que el valor de la variable estática persistirá cuando cambie a una actividad diferente de otra aplicación y ninguno de los tres anteriores ocurra. Si ocurre cualquiera de los tres anteriores, la estática perderá su valor.

Puede probar esto con unas pocas líneas de código:

  1. de impresión sin inicializar la estática en onCreate de su actividad -> debe imprimir nula
  2. inicializar la estática. imprimirlo -> valor sería no nulo
  3. Pulse el botón Atrás y vaya a la pantalla de inicio. Nota: la pantalla de inicio es otra actividad.
  4. Inicie su actividad nuevamente -> la variable estática será no nula
  5. Elimine su proceso de solicitud de DDMS (botón de detención en la ventana de dispositivos).
  6. Reinicia tu actividad -> la estática tendrá valor nulo.

Espero que ayude.

+11

Esta es una gran explicación, y debería ser obligatoria para cualquier desarrollador de Android. –

+1

Quiero saber por qué pierdo el valor de mi campo en el objeto de aplicación si no es estático cuando comienzo una nueva actividad, por ejemplo, declaro una página actual variable en el objeto de la aplicación y su valor siempre vuelve a cero cuando abro la nueva actividad –

+0

cuando llamo super.onRestoreInstanceState (savedInstanceState); Pierdo mi variable incluso si son estáticas, ¿cuál es el problema? –

14

Bueno, el patrón Singleton también se basa en el uso de variables estáticas por lo que en realidad estaría en la misma posición. Si bien el enfoque estático puede funcionar la mayoría de las veces, puede suceder que en algunos casos cuando la memoria esté llena y otra actividad tome el primer plano antes de que su aplicación pase a la siguiente pantalla, el proceso de su actividad podría perderse y perder los valores estáticos. Sin embargo Android ofrece algunas opciones de persistencia de valores entre los estados o la transmisión de ellos, tales como:

  • utilizando una intención, podría pasar a lo largo sus criterios de búsqueda de la actividad a actividad (similar a una web http petición)
  • utilizando preferencias de la aplicación, usted podría ahorrar los valores y recuperar en la actividad que los necesita
  • utilizando la base de datos SQLite puede ellos persisten en una mesa y recuperar posteriormente
  • si necesita simplemente guardar la actividad estado, para que en el reinicio, los campos se llenan de sus valores previamente seleccionados, se puede implementar el método onSaveInstanceState() la actividad - en cuenta que esto no es recomendado para entre actividades persistencia de estados.

Usted puede obtener algunos ejemplos de código de la utilización de las preferencias, los intentos y la base de datos SQLite mirando el aegis-shield source code tree en el código de Google o en otras aplicaciones Android de código abierto.

3

Después de algunas investigaciones, resulta que el uso de aplicaciones para almacenar conjuntos unitarios no es tan grande de una idea, a menos que esté listo para volver a crearlo:

Don't store data in the application object

así que mientras the accepted answer es técnicamente correcto, no proporciona toda la información.

Como lo sugiere el enlace de arriba, si realmente desea seguir con ese modelo, debe estar preparado para verificar la nulidad y volver a crear los datos, si es posible.

1

@ r1k0 está aquí. El almacenamiento de datos en campos estáticos de una clase no persistirá por sí solo durante el proceso de la aplicación que mata y reinicia. Android rutinariamente mata procesos (ejecutar aplicaciones) cuando necesita memoria.

por el doctor Android: Activity state and ejection from memory,

El sistema nunca mata a una actividad directamente. En cambio, mata el proceso en el que se ejecuta la actividad, destruyendo no solo la actividad , sino también todo lo demás que se ejecuta en el proceso.

Puede guardar y restaurar el estado de las primitivas, así como los objetos serializables y parcelables mediante los siguientes métodos. Estos se llaman automáticamente durante el ciclo de vida de la actividad normal.

protected void onSaveInstanceState(Bundle state) {} 
protected void onRestoreInstanceState(Bundle savedInstanceState){} 

Por lo tanto, si usted tiene una clase que tiene sólo las variables estáticas, puede guardar el estado de cada campo en onSaveInstanceState() y recuperarlos en onRestoreInstanceState(). Cuando Android mata el proceso en el que se ejecuta su aplicación, se guardará el estado de sus variables, y cuando Android restaure su aplicación, los valores se restaurarán en la memoria en el mismo estado que antes.

Cuestiones relacionadas