Сразу к делу, мы будем разбираться в жизненном цикле Операций и Фрагментов на Андроиде, а говоря не по-русски 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().
В любом случае в этом методе необходимо освободить все задействованные в активити ресурсы. Готовиться к земле, так сказать.
Резюме
Оно скоро тут будет