Как ведет жизненный цикл Activity при изменении конфигурации
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Жизненный цикл Activity при изменении конфигурации
При изменении конфигурации устройства (поворот экрана, изменение языка, подключение клавиатуры и т.д.) система Android уничтожает текущую Activity и создает ее заново с новой конфигурацией. Это происходит потому, что Android рассматривает изменение конфигурации как событие, требующее пересоздания ресурсов (макетов, строк и других значений, зависящих от конфигурации).
Полный цикл уничтожения и пересоздания
Система последовательно вызывает следующие методы жизненного цикла:
- onPause() — Activity теряет фокус, но еще видна
- onStop() — Activity полностью скрыта
- onDestroy() — Activity уничтожается, освобождаются ресурсы
- onCreate() — создается новая Activity с новой конфигурацией
- onStart() — Activity становится видимой
- onResume() — Activity получает фокус и готова к взаимодействию
Пример кода изменения состояния
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("Lifecycle", "onCreate вызван")
// Восстановление состояния из Bundle
if (savedInstanceState != null) {
val savedText = savedInstanceState.getString("KEY_TEXT")
// Восстанавливаем UI состояние
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.d("Lifecycle", "onSaveInstanceState вызван")
// Сохраняем важные данные перед уничтожением
outState.putString("KEY_TEXT", editText.text.toString())
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
Log.d("Lifecycle", "onRestoreInstanceState вызван")
// Альтернативный способ восстановления состояния
val savedText = savedInstanceState.getString("KEY_TEXT")
}
}
Ключевые моменты процесса
-
Сохраняемое состояние (Bundle) — перед вызовом
onDestroy()система автоматически вызываетonSaveInstanceState(), где можно сохранить временные данные UI (текст в полях, позицию скролла и т.д.) -
Несохраняемое состояние — обычные переменные экземпляра класса теряются при пересоздании. Для их сохранения нужно использовать:
onSaveInstanceState()для простых данных- ViewModel для сложных данных и бизнес-логики
- Постоянное хранилище (база данных, SharedPreferences) для критических данных
-
Исключение из правила — добавление
android:configChangesв манифесте позволяет обрабатывать определенные изменения конфигурации без пересоздания Activity:
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
</activity>
В этом случае вместо пересоздания будет вызван метод onConfigurationChanged():
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Самостоятельно обновляем ресурсы под новую конфигурацию
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Обновляем UI для альбомной ориентации
}
}
Рекомендации по работе с изменением конфигурации
- Используйте ViewModel — данные в ViewModel сохраняются при изменении конфигурации, что позволяет отделить данные от UI логики
- Используйте onSaveInstanceState для минимального UI состояния — сохраняйте только то, что необходимо для восстановления пользовательского ввода
- Избегайте android:configChanges для обработки поворота экрана — ручное управление ресурсами часто сложнее, чем стандартное пересоздание
- Для тяжелых операций используйте RetainedFragment или архитектурные компоненты, которые переживают изменение конфигурации
Важное замечание
Изменение конфигурации — это не только поворот экрана. К нему также относятся: изменение языка, режима ночной темы, подключение док-станции, изменение плотности пикселей и другие системные события, требующие обновления ресурсов. Понимание этого механизма критически важно для создания стабильных приложений с правильным управлением состоянием.