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

Какие изменения в системе провоцируют изменения конфигурации

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

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

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

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

Изменения конфигурации в 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: приложение должно оставаться отзывчивым, сохранять состояние интерфейса и корректно перерисовываться в новых условиях.