jueves, 3 de noviembre de 2011

Ciclo de vida de una actividad en Android

Algo esencial a la hora de programar aplicaciones, es saber de que manera se comportará nuestra aplicación a la hora de ejecutarla. Para ello, es imprescindible saber su ciclo de vida, algo necesario para saber dónde inicializar variables, crear o destruir objetos, o simplemente qué hacer cuando la aplicación llegue a su fin.

Las actividades son gestionadas por el sistema mediante una pila de actividades. Cuando una nueva aplicación aparece, esta se situa al principio de dicha pila pasando a ser la actividad en ejecución (la actividad anterior no volverá a primer plano hasta que esta no termine).

Según la documentación de Android, una actividad podemos encontrarla en 4 estados, aunque bajo mi punto de vista sólo son 3, ya que el cuarto es una combinación del segundo y tercero:

  1. Activa: cuando la actividad está la primera en la pila de actividades y es la que está en primer plano en el dispositivo.
  2. En pausa: cuando la actividad pierde el foco pero es todavía visible (se le superpone otra actividad en modo pantalla parcial o modo transparente). Esta actividad continua viva, manteniendo toda la información de estado, miembros, etc permaneciendo unida al gestor de ventanas. Si el sistema necesita memoria podrá matar la actividad. 
  3. Detenida:cuando hay otra aplicación tapando por completo a la activa (por ejemplo entra una llamada), la aplicación pasa a estar detenida. Dicha aplicación mantiene la información de estado, miembros, etc pero ya no está visible para el usuario, por lo que el sistema, en caso de necesitar memoria, puede eliminarla. 
  4. Pausa / Detenida: el sistema puede eliminar de la memoria una actividad en uno de estos dos estado preguntando si queremos finalizarla nosotros mismo o eliminarla el mismo sin preguntar. Cuando la actividad vuelva a estar visible, será necesario reiniciarla y restaurarla a su estado anterior.
 En el siguiente diagrama vemos como se gestionan estos estados y como se pasa de uno a otro:


Cuando lanzamos la aplicación, se llama al método OnCreate(), donde inicializaremos los componentes esenciales de nuestra actividad (llamaremos a setContentView() para definir el diseño de la interfaz de usuario, crearemos las vistas, enlazaremos los datos, etc)

Inmediatamente se llama al método OnStart() justo antes de que la actividad sea visible en el terminal. A partir de aquí, puede llamarse al método OnResume() o al método OnStop(), dependiendo de la focalización o no de la actividad.

El método OnResume() se llama justo antes de que el usuario comience a interactuar con la actividad. 

Después de este método se ejecuta el OnPause(). Este método se llama cuando el sistema está a punto de levantar otra actividad. Este método se utiliza normalmente para guardar cambios sin salvar, detener animaciones y otras cosas que puedan consumir recursos, etc. Este método debe ejecutarse rápidamente, ya que hasta que no concluya, el sistema no podrá levantarse la nueva actividad. A partir de aquí, puede llamarse al método OnResume() si la actividad vuelve de nuevo a primer plano, o llamar al método OnStop() si se convierte en invisible para el usuario.

El método OnStop() se ejecuta cuando la actividad ya no es visible por el usuario debido a que está siendo destruida por el sistema o porque otra actividad se ha reanudado y se ha colocado encima. A partir de aquí, solo nos quedan tres opciones: llamar al método OnRestart() si queremos que la aplicación vuelva a primer plano, que el sistema la elimine por necesidad de memoria, o ejecutar el método OnDestroy() si queremos cerrar la actividad.

El método OnDestroy() lo podemos llamar nosotros explícitamente porque queremos destruir la actividad o puede llamarlo el sistema si necesita memoria y está destruyendo actividades para conseguirlo. A partir de aquí, la actividad estará totalmente eliminada.

Si tenemos esto en cuenta a la hora de programar, nos ahorraremos muchos fallos a la hora de ejecutar nuestra aplicación.

Maikel.

No hay comentarios:

Publicar un comentario