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

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

1.8 Middle🔥 162 комментариев
#Android компоненты

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

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

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

Механизм onRestoreInstanceState() и жизненный цикл Activity

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

Когда точно вызывается onRestoreInstanceState()?

Короткий ответ: метод onRestoreInstanceState() вызывается системой Android после onStart(), но непосредственно перед onResume(), в случае, если система ранее сохранила состояние данного экземпляра Activity (через вызов onSaveInstanceState()), а теперь восстанавливает его.

Детальная последовательность вызовов при восстановлении:

  1. onCreate(Bundle savedInstanceState)
  2. onStart()
  3. onRestoreInstanceState(Bundle savedInstanceState)
  4. onResume()

Ключевое отличие от onCreate(): оба метода получают один и тот же объект Bundle (набор пар "ключ-значение") с сохранёнными данными. Основная разница — в семантике и рекомендуемом использовании:

  • onCreate() — общий метод инициализации Activity (раздувание макета, нахождение View, создание адаптеров). Состояние здесь можно восстановить, но Bundle может быть null (при первом создании Activity).
  • onRestoreInstanceState() — специализированный метод, вызываемый только когда есть что восстанавливать. Его Bundle никогда не бывает null. Это делает его идеальным местом для восстановления состояния UI, которое зависит от динамических данных, не сохранённых автоматически.
class MainActivity : AppCompatActivity() {

    private lateinit var textView: TextView
    private var userInput: String = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById(R.id.textView)

        // Восстановление состояния ОПЦИОНАЛЬНО здесь.
        // savedInstanceState может быть null!
        // Чаще здесь восстанавливаем только тяжёлые данные (списки, модели).
        if (savedInstanceState != null) {
            userInput = savedInstanceState.getString("USER_INPUT_KEY") ?: ""
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Сохраняем пользовательский ввод (система этого не делает автоматически)
        outState.putString("USER_INPUT_KEY", userInput)
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        // ИДЕАЛЬНОЕ место для восстановления состояния View!
        // Bundle гарантированно не-null.
        val restoredInput = savedInstanceState.getString("USER_INPUT_KEY")
        restoredInput?.let {
            userInput = it
            textView.text = it // Восстанавливаем отображение
        }
    }
}

Типичные сценарии вызова onRestoreInstanceState()

Метод вызывается системой, когда Activity уничтожается не по воле пользователя, но может быть воссоздана позже с нужным состоянием. Основные случаи:

  • Изменение конфигурации устройства (наиболее частый случай):
    *   Поворот экрана (смена ориентации).
    *   Изменение языка системы.
    *   Подключение физической клавиатуры.
    *   Режим многооконности (Multi-Window), когда пользователь меняет размер окна приложения.
    *   В этих случаях система уничтожает текущий экземпляр Activity и создаёт новый, адаптированный под новую конфигурацию, передавая ему сохранённый Bundle.

  • Управление памятью системой:
    *   Когда приложение находится в фоне, а системе срочно нужны ресурсы (при низкой памяти), система может **уничтожить процесс приложения**, включая все его Activity. Если пользователь позже вернётся в приложение (через недавние задачи или иконку), система попытается восстановить Activity «как были», используя сохранённое состояние. **`onRestoreInstanceState()` будет вызван у воссозданной главной (и, возможно, других) Activity.**

Важные отличия от onSaveInstanceState()

Эти два метода работают в паре, но их вызов обусловлен разными событиями:

  • onSaveInstanceState(Bundle outState) вызывается системой до того, как Activity будет уничтожена для возможности восстановления. Это происходит:
    *   Перед `onStop()` (а иногда и перед `onPause()`) при изменении конфигурации.
    *   Когда Activity уходит на задний план и **может** быть уничтожена системой.
    *   **Важно:** метод НЕ вызывается при явном завершении пользователем (нажатие "Назад") или при вызове `finish()`, так как в этих случаях восстановление не предполагается.

Рекомендации по использованию

  1. Всегда вызывайте super.onRestoreInstanceState(savedInstanceState) в начале метода. Родительская реализация восстанавливает состояние корневого View-элемента макета (например, текст в EditText, позиция прокрутки в ScrollView), если у View есть заданный android:id.
  2. Используйте для восстановления сложного состояния UI. Если у вас есть кастомные View, сложная логика отображения, состояние чекбоксов, радиокнопок, несохранённых системой, или прогресс, который должен быть отображён — это место для их восстановления.
  3. Не храните в Bundle большие данные (например, Bitmap). Используйте для этого другие механизмы (кэш на диске, ViewModel + SavedStateHandle).
  4. В современной разработке рассмотрите ViewModel в связке с API Saved State Module for ViewModel. Это более мощная и удобная альтернатива, особенно для архитектурных паттернов (MVP, MVVM). ViewModel переживает изменение конфигурации, а SavedStateHandle позволяет ей получать начальное состояние из Bundle системы и сохранять данные обратно, избавляя Activity от ручного управления Bundle в большинстве случаев.
// Современный подход с ViewModel и SavedStateHandle
class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    companion object {
        private const val INPUT_KEY = "input_key"
    }

    val userInput: MutableLiveData<String> = savedStateHandle.getLiveData(INPUT_KEY)

    fun saveInput(input: String) {
        savedStateHandle[INPUT_KEY] = input
    }
}

// В Activity/Fragment: восстановление происходит автоматически через LiveData в ViewModel

Итог: onRestoreInstanceState() — это чётко определённый системой "хук" жизненного цикла, вызываемый после onStart() и перед onResume() для восстановления UI-состояния из ранее сохранённого Bundle. Его основная цель — обеспечить бесшовный пользовательский опыт при временном уничтожении и последующем воссоздании интерфейса, вызванном системными событиями.