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

Как FragmentManager переживает смену конфигурации

1.2 Junior🔥 151 комментариев
#Android компоненты

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

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

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

Как FragmentManager переживает смену конфигурации

FragmentManager играет ключевую роль в выживании фрагментов при смене конфигурации (например, повороте экрана). Вся магия основана на автоматическом сохранении и восстановлении состояния через механизм onSaveInstanceState() и компоненты архитектуры Android.

Механизм сохранения состояния

При смене конфигурации Activity уничтожается и создается заново. FragmentManager, являясь частью Activity, сохраняет свое состояние в Bundle, который передается в новую инстанцию Activity. Вот ключевые этапы этого процесса:

// Пример: FragmentManager сохраняет все фрагменты в onSaveInstanceState()
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    // FragmentManager автоматически сохраняет:
    // 1. Все добавленные фрагменты (с BackStack)
    // 2. Состояние их представлений
    // 3. Аргументы и теги
}

Роль FragmentTransaction и BackStack

BackStackEntry — это запись в стеке возврата, которая сохраняет информацию о транзакциях. При смене конфигурации:

  1. FragmentManager сериализует все BackStackEntry в Bundle
  2. Каждый фрагмент сохраняет свое состояние через onSaveInstanceState()
  3. При воссоздании Activity FragmentManager восстанавливает:
    • Все фрагменты с теми же инстанциями
    • Их иерархию и стек возврата
    • Состояние UI-компонентов
// Ключевой код из реализации FragmentManager
public void saveAllState() {
    // Сохраняет:
    // - mActive фрагменты (массив активных фрагментов)
    // - mBackStack (стек возврата)
    // - mBackStackIndex (текущий индекс)
    Bundle result = new Bundle();
    result.putParcelableArray(FRAGMENTS_TAG, fragmentState);
    result.putInt(BACK_STACK_INDEX_TAG, mBackStackIndex);
}

Особенности поведения фрагментов

Важно понимать, что фрагменты не уничтожаются при смене конфигурации если:

  • Используется setRetainInstance(true) (устарело в Android 3.0+)
  • Используется ViewModel с архитектурными компонентами
  • Activity помечена как android:configChanges (не рекомендуется)

Практический пример восстановления

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // FragmentManager автоматически восстановит фрагменты
        // из savedInstanceState
        if (savedInstanceState == null) {
            // Первый запуск - добавляем фрагмент
            supportFragmentManager.beginTransaction()
                .add(R.id.container, MainFragment())
                .commit()
        }
        // При повороте фрагмент уже будет восстановлен автоматически
    }
    
    override fun onSaveInstanceState(outState: Bundle) {
        // Вызывается автоматически перед уничтожением Activity
        super.onSaveInstanceState(outState)
    }
}

Современный подход с ViewModel

В современных приложениях рекомендуется использовать ViewModel вместе с Fragment, так как ViewModel переживает смену конфигурации независимо:

  • ViewModel хранит бизнес-логику и данные
  • Fragment отвечает за UI
  • FragmentManager управляет жизненным циклом фрагментов
  • При повороте ViewModel сохраняется, а Fragment пересоздается FragmentManager'ом

Ключевые моменты

  • FragmentManager сохраняет состояние всех добавленных фрагментов автоматически
  • Каждый фрагмент должен правильно реализовывать onSaveInstanceState() для сохранения своего UI-состояния
  • BackStack полностью восстанавливается после смены конфигурации
  • setRetainInstance() устарел, используйте ViewModel
  • Для сложных данных используйте ViewModel + SavedStateHandle

Таким образом, FragmentManager обеспечивает плавный переход при смене конфигурации, минимизируя потерю данных и состояния пользовательского интерфейса, что является фундаментальным аспектом качественного UX в Android-приложениях.