Pregunta

Estoy creando una aplicación de búsqueda de eventos, configuramos los criterios de búsqueda de una pantalla y los completamos en otra pantalla, luego el usuario puede editar los criterios de búsqueda desde la tercera pantalla y pasar a la cuarta pantalla.

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

Pero me temo que si se trata del ciclo de vida de los objetos estáticos en Android, si se encuentra poca memoria, ¿Android elimina los objetos estáticos?

Como Android admite tareas múltiples, si el usuario cambia a otra aplicación y cuando regresa, la aplicación comienza a actuar como loca, ¿se elimina el objeto estático cuando realiza múltiples tareas?alguna idea ??¿Y también sugerir que mantener un objeto estático mediante el método singleton es un mejor enfoque?

¿Fue útil?

Solución

Vamos a empezar con un poco de historia: ¿Qué pasa cuando se inicia una aplicación
?     El sistema operativo se inicia un proceso y le asigna un identificador de proceso único y asigna un proceso table.A proceso se inicia una instancia de DVM (Dalvik VM); Cada aplicación se ejecuta dentro de un DVM.
A DVM gestiona descarga la carga de clases, ejemplo del ciclo de vida, GC etc.

Tiempo de vida 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 se cambia a una actividad diferente de la otra aplicación y ninguno de los tres anteriores sucede. Si alguno de los tres anteriores a pasar la estática perderá su valor.

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

  1. imprimir la estática sin inicializar en onCreate de su actividad -> debería imprimir nula
  2. inicializar la estática. imprimirlo -> valor sería no nulo
  3. Pulse el botón de retroceso e ir a la pantalla principal. Nota:. Pantalla de inicio es otra actividad
  4. Inicie su actividad de nuevo -> la variable estática será no nulo
  5. Matar el proceso de solicitud de DDMS (botón en la ventana de dispositivos de parada).
  6. Reinicio de la actividad -.> La estática tendrá valor nulo

Espero que ayude.

Otros consejos

Bueno, el patrón Singleton también se basa en el uso de variables estáticas, por lo que en realidad estarías 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 pasa al primer plano antes de que su aplicación pase a la siguiente pantalla, el proceso de su actividad podría finalizar y usted perderá los valores estáticos.Sin embargo, Android ofrece algunas opciones para conservar valores entre estados o transmitirlos, como por ejemplo:

  • Usando una intención, puede transmitir sus criterios de búsqueda de actividad a actividad (similar a una solicitud HTTP web)
  • Usando las preferencias de aplicación, puede guardar los valores y recuperarlos en la actividad que los necesita
  • Usando la base de datos SQLite puede persistir en una tabla y recuperarlos más tarde
  • Si solo necesita guardar el estado de actividad para que, al reiniciar, los campos se llenen con sus valores seleccionados previamente, puede implementar el método de actividad OnsaveInStancestate (): tenga en cuenta que esto no se recomienda entre las actividades de la persistencia de los estados.

Puede obtener algunos ejemplos de código del uso de preferencias, intenciones y la base de datos sqlite consultando el árbol de código fuente de aegis-shield en código de Google o en otras aplicaciones de Android de código abierto.

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:

No almacene los datos en el objeto de la aplicación

así que mientras la respuesta aceptada es técnicamente correcto, no proporciona toda la información.

A medida que el enlace anterior sugiere que, si realmente quiere seguir con ese modelo, tiene que estar lista para comprobar si hay nula y volver a crear los datos, si es posible.

@ r1k0 es aquí. el almacenamiento de datos en los campos estáticos de una clase no persistirán en su propio proceso de solicitud a través de mata y se reinicia. Android mata rutinariamente los procesos en ejecución (aplicaciones) cuando necesite memoria.

Por el doc Android: estado de actividad y expulsión de la memoria ,

  

El sistema nunca mata a una actividad directamente. En su lugar, se mata al   proceso en el que se ejecuta la actividad, destruyendo no sólo la actividad   pero todo lo demás que se ejecuta en el proceso, también.

Puede guardar y restaurar el estado de primitivas, así objetos serializables y parcelable utilizando 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 que su aplicación se está ejecutando en, se guardará el estado de sus variables, y cuando Android restaura su aplicación, los valores se restaurará en la memoria en el mismo estado que antes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top