Что такое смена конфигурации?
Смена orientation, языка, темы, DPI, UI Mode, fontScale и др.
Android при этом может пересоздать компоненты, чтобы адаптировать UI.
Какие компоненты реагируют на смену конфигурации?
1. Activity
- По умолчанию пересоздаётся: вызывается
onPause() => onStop()
, затем создаётся заново=>
onDestroy()onCreate()
- Получает новый
Resources.Configuration
onSaveInstanceState()
вызывается перед уничтожением
Основной компонент, который всегда реагирует на конфигурационные изменения, если ты явно не переопределил поведение.
2. Fragment
- Следует за
Activity
: егоView
уничтожается, но самFragment
может остаться в памяти (если находится в back stack) - Жизненный цикл: nginxКопироватьРедактировать
onPause
=>
onStop=>
onDestroyView=>
onCreateView=>
onStart=>
onResume
Может использовать setRetainInstance(true)
(устаревший способ) или ViewModel
, чтобы пережить изменения.
3. View
- Пересоздаётся заново, если
Activity
пересоздана - Измеряется и пересоздаётся заново через
onMeasure()
/onLayout()
/onDraw()
CustomView
должен учитывать изменение размеров, ориентации, языка и т.п.
4. ViewModel
- не пересоздаётся при смене конфигурации
- Привязан к жизненному циклу
ViewModelStoreOwner
(Activity
илиFragment
) - Используется для переживания конфигурационных изменений
Один из главных инструментов сохранения состояния между пересозданиями UI.
5. Service
- Не реагирует на смену конфигурации
- Живёт независимо от UI
- Даже если
Activity
пересоздана,Service
продолжает работать
6. BroadcastReceiver
, ContentProvider
- Не пересоздаются при конфигурации
- Если зарегистрированы в
Manifest
и-или не зависят от UI