Ciclo de vida de una actividad

El ciclo de vida de una aplicación Android es bastante diferente al ciclo de vida de una aplicación en otros S.O., como Windows. La mayor diferencia es que, en Android el ciclo de vida es controlado principalmente por el sistema, en lugar de ser controlado directamente por el usuario.

video[Tutorial] Ciclo de vida de una aplicación en Android

Una aplicación en Android está formada por un conjunto de elementos básicos de interacción con el usuario, conocidos como actividades. Además de varias actividades, una aplicación también puede contener servicios. El ciclo de vida de los servicios se estudiará en el capítulo 8. Son las actividades las que realmente controlan el ciclo de vida de las aplicaciones, dado que el usuario no cambia de aplicación, sino de actividad. El sistema mantiene una pila con las actividades previamente visualizadas, de forma que el usuario puede regresar a la actividad anterior pulsando la tecla “retorno”.

Una aplicación Android corre dentro de su propio proceso Linux. Este proceso se crea con la aplicación 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 la destrucción de un proceso no es controlada directamente por la aplicación, sino que es el sistema el que determina cuándo destruir el proceso. Lo hace basándose en el conocimiento que tiene de las partes de la aplicación que están corriendo (actividades y servicios), en la importancia de dichas partes para el usuario y en cuánta memoria disponible hay en un determinado momento.

Si tras eliminar el proceso de una aplicación, el usuario vuelve a ella, se crea de nuevo el proceso, pero se habrá perdido el estado que tenía esa aplicación. En estos casos, será responsabilidad del programador almacenar el estado de las actividades, si queremos que cuando sean reiniciadas conserven su estado.

Como vemos, Android es sensible al ciclo de vida de una actividad; por lo tanto, necesitas comprender y manejar los eventos relacionados con el ciclo de vida si quieres crear aplicaciones estables.

Una actividad en Android puede estar en uno de estos cuatro estados:

Activa (Running): La actividad está encima de la pila, lo que quiere decir que es visible y tiene el foco. 

Visible (Paused): La actividad es visible pero no tiene el foco. Se alcanza este estado cuando pasa a activa otra actividad con alguna parte transparente o que no ocupa toda la pantalla. Cuando una actividad está tapada por completo, pasa a estar parada.

Parada (Stopped): Cuando la actividad no es visible. El programador debe guardar el estado de la interfaz de usuario, preferencias, etc.

Destruida (Destroyed): Cuando la actividad termina al invocarse el método finish(), o es matada por el sistema.

Cada vez que una actividad cambia de estado se van a generar eventos que podrán ser capturados por ciertos métodos de la actividad. A continuación se muestra un esquema que ilustra los métodos que capturan estos eventos.

Ciclo de vida de una actividad.

onCreate(Bundle): Se llama en la creación de la actividad. Se utiliza para realizar todo tipo de inicializaciones, como la creación de la interfaz de usuario o la inicialización de estructuras de datos. Puede recibir información de estado dela actividad (en una instancia de la clase Bundle), por si se reanuda desde una actividad que ha sido destruida y vuelta a crear.

onStart(): Nos indica que la actividad está a punto de ser mostrada al usuario.

onResume(): Se llama cuando la actividad va a comenzar a interactuar con el usuario. Es un buen lugar para lanzar las animaciones y la música.

onPause(): Indica que la actividad está a punto de ser lanzada a segundo plano, normalmente porque otra actividad es lanzada. Es el lugar adecuado para detener animaciones, música o almacenar los datos que estaban en edición.

onStop(): La actividad ya no va a ser visible para el usuario. !Ojo si hay muy poca memoria! es posible que la actividad se destruya sin llamar a este método.

onRestart(): Indica que la actividad va a volver a ser representada después de haber pasado por onStop().

onDestroy(): Se llama antes de que la actividad sea totalmente destruida. Por ejemplo, cuando el usuario pulsa el botón de volver o cuando se llama al método finish(). Ojo si hay muy poca memoria, es posible que la actividad se destruya sin llamar a este método.

Ejercicio: ¿Cuándo se llama a los eventos del ciclo de vida en una actividad?

En este ejercicio vamos a implementar todos los métodos del ciclo de vida de la actividad principal y añadiremos un toast para mostrar cuando se ejecuta. De esta forma comprenderemos mejor cuando se llama a cada método.

1. Abre la actividad MainActivity del proyecto Asteroides o Mis Lugares.

2. Añade en el método onCreate() el siguiente código:

Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();

3. Añade los siguientes métodos:

@Override protected void onStart() {
   super.onStart();
   Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
}

@Override protected void onResume() {
   super.onResume();
   Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show();
}

@Override protected void onPause() {
   Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show();
   super.onPause();
}

@Override protected void onStop() {
   Toast.makeText(this, "onStop", Toast.LENGTH_SHORT).show();
   super.onStop();
}

@Override protected void onRestart() {
   super.onRestart();
   Toast.makeText(this, "onRestart", Toast.LENGTH_SHORT).show();
}

@Override protected void onDestroy() {
   Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
   super.onDestroy();
} 
override fun onStart() {
   super.onStart()
   Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show()
}

override fun onResume() {
   super.onResume()
   Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show()
}

override fun onPause() {
   Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show()
   super.onPause()
}

override fun onStop() {
   Toast.makeText(this, "onStop", Toast.LENGTH_SHORT).show()
   super.onStop()
}

override fun onRestart() {
   super.onRestart()
   Toast.makeText(this, "onRestart", Toast.LENGTH_SHORT).show()
}

override fun onDestroy() {
   Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show()
   super.onDestroy()
} 

4. Ejecuta la aplicación y observa la secuencia de Toast.

5. Selecciona la opción Acerca de... y luego regresa a la actividad. Observa la secuencia de Toast.

6. Selecciona la opción Preferencias y luego regresa a la actividad. Observa la secuencia de Toast.

7. Sal de la actividad y observa la secuencia de Toast.

Preguntas de repaso y reflexión:

Ciclo de vida