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

Как ведет жизненный цикл Activity при изменении конфигурации

1.8 Middle🔥 281 комментариев
#Жизненный цикл и навигация

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

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

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

Жизненный цикл Activity при изменении конфигурации

При изменении конфигурации устройства (поворот экрана, изменение языка, подключение клавиатуры и т.д.) система Android уничтожает текущую Activity и создает ее заново с новой конфигурацией. Это происходит потому, что Android рассматривает изменение конфигурации как событие, требующее пересоздания ресурсов (макетов, строк и других значений, зависящих от конфигурации).

Полный цикл уничтожения и пересоздания

Система последовательно вызывает следующие методы жизненного цикла:

  1. onPause() — Activity теряет фокус, но еще видна
  2. onStop() — Activity полностью скрыта
  3. onDestroy() — Activity уничтожается, освобождаются ресурсы
  4. onCreate() — создается новая Activity с новой конфигурацией
  5. onStart() — Activity становится видимой
  6. 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")
    }
}

Ключевые моменты процесса

  1. Сохраняемое состояние (Bundle) — перед вызовом onDestroy() система автоматически вызывает onSaveInstanceState(), где можно сохранить временные данные UI (текст в полях, позицию скролла и т.д.)

  2. Несохраняемое состояние — обычные переменные экземпляра класса теряются при пересоздании. Для их сохранения нужно использовать:

    • onSaveInstanceState() для простых данных
    • ViewModel для сложных данных и бизнес-логики
    • Постоянное хранилище (база данных, SharedPreferences) для критических данных
  3. Исключение из правила — добавление 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 или архитектурные компоненты, которые переживают изменение конфигурации

Важное замечание

Изменение конфигурации — это не только поворот экрана. К нему также относятся: изменение языка, режима ночной темы, подключение док-станции, изменение плотности пикселей и другие системные события, требующие обновления ресурсов. Понимание этого механизма критически важно для создания стабильных приложений с правильным управлением состоянием.