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 administrarlas.
Para obtener más información sobre los estados de una actividad, consulta Información sobre 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 Información sobre la clase 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 es un cambio entre las orientaciones vertical y horizontal. Entre otros casos que pueden causar cambios de configuración, se incluyen los cambios de idioma o de dispositivo de entrada.
Cuando se produce un cambio de configuración, la actividad se elimina y se vuelve a crear.
La instancia de actividad original tendrá activadas las devoluciones de llamadas onPause()
, onStop()
y onDestroy()
. Se creará una nueva instancia de la actividad y se activarán las devoluciones de llamadas onCreate()
, onStart()
y onResume()
.
Usa una combinación de ViewModels, el método onSaveInstanceState() y el almacenamiento local persistente para conservar el estado de la IU de una actividad durante los cambios de configuración. Decidir cómo combinar estas opciones depende de la complejidad de los datos de tu IU, los casos prácticos de tu app y la consideración de la velocidad de recuperación frente al uso de memoria. Para obtener más información sobre cómo guardar el estado de IU de tu actividad, consulta Cómo guardar los estados de la IU.
Cómo administrar los casos en modo multiventana
Cuando una app activa el modo multiventana en Android 7.0 (API nivel 24) y versiones posteriores, el sistema notifica a la actividad que está actualmente en ejecución sobre un cambio de configuración y pasa por las transiciones del ciclo de vida que se describen más arriba. Este comportamiento también se produce si se cambia el tamaño de una app que ya está en modo multiventana. Tu actividad puede administrar el cambio de configuración o permitir que el sistema elimine la actividad y la vuelva a crear con las nuevas dimensiones.
Para obtener más información sobre el ciclo de vida del modo multiventana, consulta la sección Ciclo de vida del modo multiventana de la página Compatibilidad con el modo multiventana.
En el modo multiventana, si bien hay dos apps que son visibles para el usuario, solo aquella con la que el usuario está interactuando está en primer plano y tiene el foco. El estado de esta actividad es Reanudada, mientras que el de la app en la otra ventana es Detenida.
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. Cada vez que el usuario cambia de app, se alterna entre estos dos métodos.
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 nuevo diálogo que obtiene el foco y cubre parcialmente la actividad en progreso, la actividad cubierta pierde el foco y pasa al estado Detenida. Luego, el sistema llama a onPause()
en esta.
Cuando la actividad cubierta vuelve al primer plano y obtiene el foco, llama a onResume()
.
Si aparece en primer plano una nueva actividad o un nuevo diálogo que obtiene el foco y cubre completamente la actividad en progreso, 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 aparece en segundo plano, el sistema no invoca a onRestart(), solo llama a onStart()
y onResume()
.
Nota: Cuando el usuario toca el botón de inicio o Recientes, el sistema se comporta como si la actividad actual se hubiera cubierto por completo.
El usuario toca el botón Atrás
Si una actividad está en primer plano y el usuario toca el botón Atrás, la actividad pasa por las devoluciones de llamadas onPause()
, onStop()
y onDestroy()
. Además de eliminarse, la actividad también se quita de la pila de actividades.
Es importante tener en cuenta que, de manera predeterminada, la devolución de llamada onSaveInstanceState()
no se activa en este caso. Este comportamiento se basa en la suposición de que el usuario presionó el botón Atrás sin intención de regresar a la misma instancia de la actividad. Sin embargo, puedes anular el método onBackPressed()
para implementar un comportamiento personalizado, por ejemplo, un diálogo de "confirmar-salir".
Si anulas el método onBackPressed()
, te recomendamos encarecidamente que invoques super.onBackPressed()
desde el método anulado. De lo contrario, el comportamiento del botón Atrás puede resultar incoherente para el usuario.
El sistema elimina el proceso de la app
Si una app está en segundo plano y el sistema necesita liberar memoria adicional para una app en primer plano, el sistema puede eliminar la que está en segundo plano a fin de liberar más memoria. Para obtener más información sobre cómo el sistema decide qué procesos eliminar, lee Estado de la actividad y expulsión de la memoria y Ciclo de vida de procesos y aplicaciones.
Para obtener información sobre cómo guardar el estado de la IU de la actividad cuando el sistema elimina el proceso de tu app, consulta Cómo guardar y restablecer el estado de la actividad.