Какие изменения в системе провоцируют изменения конфигурации
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Изменения конфигурации в Android
В Android изменение конфигурации — это событие, при котором система динамически меняет параметры устройства, что требует пересоздания активности (Activity) (а иногда и фрагментов) с новыми ресурсами. Основная причина — адаптация к новым условиям работы приложения без его полной перезагрузки.
Ключевые изменения, провоцирующие изменение конфигурации
1. Ориентация устройства
Самый частый триггер. При повороте с портретной на альбомную ориентацию и обратно система ищет альтернативные ресурсы (например, layout-файлы из папки layout-land).
// Активность будет пересоздана
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
2. Язык и региональные настройки (локализация)
Изменение языка системы или выбора региона. Android перезагружает ресурсы (строки, изображения) из соответствующих папок values-<locale>.
// Программное изменение локали (в API 24+ используйте updateConfiguration с осторожностью)
val config = Configuration(resources.configuration)
config.setLocale(Locale("ru"))
resources.updateConfiguration(config, resources.displayMetrics)
3. Размер и плотность экрана
- Изменение плотности пикселей (DPI) — при подключении к внешнему дисплею с иными характеристиками.
- Изменение размера окна — в многозадачном режиме (split-screen, freeform), когда пользователь меняет размеры окна приложения.
4. Ввод текста (клавиатура)
Появление или скрытие программной клавиатуры, если для активности установлен атрибут android:windowSoftInputMode="adjustResize".
5. Ночная тема (Dark Mode)
Переключение между светлой и темной темой в реальном времени (начиная с Android 10).
// В манифесте для поддержки динамической смены темы
<activity android:name=".MainActivity"
android:configChanges="uiMode" />
6. Масштабирование шрифтов и DPI
Когда пользователь изменяет настройки размера шрифта или дисплея в системных настройках.
7. Подключение оборудования
- Клавиатуры — подключение физической клавиатуры или док-станции.
- Мыши, стилусы — изменение режима ввода.
- USB-устройства, наушники — могут влиять на аудио-маршрутизацию.
Как управлять изменениями конфигурации?
Перехват изменений через onConfigurationChanged()
Вы можете обработать определенные изменения самостоятельно, не позволяя активности пересоздаваться. Для этого в манифесте укажите, какие изменения вы берете под контроль:
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|locale">
</activity>
Затем переопределите метод:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Обновляем UI вручную
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Применяем изменения для ландшафта
}
}
Сохранение состояния с помощью ViewModel и onSaveInstanceState()
- ViewModel — сохраняет данные, связанные с UI, при изменениях конфигурации (живут дольше активности).
- onSaveInstanceState() — для временного сохранения небольших данных (например, текста в полях ввода) между пересозданиями.
class MainViewModel : ViewModel() {
val liveData = MutableLiveData<String>()
}
// В активности
private val viewModel: MainViewModel by viewModels()
Рекомендации по работе
- Используйте ViewModel для хранения данных вместо
onRetainCustomNonConfigurationInstance()(устарел). - Избегайте перехвата всех изменений через
configChanges, если не готовы полностью управлять обновлением ресурсов — это может привести к неправильному отображению локализованных строк или лэйаутов. - Тестируйте сценарии смены темы, языка и ориентации, так как они наиболее критичны для пользовательского опыта.
- Учитывайте, что фрагменты также пересоздаются при изменении конфигурации, если только не сохранены через
setRetainInstance(true)(для Headless-фрагментов, но метод deprecated в пользу ViewModel).
Правильная обработка изменений конфигурации — запас прочности UX: приложение должно оставаться отзывчивым, сохранять состояние интерфейса и корректно перерисовываться в новых условиях.