Урок Kotlin в Android Studio: onSaveInstanceState данные

Поворот экрана — обычное дело, когда пользуешься телефоном. Но для приложения это целое событие: текущий экран уничтожается и создаётся заново. Если не принять меры, набранный текст и другие данные пропадут. Сегодня на занятии в Android Studio мы разберём простой механизм, который решает эту проблему — сохранение состояния через Bundle. Писать будем на Kotlin, и этот урок даст вам надёжный инструмент для борьбы с потерей информации.


Что происходит при повороте

Когда пользователь поворачивает телефон, система уничтожает текущую Activity и создаёт её заново. Представьте, что вы пишете заметку, случайно качнули устройство, и весь текст исчез. Так происходит потому, что переменные в памяти не переживают пересоздание экрана. К счастью, Android предоставляет метод onSaveInstanceState, который вызывается перед уничтожением Activity и позволяет упаковать важные данные в Bundle — специальный контейнер для пар «ключ-значение».


Сохраняем данные в Bundle

Переопределим метод onSaveInstanceState в нашей Activity. Внутри положим в Bundle всё, что хотим восстановить: текст из поля ввода, положение скролла, выбранный пункт списка. Для примера сохраним строку из EditText.

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("input_text", editText.text.toString())
}

Ключ "input_text" должен быть уникальным в пределах этого Bundle. Значение может быть строкой, числом, массивом — почти любым простым типом.


Восстанавливаем данные в onCreate

При создании Activity после поворота в onCreate передаётся параметр savedInstanceState: Bundle?. Если он не null, значит Activity пересоздаётся и в Bundle лежат сохранённые ранее данные. Мы извлекаем их по тем же ключам.

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

    val editText = findViewById<EditText>(R.id.editText)

    if (savedInstanceState != null) {
        val savedText = savedInstanceState.getString("input_text", "")
        editText.setText(savedText)
    }
}

Теперь поверните телефон — текст в поле останется на месте. Система сама позаботилась о вызове наших методов в нужный момент.


Какие данные можно сохранять

Bundle поддерживает не только строки. Вот основные типы, которые можно положить в него без дополнительных преобразований:

  • Int, Long, Double, Boolean — числа и флаги.
  • String, CharSequence — текст.
  • ArrayList<String>, ArrayList<Integer> — списки простых типов.
  • Array<String>, IntArray, LongArray — массивы.
  • Serializable и Parcelable — сложные объекты (но лучше использовать Parcelable, он быстрее).

Для собственных классов реализуйте интерфейс Parcelable или используйте аннотацию @Parcelize из Kotlin, которая делает это автоматически.


Пример с кастомным объектом

Допустим, у нас есть data-класс User. Чтобы сохранить его в Bundle, добавим аннотацию @Parcelize и реализуем интерфейс Parcelable — Kotlin сгенерирует всё сам.

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class User(val name: String, val age: Int) : Parcelable

Теперь можно сохранить объект целиком:

outState.putParcelable("user", user)
// и восстановить
val user = savedInstanceState?.getParcelable<User>("user")

Практические советы

  • Не храните большие объёмы данных в Bundle. Он предназначен для небольших порций информации — текст, числа, индексы. Тяжёлые списки лучше кэшировать в ViewModel или базе данных.
  • Всегда вызывайте super.onSaveInstanceState. Базовый класс сохраняет состояние View (например, положение курсора), и если вы пропустите вызов super, эти данные потеряются.
  • Используйте ViewModel как дополнение. Bundle удобен для UI-состояния, но бизнес-данные лучше держать в ViewModel — они переживают поворот без дополнительных усилий.

Чему мы научились

Этот урок в среде Android Studio на языке Kotlin показал, как защитить пользовательские данные от потери при повороте экрана. Вы освоили методы onSaveInstanceState и восстановление через onCreate, узнали, какие типы поддерживает Bundle, и даже сохранили собственный объект с помощью @Parcelize. Теперь ваше приложение будет вести себя предсказуемо и не раздражать пользователя пропажей набранного текста. Попробуйте применить этот подход в своём проекте — с каждым разом код будет становиться надёжнее.