Ответ вслух Middle Жизненный цикл Activity и Fragment обновлено

Особенности жизненного цикла фрагмента

Вопрос

Чем жизненный цикл фрагмента отличается от Activity и какие ошибки из-за этого делают?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Главное отличие: у фрагмента два жизненных цикла, самого фрагмента и его view. Когда фрагмент уходит в back stack, его view уничтожается (onDestroyView), а объект фрагмента остаётся, и при возврате view создаётся заново в onCreateView.

Что должно прозвучать в ответе

  • У фрагмента два цикла: свой и его view

  • В back stack вызывается onDestroyView, но не onDestroy

  • Подписки на UI через viewLifecycleOwner

  • Binding обнулять в onDestroyView

  • Не держать view в by lazy и полях без очистки

  • Получать ViewModel через by viewModels или activityViewModels

Что могут спросить следом

  • Что такое FragmentResult API?
  • Почему нельзя передавать аргументы через конструктор фрагмента?

Разбор

Главное отличие: у фрагмента два жизненных цикла, самого фрагмента и его view. Когда фрагмент уходит в back stack, его view уничтожается (onDestroyView), а объект фрагмента остаётся, и при возврате view создаётся заново в onCreateView. Из этого растут типичные ошибки. Если подписаться на LiveData или Flow с владельцем this, подписка переживёт view, и после возврата появится дубль, а старый обработчик будет трогать уничтоженную view. Поэтому всё UI-шное привязываю к viewLifecycleOwner и собираю через repeatOnLifecycle. Ссылку на ViewBinding обнуляю в onDestroyView, иначе фрагмент держит всю иерархию view. По той же причине не кладу view-зависимые объекты в by lazy. Аргументы передаю через arguments, а не конструктор: система пересоздаёт фрагмент пустым конструктором после смерти процесса.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.