Cambios en el estado de la actividad

Diferentes eventos, algunos activados por el usuario y otros activados por el sistema, pueden provocar que una Activity pase de un estado a otro. En este documento, se describen algunos casos comunes en los que ocurren tales transiciones y cómo manejarlas.

Para obtener más información sobre los estados de la actividad, consulta El ciclo de vida de la actividad. Para obtener información sobre cómo la clase ViewModel puede ayudarte a administrar el ciclo de vida de la actividad, consulta la descripción general de ViewModel.

Se produce un cambio de configuración

Hay una serie de eventos que pueden activar un cambio de configuración. Quizás el ejemplo más destacado sea un cambio entre las orientaciones vertical y horizontal. Otros casos que pueden causar cambios de configuración incluyen cambios en la configuración de idioma o el dispositivo de entrada.

Cuando se produce un cambio de configuración, la actividad se elimina y se vuelve a crear. Esto activa las siguientes devoluciones de llamada en la instancia de actividad original:

  1. onPause()
  2. onStop()
  3. onDestroy()

Se crea una nueva instancia de la actividad y se activan las siguientes devoluciones de llamada:

  1. onCreate()
  2. onStart()
  3. onResume()

Usa una combinación de instancias de ViewModel, el método onSaveInstanceState() o el almacenamiento local persistente para conservar el estado de la IU de una actividad durante los cambios de configuración. Para decidir cómo combinar estas opciones, se debe tener en cuenta la complejidad de los datos de la IU, los casos de uso de la app y la velocidad de recuperación en comparación con el uso de memoria. Si quieres obtener más información para guardar el estado de la IU de la actividad, consulta Cómo guardar estados de la IU.

Cómo controlar casos multiventana

Cuando una app entra en el modo multiventana, disponible en Android 7.0 (nivel de API 24) y versiones posteriores, el sistema notifica a la actividad en ejecución sobre un cambio de configuración y pasa por las transiciones del ciclo de vida descritas anteriormente.

Este comportamiento también ocurre si se cambia el tamaño de una app que ya se encuentra en el modo multiventana. Tu actividad puede controlar el cambio de configuración por sí misma o permitir que el sistema destruya la actividad y la vuelva a crear con las dimensiones nuevas.

Para obtener más información sobre el ciclo de vida del modo multiventana, consulta la explicación del ciclo de vida del modo multiventana en la página Compatibilidad con el modo multiventana.

En el modo multiventana, aunque hay dos apps que son visibles para el usuario, solo la con la que está interactuando está en primer plano y tiene el foco. Esa actividad se encuentra en el estado Reanudada, mientras que el estado de la app en la otra ventana es En pausa.

Cuando el usuario cambia de la app A a la app B, el sistema llama a onPause() en la app A y a onResume() en la app B. que cambia entre estos dos métodos cada vez que el usuario alterna entre apps.

Para obtener más información sobre el modo multiventana, consulta Compatibilidad con el modo multiventana.

La actividad o el diálogo aparecen en primer plano

Si aparece en primer plano una nueva actividad o un diálogo que toma el foco y cubre parcialmente la actividad en curso, la actividad cubierta pierde el foco y pasa al estado En pausa. Luego, el sistema llama a onPause() en ella.

Cuando la actividad cubierta vuelve al primer plano y recupera el enfoque, el sistema llama a onResume().

Si aparece en primer plano una nueva actividad o un diálogo que toma el foco y cubre completamente la actividad en curso, la actividad cubierta pierde el foco y pasa al estado Detenida. Luego, el sistema llama rápidamente a onPause() y onStop().

Cuando la misma instancia de la actividad cubierta vuelve al primer plano, el sistema llama a onRestart(), onStart() y onResume() en la actividad. Si se trata de una instancia nueva de la actividad cubierta que pasa a segundo plano, el sistema no llama a onRestart(), solo a onStart() y onResume().

El usuario presiona o hace un gesto atrás

Si una actividad está en primer plano y el usuario presiona o hace un gesto atrás, la actividad pasa por las devoluciones de llamada onPause(), onStop() y onDestroy(). La actividad se destruye y se quita de la pila de actividades.

De forma predeterminada, en este caso, no se activa la devolución de llamada onSaveInstanceState(). Este comportamiento supone que el usuario presiona Atrás sin esperar que regrese a la misma instancia de la actividad.

Sin embargo, puedes anular el método onBackPressed() para implementar un comportamiento personalizado, como mostrar un diálogo que le solicite al usuario que confirme que desea salir de tu app.

Si anulas el método onBackPressed(), te recomendamos que sigas invocando super.onBackPressed() desde el método anulado. De lo contrario, el comportamiento del botón Atrás del sistema podría molestar al usuario.

El sistema elimina el proceso de la app

Si una app está en segundo plano y el sistema necesita liberar memoria para una app en primer plano, el sistema puede cerrar la app en segundo plano. Cuando el sistema cierra una app, no hay garantía de que se llame a onDestroy() en la app.

Para obtener más información sobre cómo el sistema decide qué procesos destruir, lee Estado de la actividad y expulsión de la memoria y Ciclos de vida de procesos y apps.

Si quieres obtener más información para guardar el estado de la IU de tu actividad cuando el sistema finaliza el proceso de tu app, consulta Cómo guardar y restablecer el estado transitorio de la IU.