Entender el ciclo de vida de una Activity es fundamental: te permite escribir aplicaciones que funcionen con fluidez
Y te ayuda a gestionar los recursos de la aplicación de forma más eficiente.
Para ofrecer una mejor experiencia de usuario.
Las activities en Android pueden apilarse unas sobre otras.
Cada vez que inicias una nueva activity, esta cubre a la anterior.
Luego, al pulsar el botón de retroceso, la activity actual se destruye y aparece la anterior.
En realidad, Android usa algo llamado Tarea (Task) para gestionarlas.
Una tarea es básicamente una colección de activities almacenadas en una pila.
Esta pila se conoce como la pila de retorno (Back Stack).
Una pila es una estructura de datos de tipo LIFO (el último en entrar es el primero en salir).
Por defecto, cada vez que inicias una nueva activity, esta se coloca en la cima de la pila.
Cuando pulsas el botón de retroceso o ejecutas finish(), la activity en la cima de la pila se destruye. La activity que estaba debajo sube a la cima. El sistema siempre muestra al usuario la activity que está en la cima de la pila.
Estados de una Activity
Durante su ciclo de vida, una activity puede encontrarse en hasta cuatro estados diferentes.
1. Estado en ejecución
Cuando está en la cima de la pila, el sistema duda antes de reclamarla porque afectaría negativamente a la experiencia del usuario.
2. Estado en pausa
No está en la cima de la pila pero sigue siendo visible —por ejemplo, cuando aparece una activity de tipo diálogo que solo ocupa parte de la pantalla, similar a una ventana modal—. El sistema tampoco suele reclamarlas, ya que desaparecer de golpe resultaría confuso para el usuario.
3. Estado detenido
Una activity entra en este estado cuando no está en la cima de la pila y es completamente invisible. El sistema conserva su estado y variables miembro, pero no es algo seguro: si necesita memoria para otra cosa, el sistema puede decidir reclamarla.
4. Estado destruida
Cuando una activity se elimina de la pila de retorno, pasa al estado destruida. El sistema prioriza estas activities a la hora de liberar memoria.
Tiempo de vida de la activity y siete métodos de callback
La clase Activity define siete métodos de callback que cubren cada etapa del ciclo de vida.
En pocas palabras: estas siete funciones de callback se disparan en momentos concretos del ciclo de vida y ejecutan su código.
Por ejemplo, onCreate se dispara cuando se crea la activity por primera vez.
Veamos los siete métodos:

onCreate:
Se llama cuando la activity se crea por primera vez. Aquí haces la inicialización: cargas el layout, enlazas eventos a los botones, etc.
onStart:
Se dispara cuando la activity pasa de invisible a visible.
onResume:
Se llama cuando la activity está lista para interactuar con el usuario. En este momento está en la cima de la pila de retorno y en estado de ejecución (el usuario ya la ve).
onPause:
Se invoca cuando el sistema está a punto de iniciar o reanudar otra activity. Aquí sueles liberar recursos que consumen CPU y guardar datos importantes, pero debe ejecutarse rápido; si no, retrasará la nueva activity. (La activity actual está a punto de ocultarse, la transición aún no termina.)
onStop:
Se llama cuando la activity se vuelve completamente invisible. La diferencia clave con onPause es que si la nueva activity es de tipo diálogo, onPause sí se ejecuta pero onStop no. (La activity se oculta y aparece la nueva.)
onDestroy:
Se llama justo antes de que la activity se destruya. Después pasa al estado destruida.
onRestart:
Se llama justo antes de que una activity detenida vuelva al estado en ejecución, es decir, cuando se reinicia.
Tres tipos de tiempo de vida
De los siete métodos, todos excepto onRestart forman tres pares. Por eso podemos dividir el tiempo de vida en tres categorías.
1. Tiempo de vida completo
Todo lo que ocurre entre onCreate y onDestroy constituye el tiempo de vida completo.
2. Tiempo de vida visible
El periodo entre onStart y onStop es el tiempo de vida visible. La activity permanece visible para el usuario. Puedes usar estos métodos para gestionar recursos: cargar en onStart y liberar en onStop, para que las activities detenidas no ocupen memoria innecesaria.
3. Tiempo de vida en primer plano
El periodo entre onResume y onPause es el tiempo de vida en primer plano. La activity está en ejecución y puede recibir la entrada del usuario. Es el estado con el que más interactúan los usuarios.
Abrir activity principal → entrar en activity normal → volver a activity principal → volver al escritorio
05-12 15:32:43.899 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onCreate:
05-12 15:32:43.926 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStart:
05-12 15:32:43.930 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onResume:
05-12 15:33:00.973 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onPause:
05-12 15:33:01.078 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onCreate:
05-12 15:33:01.079 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onStart:
05-12 15:33:01.081 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onResume:
05-12 15:33:02.969 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStop:
05-12 15:34:01.747 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onPause:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onRestart:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStart:
05-12 15:34:01.780 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onResume:
05-12 15:34:02.749 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onStop:
05-12 15:34:02.750 4316-4316/com.foxdevelop.www.lifedemo E/Log activity normal: onDestroy:
05-12 15:35:26.827 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onPause:
05-12 15:35:28.534 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onStop:
05-12 15:34:01.779 4316-4316/com.foxdevelop.www.lifedemo E/Log activity principal: onDestroy:
Práctica de proyecto
Creemos un nuevo proyecto para experimentar el ciclo de vida
Llamaremos a la activity LifeDemo.
Añade una EmptyActivity como activity principal.
Luego añade dos activities más: NormalActivity y DialogActivity.
Después modifica sus layouts.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity normal" />
</LinearLayout>Lenguaje del código: HTML, XML (xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity de diálogo" />
</LinearLayout>Lenguaje del código: HTML, XML (xml)
Sus layouts son prácticamente idénticos, solo cambia el texto mostrado.
También necesitamos convertir DialogActivity en una activity tipo diálogo.
Modifica AndroidManifest.xml:
<activity android:name=".NormalActivity" />
<activity android:name=".DialogActivity" android:theme="@style/Base.Theme.AppCompat.Dialog"/>
</application>Lenguaje del código: HTML, XML (xml)
Esto aplica el tema de diálogo a DialogActivity.
Layout de la activity principal
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Abrir activity normal" />
<Button
android:id="@+id/buttondialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Abrir activity de diálogo" />
</LinearLayout>Lenguaje del código: HTML, XML (xml)
Añadir eventos de clic a los dos botones de la activity principal
package com.foxdevelop.www.lifedemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button)findViewById(R.id.button);
b.setOnClickListener(
new View.OnClickListener(){
@Override
public void onClick(View view){
Intent it = new Intent(MainActivity.this,NormalActivity.class);
startActivity(it);
}
}
);
Button b2 = (Button)findViewById(R.id.buttondialog);
b2.setOnClickListener(
new View.OnClickListener(){
@Override
public void onClick(View view){
Intent it = new Intent(MainActivity.this,DialogActivity.class);
startActivity(it);
}
}
);
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart: ");
}
}Lenguaje del código: JavaScript (javascript)
1. Ejecutar la aplicación
Al crear la activity principal, onCreate, onStart y onResume se ejecutan en orden.

Al pulsar «Abrir activity normal», se disparan onPause y onStop.

Como NormalActivity cubre completamente la MainActivity, ambos métodos se ejecutan.
Pulsa el botón Atrás para volver.

Como MainActivity estaba en estado detenido, se dispara onRestart, seguido de onStart y onResume.
Pero onCreate no se ejecuta porque la activity no se volvió a crear. En ese momento, NormalActivity debería haber disparado su propio onDestroy.
Ahora pulsa «Abrir diálogo».
Esta vez solo se dispara onPause.
Verás que onStop no se dispara.
Eso es porque DialogActivity no oculta completamente la MainActivity.

Igualmente, si pulsas Atrás en este momento, solo se ejecuta onResume. Como no se detuvo, onStart no se llama.


Como puedes ver, aquí se disparan onPause, onStop y luego onDestroy.
Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.Lenguaje del código: CSS (css)
Activity principal creada → activity de diálogo abierta → volver a activity principal → volver al escritorio
05-13 02:10:51.635 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onCreate: // Crear nueva activity
05-13 02:10:51.673 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onStart: // De invisible a visible
05-13 02:10:51.701 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onResume: // La activity es visible
05-13 02:12:01.993 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onPause: // Saliendo de la activity actual hacia otra
05-13 02:12:02.115 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onCreate:
05-13 02:12:02.116 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onStart:
05-13 02:12:02.143 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onResume:
05-13 02:14:26.078 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onPause: // Botón atrás, volver a activity principal
05-13 02:14:26.367 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onResume: // Aparece directamente porque no se detuvo
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onStop: // Ya no es visible
05-13 02:14:26.803 4206-4206/com.foxdevelop.www.lifedemo E/Activity de diálogo: onDestroy: // Al dar atrás o finish() se destruye
05-13 02:16:23.959 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onPause:
05-13 02:16:25.606 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onStop:
05-13 02:16:25.609 4206-4206/com.foxdevelop.www.lifedemo E/Activity principal: onDestroy: // Antes de destruir siempre hay pause y stopLenguaje del código: JavaScript (javascript)
El ciclo de vida de una Activity