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

Когда вызывается onSaveInstanceState у Activity?

1.0 Junior🔥 212 комментариев
#Android компоненты#Жизненный цикл и навигация

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

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

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

Когда вызывается onSaveInstanceState() у Activity?

onSaveInstanceState() — это критически важный метод жизненного цикла Activity в Android, предназначенный для сохранения временного состояния UI перед возможным уничтожением активности. Его вызов происходит в строго определенных ситуациях, когда система Android предполагает, что активность может быть уничтожена, но пользователь потенциально вернется к ней.

Основные сценарии вызова:

  1. Когда система уничтожает Activity для сохранения ресурсов Наиболее частый случай. Система может остановить и уничтожить вашу активность (например, при нехватке памяти), чтобы освободить ресурсы для других задач. При этом она гарантирует возможность восстановления состояния через onSaveInstanceState() и последующий onRestoreInstanceState().

  2. При явном вызове finish() или переходе к новой Activity Если текущая активность завершается или начинает другую, система сохраняет ее состояние, чтобы обеспечить возможность возврата через кнопку "Назад".

  3. При изменении конфигурации устройства (Configuration Change) Важный и особый случай! Это происходит при:

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

Ключевые особенности поведения:

  • Вызов происходит ДО onStop() и потенциально ДО onDestroy() Система гарантирует сохранение состояния перед остановкой активности.

  • НЕ вызывается при явном уничтожении активности пользователем Например, если пользователь нажимает кнопку "Назад" для окончательного закрытия, состояние не сохраняется, так как возврата не предполагается.

  • Данные сохраняются в Bundle Метод получает объект Bundle, в который нужно поместить ключевые данные состояния.

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState) // ВАЖНО: всегда вызывать super!
    
    // Сохраняем текущее значение счетчика
    outState.putInt("COUNTER_VALUE", counter)
    
    // Сохраняем текст из EditText
    outState.putString("EDIT_TEXT", editText.text.toString())
    
    // Сохраняем состояние сложного объекта (например, через Parcelable)
    outState.putParcelable("USER_DATA", currentUser)
}

Почему это важно?

Без сохранения состояния пользовательский опыт будет нарушен:

  • При повороте телефона поля ввода очистятся
  • Прокрутка списка вернется к началу
  • Временные данные формы будут потеряны

Лучшие практики:

  • Всегда вызывайте super.onSaveInstanceState() — базовый класс сохраняет важные данные View (например, текст в TextView).
  • Сохраняйте только временное состояние UI, не сохраняйте:
    • Постоянные данные (используйте базу данных или SharedPreferences)
    • Большие объекты (например, изображения)
    • Ссылки на другие активности или контексты
  • Для сложных объектов используйте Parcelable или Serializable.
  • Восстанавливайте состояние в onCreate() (Bundle передается как параметр) или в onRestoreInstanceState().
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    if (savedInstanceState != null) {
        // Восстанавливаем состояние
        counter = savedInstanceState.getInt("COUNTER_VALUE", 0)
        val savedText = savedInstanceState.getString("EDIT_TEXT")
        editText.setText(savedText)
    }
}

Альтернативы и современные подходы:

Для обработки изменения конфигурации (особенно поворота) также можно использовать:

  • ViewModel из Architecture Components — данные сохраняются автоматически.
  • Сохранение состояния в onRetainNonConfigurationInstance() (устаревший способ).
  • Отключение пересоздания активности через android:configChanges в манифесте (не рекомендуется, требует самостоятельной обработки).

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