miércoles, 12 de diciembre de 2007

Manos a la obra - Ciclo de vida de una aplicación Android

Documento original: Life Cycle of an Android Application

Ciclo de vida de una aplicación Android

[Título original: Life Cycle of an Android Application]

En muchos casos, una aplicación Android corre dentro de su propio proceso Linux. Este proceso es creado para la aplicación cuando parte de su código necesita ser ejecutado, y continuará vivo hasta que ya no sea requerido y el sistema reclame su memoria para asignársela a otra aplicación.

Una característica importante, y poco usual, de Android es que el tiempo de vida de un proceso no es controlado directamente por la aplicación. En lugar de esto, es el sistema quien determina el tiempo de vida del proceso basado en el conocimiento que tiene el sistema de las partes de la aplicación que están corriendo, qué tan importante es la aplicación para el usuario y cuánta memoria disponible hay en un determinado momento.

Es muy importante tener en consideración cómo los distintos componentes de una aplicación (en particular "Activity", "Service" y "IntentReceiver") impactan de el tiempo de vida del proceso asociado con una aplicación. Si estos componentes no son empleados de manera apropiada, el sistema detendrá el proceso de la aplicación aún cuando se esté haciendo algo importante.

Un típico ejemplo de lo anterior es un "IntentReceiver" que inicia un "thread" cuando recibe un "Intent" en su método "onReceiveIntent()" y entonces finaliza el método y devuelve el control. Una vez que el método devuelve el control, el sistema considera que el "IntentReceiver" no continúa activo y por lo tanto el proceso asociado a él ya no se requiere mantener corriendo (a menos que otro componente de la aplicación esté activo dentro de él). Debido a esto, el sistema en cualquier momento que requiera memoria eliminará el proceso y como consecuencia también el "thread" que fue creado anteriormente. La solución a este problema es iniciar un "Service" desde el "IntentReceiver", de esa manera el sistema sabrá que después de que "IntentReceiver" finalice aún habrá un trabajo activo asociado al proceso.

Para determinar que procesos deberían ser eliminados ante una condición de baja memoria, Android ordena los procesos en una estructura jerárquica y asignándole a cada proceso una determinada "importancia" basada en los componentes que están corriendo dentro de ellos y el estado de aquellos componentes.

De acuerdo a esta jerarquía de importancia se distinguen los siguientes tipos de procesos:

  • Foreground process : (proceso de primer plano) es un proceso que hospeda una "Activity" en la superficie de la pantalla y con la cual el usuario está interactúando (su método "onResume()" ha sido llamado) o un "IntentReceiver" está corriendo (su método "onReceiveIntent()" se está ejecutando). Dentro de Android debería haber sólo unos pocos procesos que dentro de esta categoría y estos procesos sólo serán eliminados cómo último recurso, si es que la memoria está tan baja que ni siquiera estos procesos pueden continuar corriendo. Si esta fuera la situación, el dispositivo probablemente alcanzó un "memory paging state" y esta acción es necesaria para mantener la interface del usuario con capacidad para responder al usuario.

  • Visible process : (proceso visible) es un proceso que hospeda una "Activity" que es tá visible en la pantalla, pero no en el primer plano (su método "onPause()" ha sido llamado). Esto podría ocurrir, si por ejemplo, la actividad de primer plano está siendo desplegada en la pantalla con la apariencia de un cuadro de diálogo que permite que la actividad previa pueda ser vista detrás de ella. Este tipo de proceso es considerado extremadamente importante y no será eliminado a menos sea extrictamente necesario para mantener a todos los procesos de primer plano corriendo.

  • Service process : (proceso de servicio) es un proceso que hospeda a un "Service" que ha sido inicializado con el método "startService()". Aunque estos procesos no son directamente visibles al usuario, generalmente están haciendo tareas que para el usuario son muy importantes (tales como reproducir un archivo mp3 o mantener una conexión con un servidor de contenidos), por lo tanto el sistema siempre tratará de mantener esos procesos corriendo a menos que los niveles de memoria comiencen a comprometer el funcionamiento de los procesos de primer plano.

  • Background process : (proceso de fondo) es un proceso que hospeda una "Activity" que no es actualmente visible al usuario (su método "onStop()" ha sido llamado). Si estos procesos son eliminados no tendrán un directo impacto en la experiencia del usuario. Basado en el hecho que la "Activity" ha sido programada para implementar correctamente su ciclo de vida, el sistema puede eliminar estos procesos en cualquier momento para reclamar la memoria que estén usando para entregársela a cualquiera de los tres tipos de procesos anteriormente descritos. Generalmente, hay muchos de estos procesos corriendo, por lo tanto el sistema mantiene una lista "LRU" para asegurar que el último proceso visto por el usuario sea el último en ser eliminado en caso que se requiere recolectar memoria.

  • Empty process : (proceso vacío) es un proceso que no hospeda a ningún componente de aplicación activo. La única razón para mantener ese proceso es tener un "cache" que permita mejorar el tiempo de activación en la próxima oportunidad que un componente de su aplicación requiera correr. Como consecuencia de esto, el sistema con frecuencia va a eliminar estos procesos para mantener el balance entre los recursos de cache utilizados por estos procesos con los utilizados por los "cache" del kernel del sistema.

  • Al momento de clasificar un proceso, el sistema toma el nivel más importante de todos los componentes activos de un proceso. Lee sobre la documentación de "Activity", "Service" y "IntentReceiver" para estudiar más detalles de cómo cada uno de estos componentes contribuyen en el ciclo de vida del proceso. La documentación de cada una de estas clases también entregan más detalles de cómo estos componentes impactan en el ciclo de vida de una aplicación.

    No hay comentarios.: