Поворот экрана — обычное дело, когда пользуешься телефоном. Но для приложения это целое событие: текущий экран уничтожается и создаётся заново. Если не принять меры, набранный текст и другие данные пропадут. Сегодня на занятии в 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. Теперь ваше приложение будет вести себя предсказуемо и не раздражать пользователя пропажей набранного текста. Попробуйте применить этот подход в своём проекте — с каждым разом код будет становиться надёжнее.