← Назад к вопросам

Как жизненный цикл фрагмента связан с жизненным циклом Activity

2.2 Middle🔥 223 комментариев
#Android компоненты#Жизненный цикл и навигация

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Взаимосвязь жизненных циклов Fragment и Activity

Жизненный цикл фрагмента тесно интегрирован с жизненным циклом активити, поскольку фрагмент не может существовать самостоятельно — он всегда встроен в активити как составная часть её пользовательского интерфейса. Состояния фрагмента в значительной степени зависят от состояния родительской активити, что создает иерархическую связь "контейнер-содержимое".

Ключевые принципы связи

  1. Вложенность состояний: Каждый callback жизненного цикла фрагмента вызывается после соответствующего callback активити. Например, onCreate() активити выполняется до onCreate() фрагмента, а onStart() активити — до onStart() фрагмента.

  2. Зависимость от контейнера: Методы жизненного цикла фрагмента вызываются только когда активити находится в соответствующем состоянии. Если активити остановлена (onPause()), все её фрагменты также не могут быть активными.

  3. Координация через FragmentManager: Управление жизненным циклом фрагментов осуществляется FragmentManager, который синхронизирует состояния с активити.

Последовательность вызовов при запуске

Рассмотрим типичную последовательность при старте активити с фрагментом:

// Activity.onCreate()
super.onCreate()
// Внутри Activity.onCreate() FragmentManager вызывает:
fragment.onAttach(context)   // Фрагмент привязывается к активити
fragment.onCreate()          // Инициализация фрагмента
// После setContentView() или транзакции:
fragment.onCreateView()      // Создание UI фрагмента
fragment.onViewCreated()     // Настройка созданного View
// Далее синхронно:
Activity.onStart()           → fragment.onActivityCreated() → fragment.onStart()
Activity.onResume()          → fragment.onResume()

Особенности при повороте экрана

При изменении конфигурации (например, повороте) уничтожается активити, а вместе с ней и все фрагменты. Однако фрагменты могут сохранять своё состояние через onSaveInstanceState():

class MyFragment : Fragment() {
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("key", "importantData")
    }
    
    override fun onViewStateRestored(savedInstanceState: Bundle?) {
        super.onViewStateRestored(savedInstanceState)
        val data = savedInstanceState?.getString("key")
        // Восстановление данных
    }
}

Критические моменты взаимодействия

  • onAttach() и onDetach(): Эти методы уникальны для фрагментов и отмечают привязку/отвязку от активити. В onAttach() фрагмент получает ссылку на контекст активити.

  • onActivityCreated(): Устаревший в новых версиях AndroidX, но исторически важный метод, который вызывался после того, как onCreate() активити завершён и её представление создано.

  • Влияние на управление ресурсами: Когда активити вызывает onPause(), все её фрагменты должны приостановить анимации, видео, сенсоры или другие ресурсы, интенсивно использующие процессор.

Практические следствия для разработки

  1. Не полагайтесь на порядок инициализации: В onCreate() фрагмента UI активити может быть ещё не создан, поэтому обращение к activity.findViewById() может вернуть null.

  2. Используйте ViewBinding/LateInit: Для безопасного доступа к View:

class MyFragment : Fragment() {
    private var _binding: FragmentMyBinding? = null
    private val binding get() = _binding!!
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        _binding = FragmentMyBinding.inflate(inflater, container, false)
        return binding.root
    }
    
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null  // Важно для избежания утечек памяти
    }
}
  1. Координация с LiveData/Flow: Используйте viewLifecycleOwner в наблюдателях для корректной привязки к жизненному циклу View фрагмента, а не всего фрагмента.

  2. Учет состояния Back Stack: Фрагменты в Back Stack проходят упрощённый жизненный цикл — их View уничтожается, но экземпляр сохраняется.

Отличия в Jetpack Navigation

При использовании Navigation Component управление жизненным циклом становится более декларативным, но основные принципы сохраняются — фрагменты по-прежнему зависят от активити-хоста, а NavController координирует переходы между состояниями.

Итог: Понимание связи жизненных циклов активити и фрагмента критически важно для создания стабильных приложений. Фрагменты — это не самостоятельные компоненты, а "расширения" активити, чьё существование и поведение полностью определены состоянием их контейнера. Правильная работа с этими жизненными циклами предотвращает утечки памяти, краши при повороте экрана и проблемы с восстановлением состояния.