Estoy trabajando en una aplicación de Android bastante compleja que requiere una gran cantidad de datos sobre la aplicación (yo diría que un total de unos 500 KB, ¿es tan grande para un dispositivo móvil?). Por lo que puedo decir, cualquier cambio de orientación en la aplicación (en la actividad, para ser más precisos) provoca una completa destrucción y recreación de la actividad. Según mis hallazgos, la clase Application no tiene el mismo ciclo de vida (es decir, para todos los efectos, siempre se crea una instancia). ¿Tiene sentido almacenar la información de estado dentro de la clase de aplicación y luego hacer referencia a ella desde la Actividad, o ese generalmente no es el método "aceptable" debido a limitaciones de memoria en los dispositivos móviles? Realmente agradezco cualquier consejo sobre este tema. ¡Gracias!
112
Respuestas:
No creo que 500kb sea tan importante.
Lo que describió es exactamente cómo abordé mi problema de pérdida de datos en una actividad. Creé un singleton global en la clase Application y pude acceder a él desde las actividades que usé.
Puede pasar datos en un Singleton global si se va a utilizar mucho.
Luego llámelo en cualquier actividad por:
Lo analizo aquí en la publicación de mi blog , en la sección "Global Singleton".
fuente
Los que cuentan con la
Application
instancia se equivocan. Al principio, puede parecer queApplication
existe mientras exista todo el proceso de la aplicación, pero esta es una suposición incorrecta.El sistema operativo puede matar procesos según sea necesario. Todos los procesos se dividen en 5 niveles de "matabilidad" especificados en el doc .
Entonces, por ejemplo, si su aplicación pasa a segundo plano debido a que el usuario responde a una llamada entrante, entonces, dependiendo del estado de la RAM, el sistema operativo puede (o no) matar su proceso (destruyendo la
Application
instancia en el proceso) .Creo que un mejor enfoque sería conservar sus datos en el archivo de almacenamiento interno y luego leerlos cuando se reanude su actividad.
ACTUALIZAR:
Recibí muchos comentarios negativos, por lo que es hora de agregar una aclaración. :) Bueno, inicialmente utilicé una suposición errónea de que el estado es realmente importante para la aplicación. Sin embargo, si su aplicación está bien y a veces se pierde el estado (podrían ser algunas imágenes que simplemente se volverán a leer / descargar), entonces está completamente bien mantenerla como miembro de
Application
.fuente
Application
instancia, sin embargo, no contará con sus datos estáticos a menos que los persista.Si desea acceder al "Singleton global" fuera de una actividad y no desea pasar a
Context
través de todos los objetos involucrados para obtener el singleton, puede simplemente definir un atributo estático en su clase de aplicación, que contiene la referencia a sí mismo. Simplemente inicialice el atributo en elonCreate()
método.Por ejemplo:
Debido a que las subclases de
Application
también pueden obtener los Recursos, puede acceder a ellos simplemente cuando define un método estático, que los devuelve, como:Pero tenga mucho cuidado al pasar las referencias de contexto para evitar pérdidas de memoria .
fuente
Application
para hacer esto. Puede declarar una variable miembro estática en cualquier clase para hacer esto.Dave, ¿qué tipo de datos son? Si se trata de datos generales que pertenecen a la aplicación en su conjunto (ejemplo: datos de usuario), amplíe la clase Aplicación y guárdelos allí. Si los datos pertenecen a la actividad, debe usar los controladores onSaveInstanceState y onRestoreInstanceState para conservar los datos en la rotación de la pantalla.
fuente
De hecho, puede anular la funcionalidad de orientación para asegurarse de que su actividad no se destruya ni se vuelva a crear. Mira aquí .
fuente
Puede crear una clase de aplicación y guardar todos sus datos en esa llamada para usarla en cualquier lugar de su aplicación.
fuente
Sé que esta es la pregunta muy antigua, pero usar ViewModel de los componentes del jetpack es la mejor manera de preservar los datos entre la rotación de actividades.
fuente