¿Qué proceso se elimina?

Como hemos comentado, Android mantiene en memoria todos los procesos que quepan aunque estos no se estén ejecutando. Una vez que la memoria está llena y el usuario decide ejecutar una nueva aplicación, el sistema ha de determinar qué proceso de los que están en ejecución ha de ser eliminado. Android ordena los procesos en una lista jerárquica, asignándole a cada uno de ellos una determinada "importancia". Esta lista se confecciona basándose en los componentes de la aplicación que están corriendo (actividades y servicios) y el estado de estos componentes.

Para establecer esta jerarquía de importancia se distinguen los siguientes tipos de procesos:

Proceso de primer plano: (Foreground process) Hospeda una actividad en la superficie de la pantalla y con la cual el usuario está interactuando (su método onResume() ha sido llamado). Debería haber solo uno o unos pocos procesos de este tipo. 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.

Proceso visible: (Visible process) Hospeda una actividad que está visible en la pantalla, pero no en el primer plano (su método onPause() ha sido llamado). Considerado importante, no será eliminado a menos que sea necesario para mantener los procesos de primer plano.

Proceso de servicio: (Service process) Hospeda un servicio que ha sido inicializado con el métodostartService(). Aunque estos procesos no son directamente visibles al usuario, generalmente están haciendo tareas que para el usuario son importantes (tales como reproducir un archivo mp3 o mantener una conexión con un servidor de contenidos). 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 o visibles.

Proceso de fondo: (Background process) Hospeda una actividad 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. Como, hay muchos de estos procesos,  el sistema asegura que el último proceso visto por el usuario sea el último en ser eliminado.

Proceso vacío: (Empty process) No hospeda a ningún componente de aplicación activo. La única razón para mantener ese proceso es tener un "caché" que permita mejorar el tiempo de activación en la próxima vez que un componente de su aplicación sea ejecutado.

video[Tutorial] Ciclo de vida de los procesos en Android

video[Tutorial] Ciclo de vida de las aplicación en Android: Un ejemplo paso a paso

Práctica: Aplicando eventos del ciclo de vida en la actividad inicial.

Los conceptos referentes al ciclo de vida de una aplicación son imprescindible para el desarrollo de aplicaciones estables en Android. Para reforzar estos conceptos te proponemos el siguiente ejercicio en el que vamos a reproducir una música de fondo en la actividad principal.
 

1. Abre el proyecto Asteroides o Mis Lugares.

2. Busca un fichero de audio (en este capítulo se listan los formatos soportados por Android). Renombra este fichero a audio.xxx y cópialo a la carpeta res/raw.

NOTA: Cada vez que ejecutes el proyecto este fichero será añadido al paquete .apk. Si este fichero es muy grande la aplicación también lo será, lo que ralentizará su instalación. Para agilizar la ejecución te recomendamos un fichero muy pequeño, por ejemplo un .mp3 de corta duración o un fichero MIDI (.mid). Si no encuentras ninguno puedes descargar este: http://www.dcomg.upv.es/~jtomas/android/ficheros/audio.mid.

3. Abre la actividad MainActivity y declara el siguiente objeto:

MediaPlayer mp;

4. Añade las siguientes líneas en el método onCreate():

mp = MediaPlayer.create(this, R.raw.audio);
mp.start();

5. Ejecuta el proyecto y verifica que cuando sales de la actividad la música sigue sonando un cierto tiempo.

6. Utilizando los eventos del ciclo de vida queremos que cuando la actividad deje de estar activa el audio deje de escucharse. Puedes utilizar los métodos:

mp.pause();
mp.start();

7. Verifica que funciona correctamente.
 

Práctica: Aplicando eventos del ciclo de vida en la actividad inicial (II)

1. Tras realizar el ejercicio anterior, ejecuta la aplicación y abre la actividad Acerca de… La música ha de detenerse.

2. Nos interesa que mientras parte de esta actividad esté visible (como ha ocurrido en el punto anterior) la música se escuche. Es decir, utilizando los eventos del ciclo de vida queremos que cuando la actividad deje de estar visible el audio deje de escucharse.

3. Verifica que cuando abres la actividad Acerca de… la música continua reproduciéndose.

4. Pasa ahora a una actividad que ocupe la totalidad de la pantalla (por ejemplo  la actividad Juego o VistaLugarActivity). En teoría la música tendría que detenerse, dado que la actividad MainActivity ya no es visible y tendría que haber pasado a estado parada. Observa como la música acaba deteniéndose, pero es posible que tarde unos segundos. Esto se debe a que la llamada al método onStop() no es prioritaria, por lo que el sistema puede retardar su ejecución. En caso de tratarse de información visual, en lugar de acústica, este retardo no tendría una repercusión directa para el usuario, dado que la actividad no es visible.

5. Tras el problema detectado en el punto anterior, deshaz los cambios introducidos en esta práctica y deja la aplicación como se pedía en la práctica anterior.