Различные события, некоторые из которых инициируются пользователем, а некоторые инициируются системой, могут привести к переходу Activity
из одного состояния в другое. В этом документе описаны некоторые распространенные случаи, в которых происходят такие переходы, и способы их обработки.
Дополнительные сведения о состояниях активности см. в разделе Жизненный цикл активности . Чтобы узнать о том, как класс ViewModel
может помочь вам управлять жизненным циклом активности, см. обзор ViewModel .
Произошло изменение конфигурации
Существует ряд событий, которые могут вызвать изменение конфигурации. Пожалуй, наиболее ярким примером является смена портретной и альбомной ориентации. Другие случаи, которые могут вызвать изменения конфигурации, включают изменения языковых настроек или устройства ввода.
При изменении конфигурации действие уничтожается и создается заново. Это запускает следующие обратные вызовы в исходном экземпляре действия:
Создается новый экземпляр активности и запускаются следующие обратные вызовы:
Используйте комбинацию экземпляров ViewModel
, метода onSaveInstanceState()
или постоянного локального хранилища, чтобы сохранить состояние пользовательского интерфейса действия при изменении конфигурации. Решение о том, как объединить эти параметры, зависит от сложности данных пользовательского интерфейса, вариантов использования вашего приложения и скорости извлечения по сравнению с использованием памяти. Дополнительные сведения о сохранении состояния пользовательского интерфейса действий см. в разделе Сохранение состояний пользовательского интерфейса .
Обрабатывать случаи с несколькими окнами
Когда приложение переходит в многооконный режим, доступный в Android 7.0 (уровень API 24) и выше, система уведомляет выполняющуюся активность об изменении конфигурации, таким образом проходя описанные ранее переходы жизненного цикла.
Такое поведение также происходит, если размер приложения, уже находящегося в многооконном режиме, изменяется. Ваша деятельность может сама справиться с изменением конфигурации или позволить системе уничтожить операцию и воссоздать ее с новыми измерениями.
Дополнительные сведения о жизненном цикле многооконности см. в описании жизненного цикла многооконности на странице поддержки многооконности .
В многооконном режиме, хотя пользователю видны два приложения, только то, с которым пользователь взаимодействует, находится на переднем плане и имеет фокус. Это действие находится в состоянии «Возобновлено», а приложение в другом окне — в состоянии «Приостановлено».
Когда пользователь переключается с приложения A на приложение B, система вызывает onPause()
для приложения A и onResume()
для приложения B. Она переключается между этими двумя методами каждый раз, когда пользователь переключается между приложениями.
Дополнительные сведения о многооконном режиме см. в разделе Поддержка многооконности .
Действие или диалог отображается на переднем плане
Если на переднем плане появляется новое действие или диалог, захватывающий фокус и частично закрывающий выполняемое действие, скрытое действие теряет фокус и переходит в состояние «Приостановлено». Затем система вызывает для него onPause()
.
Когда охватываемое действие возвращается на передний план и восстанавливает фокус, система вызывает onResume()
.
Если на переднем плане появляется новое действие или диалоговое окно, захватывающее фокус и полностью закрывающее выполняемое действие, скрытое действие теряет фокус и переходит в состояние «Остановлено». Затем система в быстрой последовательности вызывает onPause()
и onStop()
.
Когда тот же экземпляр покрытого действия возвращается на передний план, система вызывает onRestart()
, onStart()
и onResume()
для действия. Если это новый экземпляр покрываемой активности, который переходит в фоновый режим, система не вызывает onRestart()
, а только onStart()
и onResume()
.
Пользовательские касания или жесты Назад
Если действие находится на переднем плане и пользователь нажимает или показывает жестом «Назад», действие переходит через обратные вызовы onPause()
, onStop()
и onDestroy()
. Действие уничтожается и удаляется из заднего стека.
По умолчанию обратный вызов onSaveInstanceState()
в этом случае не срабатывает. Такое поведение предполагает, что пользователь нажимает «Назад», не ожидая возврата к тому же экземпляру действия.
Однако вы можете переопределить метод onBackPressed()
, чтобы реализовать собственное поведение, например отображение диалогового окна, в котором пользователю предлагается подтвердить, что он хочет выйти из вашего приложения.
Если вы переопределите метод onBackPressed()
, мы настоятельно рекомендуем вам по-прежнему вызывать super.onBackPressed()
из переопределенного метода. В противном случае поведение системы Back может раздражать пользователя.
Система завершает процесс приложения
Если приложение работает в фоновом режиме и системе необходимо освободить память для приложения на переднем плане, система может закрыть фоновое приложение. Когда система завершает работу приложения, нет гарантии, что в приложении будет вызван onDestroy()
.
Чтобы узнать больше о том, как система решает, какие процессы уничтожить, прочтите «Состояние активности и удаление из памяти» и «Процессы и жизненный цикл приложения» .
Чтобы узнать, как сохранить состояние пользовательского интерфейса вашей активности, когда система завершает процесс вашего приложения, см. раздел Сохранение и восстановление временного состояния пользовательского интерфейса .