В чем разница активити и фрагмента в Android?
Что проверяют
Понимаете ли вы, что фрагмент это часть экрана со своим жизненным циклом, и знаете ли главную ловушку этого жизненного цикла.
Как отвечать
Активити это компонент приложения. Объявляется в манифесте, имеет собственное окно, может быть точкой входа, участвует в системной навигации и в стеке задач. Именно её запускает система по намерению.
Фрагмент это переиспользуемая часть интерфейса внутри активити. В манифесте не объявляется, своего окна не имеет, живёт внутри хоста и управляется менеджером фрагментов, у которого свой стек возврата.
Практическая разница:
- переиспользование: один фрагмент показывается на телефоне отдельным экраном, а на планшете рядом с другим;
- навигация: смена фрагментов дешевле запуска активити и позволяет анимации между частями экрана;
- современная практика: одна активити и много фрагментов или экранов Compose, навигация через Navigation Component. Отдельная активити на каждый экран сегодня редкость.
Главное, что нужно знать про жизненный цикл, потому что там больше всего ошибок: у фрагмента их фактически два. Жизненный цикл самого фрагмента и жизненный цикл его представления. При уходе на другой экран с сохранением в стеке возврата фрагмент не уничтожается, а его представление уничтожается (onDestroyView). При возврате представление создаётся заново.
Отсюда два правила:
- подписки на данные привязывают к
viewLifecycleOwner, а не к самому фрагменту. Иначе после возврата подписок станет две, и обработчик выполнится дважды; - ссылку на разметку обнуляют в
onDestroyView, иначе фрагмент удержит уничтоженные представления, и это утечка памяти.
Ещё стоит помнить, что у фрагмента есть конструктор без аргументов по требованию системы: параметры передаются через аргументы, иначе после пересоздания они потеряются.
Где спотыкаются
Подписываются с this вместо viewLifecycleOwner и получают двойные срабатывания.
Не обнуляют ссылку на разметку.
Передают параметры через свойства, а не через аргументы.
Считают фрагмент облегчённой активити и ждут одинакового жизненного цикла.