Pull to refresh

Памятка по жизненному циклу Android — часть I. Отдельные Activity

Reading time3 min
Views15K
Original author: Jose Alcérreca

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

Чтобы обеспечить такое взаимодействие с пользователем, вы должны знать, как управлять жизненными циклами компонентов. Компонентом может быть Activity, Fragment, Service, класс Application и даже сам процесс приложения. Компонент имеет жизненный цикл, в течение которого он проходит через различные состояния. Всякий раз, когда происходит переход, система уведомляет вас об этом при помощи методов жизненного цикла.

Чтобы нам было легче объяснить, как работает жизненный цикл в Android, мы определили несколько сценариев (примеров из жизни), которые сгруппированы по компонентам:

Часть 1: Activity — ЖЦ одного активити (этот пост)

Часть 2: Несколько Activity — навигация и бекстек

Часть 3: Fragment-ы — ЖЦ Fragment-ов и Activity

Часть 4: ViewModel-и, прозрачные Activity and Launch Mode

Диаграммы также доступны в виде шпаргалки в формате PDF для краткого ознакомления.

Примечание: эти диаграммы соответствуют поведению в Android P/Jetpack 1.0.

Следующие сценарии демонстрируют поведение компонентов по умолчанию, если не указано иное.

Если вы обнаружили ошибки в статье или считаете, что не хватает чего-то важного, напишите об этом в комментариях.

Часть 1: Activity

Одно Aсtivity - Сценарий 1. Приложение завершено и перезапущено

Будет вызван, если:

  • Пользователь нажимает кнопку Назад или

  • Вызван метод Activity.finish()

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

Управление состоянием

  • onSaveInstanceState не вызывается (поскольку активити завершено, вам не нужно сохранять состояние)

  • onCreate не имеет Bundle при повторном открытии приложения, потому что активити было завершено и состояние не нужно восстанавливать.

Одно Aсtivity - Сценарий 2. Пользователь уходит

Будет вызван, если:

  • Пользователь нажимает кнопку "Домой"

  • Пользователь переключается на другое приложение (через меню «Все приложения», из уведомления, при принятии звонка и т. д.)

В этом случае система остановит активити, но не завершит его сразу.

Управление состоянием

Когда ваше активити переходит в состояние Stopped, система использует onSaveInstanceState для сохранения состояния приложения на тот случай, если впоследствии система завершит процесс приложения (см. ниже).

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

Одно Aсtivity - Сценарий 3. Изменение кофигурации

Будет вызван, если:

  • Изменена конфигурация, такие как поворот экрана

  • Пользователь изменил размер окна в многооконном режиме

Управление состоянием

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

  • Активити полностью уничтожено, но состояние сохраняется и восстанавливается при создании нового экземпляра.

  • Bundle в onCreate тот же самый, что и в onRestoreInstanceState.

Одно Aсtivity - Сценарий 4. Приложение приостановлено системой

Будет вызван, если:

  • Включён многооконный режим (API 24+) и потерян фокус

  • Другое приложение частично покрывает работающее приложение: диалоговое окно покупки (in-app purchases), диалоговое окно получения разрешения (Runtime Permission), стороннее диалоговое авторизации и т. д.

  • Появится окно выбора приложения (при обработке неявного интента), например диалоговое окно шейринга.

Этот сценарий не применим к:

  • Диалогам в том же приложении. Отображение AlertDialog или DialogFragment не приостанавливает базовое активити.

  • Уведомлениям. Пользователь, получающий новое уведомление или открывающий панель уведомлений, не приостанавливает текущее активити.

Tags:
Hubs:
Total votes 5: ↑4 and ↓1+3
Comments0

Articles