Изменения состояния активности, Изменения состояния активности

Различные события, некоторые из которых инициируются пользователем, а некоторые инициируются системой, могут привести к переходу Activity из одного состояния в другое. В этом документе описаны некоторые распространенные случаи, в которых происходят такие переходы, и способы их обработки.

Дополнительные сведения о состояниях активности см. в разделе Жизненный цикл активности . Чтобы узнать о том, как класс ViewModel может помочь вам управлять жизненным циклом активности, см. обзор ViewModel .

Произошло изменение конфигурации

Существует ряд событий, которые могут вызвать изменение конфигурации. Пожалуй, наиболее ярким примером является смена портретной и альбомной ориентации. Другие случаи, которые могут вызвать изменения конфигурации, включают изменения языковых настроек или устройства ввода.

При изменении конфигурации действие уничтожается и создается заново. Это запускает следующие обратные вызовы в исходном экземпляре действия:

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

Создается новый экземпляр активности и запускаются следующие обратные вызовы:

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

Используйте комбинацию экземпляров 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() .

Чтобы узнать больше о том, как система решает, какие процессы уничтожить, прочтите «Состояние активности и удаление из памяти» и «Процессы и жизненный цикл приложения» .

Чтобы узнать, как сохранить состояние пользовательского интерфейса вашей активности, когда система завершает процесс вашего приложения, см. раздел Сохранение и восстановление временного состояния пользовательского интерфейса .