Рубрики
Без рубрики

Привет, мир!

Сразу к делу, мы будем разбираться в жизненном цикле Операций и Фрагментов на Андроиде, а говоря не по-русски Activities and Fragmens Lifecycle. За основу возьмем английскую документацию от разработчиков и выделим из нее ключевые моменты.

Причем мы не только опишем функции обратного вызова жизненного цикла, но и укажем какой код лучше всего использовать в каждом из методов. Например, onCreate у нас существует для создания интерфейса и для того, чтобы поместить данные в этот интерфейс. В onStart же можно поместить навешивание обработчиков нажатия на кнопки и прочее.

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

Я чаще всего буду использовать английскую формулировку и называть Операции Активитями, ну и Фрагменты Фрагментами.

Жизненный цикл активити

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

onCreated — Вызывается, как вы могли уже догадаться, при создании активити. Тут реализуется логика, которая должна происходить единажды во всей жизни активити.
В документации написано «your app should create views and bind data to lists here». Значит в этом методе мы инициируем главный вью активити при помощи метода setContentView. А так же подключаем все возможные фрагменты. Я так же извлекаю данные из Intent, например, если на данную активити был переход с другого активити, который и поместил данные в Intent. Например:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String var1 = "";
    if (getIntent() != null) {
        String var1 = getIntent().getStringExtra("var1");
    }

    FragmentManager fm = this.getSupportFragmentManager();

    MainInnerFragment fragment = MainInnerFragment.newInstance(var1);
    fm.beginTransaction().add(R.id.fragment_container, fragment).commit();
}

Вдовесок к onCreated идут методы onSaveInstanceState и onRestoreInstanceState.
Первый callback вызывается перед возможным уничтожением активити. Входным параметром служит Bundle outState. В эту бандл переменную можно поместить какие-либо простые данные (строки, числа), которые могут понадобиться после восстановления активити.
И тогда при повторном создании активити будет вызван второй callback onRestoreInstanceState. Куда и будет помещен ранее сохраненный бандл. Из него можно опять восстановить эти простые данные.
Этот же бандл будет передан в метод onCreate.

onStart — the activity’s final preparations for coming to the foreground and becoming interactive. Финальные приготовления для активити, создание интерактивности для элементов интерфейса.
Активити становится видимой для пользователя.

onResume — Most of an app’s core functionality is implemented in the onResume() method.
Включает в себя восстановление после onPause(). Тут можно делать всю видимую инициализацию. В документации приводят пример показ превью камеры в этом состоянии активити.
Активити остается в этом состоянии на протяжении своей нормальной работы.

onResume служит антиподом onPause (о котором мы поговорим ниже) и может быть запущен после этого самого onPause. Соответственно все, что было выключено в onPause должно быть обратно включено в onResume.

Аналогично и для onStart — onStop!

Между всеми функциями обратного вызова выше этого абзаца и функциями обратного вызова ниже абзаца идет нормальная работа приложения. Activity running.

onPause() — наступает когда активити теряет фокус, например, если пользователь нажал кнопку «назад». Или пользователю позвонили, или появился какое-нибудь диалоговое окно сверху экрана, или пользователь погасил экран телефона, или в мульти экранном режиме фокус сместился на другое приложение.

Для экономии энергии и ресурсов в этом callback рекомендуется отключить опрос GPS или отменить какие-нибудь периодические процессы, например, запросы к какому-нибудь API.

В данном методе НЕ рекомендуется сохранение пользовательских данных или данных приложения, а так же запросы к сети или обращение в БД. Так как данное состояние не продолжительное и времени на все может не хватить. Все перечисленное лучше осуществлять в onStop.
Отсюда возможен переход на onStop или onResume.

onStop() — активити остановлена и собирается быть уничтожена (переход на onDestroyed()). Например в случае перехода пользователя на другое активити. Возможно его восстановление переходом к onRestart().

В этом состоянии можно завершить любую деятельность, которая не должна существовать если активити не видна пользователю. А так же провести любые затратные подготовительные операции перед полным удалением активити. Например произвести запись в БД состояния активити.

При переходе в состояние Stopped активити все еще сохраняет в памяти свое состояние. В случае восстановления активити эти данные сохраняются. Нет необходимости переинициализации компонентов, созданных в стадиях инициализации активити.

onRestart() — предшествует вызову onStart() из состояния onPause.

onDestroy() — активити уничтожается. В однои из случаев:
1) Активити завершена или при покидании ее пользователем, или при вызове метода finish() внутри этой активити.
2) Система временно уничтожает активити из-за изменения конфигурации, так называемый «configuration change». Например при ротации экрана или включении мульти оконного режима. Рекомендуется использование ViewModel для сохранения видимых пользователю данных в ней. Например введенного пользователя текста в EditText.

Понять какой это из случаев можно при помощи isFinishing() метода. В первом случае это последний из вызваемых колбеков. Во втором будет следовать вызов onCreate().

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

Резюме

Оно скоро тут будет