Pausando y reanudando una actividad

Esta lección te enseñará a

  1. Pausar tu actividad
  2. Reanudar tu actividad

También deberías leer

Durante el uso normal de una aplicación, la actividad en primer plano a veces se ve parcialmente ocultada por componentes visuales que causan que se pause la actividad. Por ejemplo, cuando se abre una actividad semitransparente (como una estilo diálogo), la actividad anterior se pone en pausa. Durante el tiempo en que la actividad siga parcialmente visible pero sin ser la actividad en foco, se mantendrá pausada.

Sin embargo, una vez que la actividad está totalmente oculta, pasa al estado de parada (que trataremos en la siguiente lección).

En el proceso de poner la aplicación en pausa, el sistema llama al método onPause() de tu Activity, lo que te permite parar acciones en curso que no deberían continuar mientras se está en pausa (como un video) o persistir cualquier información que debería guardarse permanentemente para el caso de que el usuario abandone definitivamente tu aplicación. Si el usuario vuelve a tu actividad desde el estado de pausa, el sistema la reanuda y llama al método onResume().

Nota: Cuando tu actividad recibe una llama a onPause(), puede ser una indicación de que la actividad estará pausada un momento y el usuario volverá a tu actividad. Sin embargo, habitualmente es la primera indicación de que el usuario está abandonando tu actividad.

Figura 1. Cuando una actividad semitransparente oculta tu actividad, el sistema llama a onPause() y la actividad espera en el estado Pausada (1). Si el usuario vuelve a la actividad mientras esta todavía se encuentra en pausa, el sistema llama a onResume() (2).

Pausar tu actividad


Cuando el sistema llama al método onPause() de tu actividad, técnicamente significa que tu actividad todavía está parcialmente visible, pero lo más habitual es que se trate de una indicación de que el usuario está abandonando tu actividad y dentro de poco entrará en el estado de Parada. Normalmente deberías utilizar la retrollamada onPause() para:

  • Parar animaciones y otras acciones en curso que puedan consumir CPU.
  • Guardar los cambios no guardados, pero sólo si el usuario espera que estos cambios se guarden permanentemente cuando deje la actividad (como el borrador de un correo electrónico).
  • Liberar recursos del sistema, como receptores de mensajes, manejadores de sensores (como GPS), o cualquier otro recurso que pueda afectar a la duración de la batería mientras tu actividad se encuentra pausada y el usuario no la necesita.

Por ejemplo, si tu aplicación usa la Cámara, el método onPause() es un buen lugar para liberarla.

@Override
public void onPause() {
    super.onPause();  // Primero llamamos siempre al método de la super clase

    // Libera la Cámara porque no la necesitamos cuando estamos en pausa
    // y otras actividades pueden querer usarla
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

Generalmente, no deberías usar onPause() para guardar cambios del usuario (como información personal introducida en un formulario) a almacenamiento permanente. La única ocasión en que deberías persistir los cambios del usuario a almacenamiento permanente en onPause() es cuando estás seguro de que los usuarios esperan que los cambios se guarden automáticamente (como cuando estás escribiendo un borrador de un correo electrónico). Sin embargo, deberías evitar trabajo que consuma mucha CPU en onPause(), como escribir a una base de datos, porque puede ralentizar visiblemente la transación a la siguiente actividad (en su lugar deberías mover estas operaciones costosas a onStop()).

Deberías intentar que las operaciones que se lleven a cabo en el método onPause() sean relativamente simples para permitir transiciones rápidas al siguiente destino del usuario si tu actividad realmente está siendo parada.

Nota: Cuando tu actividad está pausada, la instancia de Activity se mantiene residente en memoria y se vuelve a llamar cuando se reanuda la actividad. No necesitas reinicializar componentes que habían sido creados en alguno de los métodos de retrollamada que llevan al estado de Reanudada.

Reanudar tu actividad


Cuando el usuario reanuda tu actividad desde el estado de pausa, el sistema llama al método onResume().

Ten en cuenta que el sistema llama a este método cada vez que tu actividad pasa a primer plano, incluyendo cuando esta se crea por primera vez. Por tanto, deberías utilizar onResume() para inicializar componentes que liberarás en onPause() y para llevar a cabo cualquier otra inicialización que deba ejecutarse cada vez que la actividad entre en el estado de Reanudada (como comenzar animaciones e inicializar componentes que sólo se utilizan cuando la actividad tiene el foco del usuario).

El siguiente ejemplo de onResume() es la contrapartida al ejemplo de onPause() anterior: este inicializa la cámara que se liberará cuando se pause la actividad.

@Override
public void onResume() {
    super.onResume();  // Siempre llamamos al método de la super clase primero

    // Obtenemos la instancia de Camera cuando adquirimos el foco completo
    if (mCamera == null) {
        initializeCamera(); // Método local para inicializar la cámara
    }
}