una studio programacion programa por pasar para otro example editar desde crear como cero celular app aplicaciones androidmanifest android application-lifecycle

studio - manual de programacion android pdf



Usar la clase de aplicaciĆ³n Android para persistir datos (6)

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 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 preciso) causa una destrucción y recreación completa de la actividad. En base a mis hallazgos, la clase Application no tiene el mismo ciclo de vida (es decir, para todos los efectos, siempre instanciado). ¿Tiene sentido almacenar la información de estado dentro de la clase de la aplicación y luego hacer referencia a ella desde la Actividad, o generalmente no es el método "aceptable" debido a restricciones de memoria en los dispositivos móviles? Realmente aprecio cualquier consejo sobre este tema. ¡Gracias!


Dave, ¿qué tipo de datos es? Si se trata de datos generales que pertenecen a la aplicación como un todo (ejemplo: datos de usuario), amplíe la clase de aplicación y guárdela 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.


En realidad, puede anular la funcionalidad de orientación para asegurarse de que su actividad no se destruya ni se vuelva a crear. Mira here .


Los que cuentan con la instancia de la Application están equivocados. Al principio, puede parecer que la Application 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 están divididos en 5 niveles de "killability" especificados en el documento .

Entonces, por ejemplo, si su aplicación queda en segundo plano debido a que el usuario responde una llamada entrante, dependiendo del estado de la RAM, el SO puede (o no) matar su proceso (destruyendo la instancia de la Application 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í muchas reacciones negativas, así que es hora de agregar una aclaración. :) Bueno, inicialmente realmente 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, a veces el estado se pierde (podrían ser algunas imágenes las que se volverán a leer / volver a descargar), entonces está BIEN conservarlo como miembro de la Application .


No creo que 500kb sean tan importantes.

Lo que describiste es exactamente cómo abordé mi problema de perder datos en una actividad. Creé un singleton global en la clase Application y pude acceder a él desde las actividades que utilicé.

Puede pasar datos en un singleton global si se va a usar mucho.

public class YourApplication extends Application { public SomeDataClass data = new SomeDataClass(); }

Luego llámalo en cualquier actividad por:

YourApplication appState = ((YourApplication)this.getApplication()); appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

Lo discuto aquí en mi publicación del blog , en la sección "Global Singleton".


Puede crear una clase de aplicación y guardar todos sus datos en ese calss para usar en cualquier lugar de su aplicación.


Si desea acceder al "singleton global" fuera de una actividad y no desea pasar el 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 el método onCreate() .

Por ejemplo:

public class ApplicationController extends Application { private static ApplicationController _appCtrl; public static ApplicationController getAppCtrl() { return _appCtrl; } }

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:

public static Resources getAppResources() { return _appCtrl.getResources(); }

Pero tenga mucho cuidado al pasar referencias de contexto para evitar pérdidas de memoria .