Mostrando entradas con la etiqueta Lifecicle Android apps. Mostrar todas las entradas
Mostrando entradas con la etiqueta Lifecicle Android apps. Mostrar todas las entradas

viernes, 25 de mayo de 2012

Metodos del Ciclo de vida de los componentes


Los Ciclos de vida
Cada componente tiene un ciclo de vida distinto. Las superclases de estos componentes tienen métodos callback que les permiten reaccionar ante un cambio de estado. Cada método callback está obligado a llamar al mismo método de su padre. Durante el curso ya hemos estudiado y practica el ciclo de vida de las Actividades, así que ahora, veamos los demás ciclos, y realicemos una puesta en común.

Ciclo de vida de los BroadcastReceiver
Tienen un ciclo de vida muy corto, ya que se activan al producirse un mensaje de difusión, que capturan con el método callback:
                               void onReceive(Context curContext, Intent broadcastMsg)
Si este método se está ejecutando, se considera el BroadcastReceiver activo. Esto supone un problema si la tarea a ejecutar es pesada y la lanzamos a un hilo aparte. Cuando termine el método, Android considera que el BroadcastReceiver está inactivo, pero el hilo sigue ejecutándose y puede ser eliminado de la pila, interrumpiendo la tarea.
Se soluciona lanzando un servicio desde este método que se encarga de hacer las tareas pesadas, así, al tener el servicio su propio ciclo de vida, seguirá ejecutándose, aunque el BroadcastReceiver se considere inactivo.

Ciclo de vida de los ContentProvider
Su ciclo es muy corto, permanecen activos mientras sean referenciados por un ContentResolver. Esto lo veremos más adelante.

Ciclo de vida de las Actividades

Ya lo estudiamos, así que repasemos los tres estados que tiene:
·         Activo: La actividad se encuentra en primer plano (Encima de la pila de tareas) e interactuando con el usuario.
·         Pausado: La actividad sigue siendo visible para el usuario, pero ha perdido el foco. Por ejemplo que se haya mostrado un cuadro de dialogo delante de nuestra actividad. Debemos guardar el estado de la interfaz y los datos de esta actividad antes de entrar en este estado, ya que podríamos perderlos si el sistema necesita más recursos de memoria.
·         Parado: La actividad no es visible para el usuario, queda a disposición del sistema para borrarla de la pila en caso de necesitar memoria.

La clase Activity dispone de métodos que se llaman cada vez que ésta cambia de estado, para permitirnos realizar tareas como guardar los datos antes de cambiar de estado, y cargar la actividad más rápido la próxima vez que se muestre. A continuación el diagrama que ya tienen ustedes, con los distintos estados por los que pasa una actividad:


·         onCreate(Bundle savedInstanceState): Este método se llama al crear la actividad. Siempre se sobrescribe para configurar la vista, crear adaptadores, rellenar los objetos con sus valores etc. Puede recibir como parámetro el estado anterior de la actividad para que podamos restaurarla.
·         onPause(): Es llamado justo antes de que se traiga a primer plano otra actividad. Aquí es donde debemos guardar los datos para no perder la información de la actividad si esta es sacada de la pila. Dentro de este método también se suele parar las tareas pesadas que consuman CPU.
·         onStop(): Es llamado cuando la actividad se va a ocultar durante un largo periodo de tiempo. Si el sistema necesita recursos, puede que este método no sea llamado, por lo que es recomendable guardar los datos en el método onPause().
·         onDestroy: Último en llamarse antes de destruir la actividad. Puede llamarse a través del método finish() o llamarlo el sistema para conseguir más memoria. Para saber quién lo llamó, podemos usar isFinishing().
Un ejemplo de uso de estos métodos puede ser cuando tenemos una aplicación que carga datos de internet, deberíamos cargar los datos al inicio de la actividad, una vez descargados, guardaríamos el estado de la actividad para que si es destruida, no sea necesario volver a descargar los datos.
Para realizar esta operación usaríamos el método onSavedInstanceState(), que crearía un Bundle con los datos necesarios que pasaríamos al método onCreate() la segunda vez que cargáramos la actividad, sin necesidad de volver a descargar los datos.

Ciclo de vida de Service
Los servicios se pueden usar de dos formas, dependiendo de cómo lo lancemos, su ciclo será uno u otro.
·         Si lo lanzamos con startService() se ejecutará hasta que termine. Los servicios se configurar en el método onCreate() y se liberan en el onDestroy(). Podemos terminar un servicio externamente con Context.stopService() o dentro del mismo servicio con Service.stopSelf() o Service.stopSelfResult().
·         Si lo lanzamos con Context.bindService() podremos interactuar con él mediante una interfaz que el servicio debe exportar. Terminaremos el servicio con Context.unbindService().
A continuación el diagrama con el ciclo de vida de los servicios:




miércoles, 23 de mayo de 2012

Ciclo de vida de los componentes



Ciclo de vida de una aplicación Android

¿Porqué es importante esto?
El ciclo de vida de una aplicación en Android es manejada por el sistema operativo, basándose en las necesidades del usuario, los recursos disponibles, etc. Si tenemos una aplicación que está consumiendo muchos recursos y arrancamos otra nueva aplicación, el sistema operativo probablemente le diga a la aplicación que se queda en segundo plano que libere todo lo que pueda, y si es necesario la cerrará. En Android los recursos son normalmente muy limitados y por eso el sistema operativo tiene más control sobre las aplicaciones que en programas de escritorio.
En la mayoría de los casos, cada aplicación Android corre en su propio proceso de Linux. Este proceso es creado para la aplicación cuando la arrancamos y seguirá corriendo hasta que no sea necesario y el sistema reclame recursos para otras aplicaciones y se los dé a éstas.
Hemos visto que un proyecto Android está formado por varias carpetas estructuradas, pero lo que se instala en los dispositivos es un archivo con extensión .apk (application package).
Estos archivos se generan con la herramienta apk (En el directorio tools del SDK) al terminar de compilar.
Las aplicaciones en Android tienen su propio entorno seguro de ejecución:
·         Cada aplicación se ejecuta en su propio proceso Linux. El sistema lo crea cuando ejecutamos la aplicación y lo destruye cuando no se use pasado un rato o cuando el Sistema necesite recursos para otra aplicación
·         Cada proceso se ejecuta en su propia máquina virtual, de esta manera está aislada del resto. De esta forma ante cualquier fallo en la aplicación solo afecta a su máquina virtual, no al resto.
·         A cada aplicación se le asigna un identificador de usuario (uid) distinto. Los permisos de los archivos que refieren a la aplicación (caché, datos etc) son solo accesibles por dicho usuario. Es posible asignar un mismo uid a dos aplicaciones para que compartan una misma máquina virtual y recursos.

Tipos de procesos

Para decidir qué proceso debe ser liquidado, Android ordena los procesos por importancia:
Foregound Process. Es la aplicación que contiene la actividad que ahora mismo se está mostrando en pantalla (Se ha llamado al método onResume()). Habrá muy pocos procesos Foreground corriendo a la vez en el sistema y estos procesos solamente se liquidarán si la memoria es tan baja que ni matando al resto de procesos tenemos los recursos necesarios.
Visible process. Es el que contiene una actividad que es visible, pero no en primera fila (se ha llamando al método onPause()). Por ejemplo, estoy leyendo un email, y hago click en un link http , abre el navegador y me lleva a esa web. En ese momento el navegador sería Foregound Process y el cliente de mail sería un Visible process. Estos procesos son considerados importantes por el sistema operativo y normalmente no se cierran.
Service process. Es un servicio como los de cualquier Unix. Estos procesos hacen cosas en segundo plano que normalmente son importantes, el sistema nunca va a liquidar un servicio a menos que sea necesario para mantener vivos todos los Visible y Foreground.
Background process. Es un proceso que contiene una actividad que actualmente no es visible por el usuario, estos procesos no tienen demasiada importancia, puede ser un programa que arranqué hace tiempo y no lo he vuelto a usar, pasa a estar en background. Por eso es importante que cuando nuestra aplicación pase a Background, liberar en la medida de lo posible todos los recursos que podamos.
Empty process. Es un proceso que no contiene nada ya, lo usa Android como cache para cuando se crea un proceso nuevo.

Android va destruyendo componentes inactivos para liberar memoria, pero los elimina teniendo en cuenta cual es el de menor importancia:
·         Los primeros en ser eliminados son los procesos vacíos (Son aplicaciones cerradas que se mantienen en memoria para cargar rápidamente la aplicación la próxima vez que se abra.)
·         Procesos en segundo plano, estos son las aplicaciones que ya han ejecutado su método onStop(), Android confecciona una lista con los procesos en este estado y elimina en primer lugar el más antiguo.
·         Después elimina los procesos de servicio. (si sigue necesitando más memoria.)
·         Si aún necesita más memoria, elimina los procesos pausados.
·         Si con esto sigue necesitando, finalmente elimina el proceso en primer plano.
Es muy importante implementar bien los métodos de estado, para evitar perder información.
Entonces ahora, en la proxima entrada del blog vamos a enfocarnos en los métodos de estado y el ciclo de vida de cada uno de los componentes principales.