Ответ
Метод onSaveInstanceState() вызывается перед тем, как система может уничтожить Activity (например, при повороте экрана, выходе из приложения или при нехватке памяти). Он позволяет сохранить временные данные в Bundle, которые затем передаются в onCreate() или onRestoreInstanceState() при восстановлении.
Пример:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("KEY_TEXT", editText.text.toString())
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val savedText = savedInstanceState?.getString("KEY_TEXT") ?: ""
editText.setText(savedText)
}
Важно:
- Не сохраняйте тяжелые объекты (например, Bitmap).
- Для постоянного хранения используйте
ViewModelили базу данных. - Не вызывается при явном завершении (например,
finish()).
Ответ 18+ 🔞
Э, слушай, тут про сохранение состояния в Android такая тема, что просто ёпта. Представь: ты в приложении что-то вводишь, а тут бац — экран перевернулся, или система из-за нехватки памяти твою активити в пизду отправила. И всё, введённый текст — накрылся медным тазом. Так вот, чтобы такого пиздеца не было, есть метод onSaveInstanceState().
Это, блядь, как последний крик души перед тем, как система тебя прибьёт. Он даёт тебе шанс запихнуть все временные данные в специальную сумку — Bundle. Потом, когда система воскресит твою активити, она эту сумку тебе обратно в onCreate() или onRestoreInstanceState() сунет. Удобно же?
Вот смотри, как это выглядит на деле:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("KEY_TEXT", editText.text.toString())
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val savedText = savedInstanceState?.getString("KEY_TEXT") ?: ""
editText.setText(savedText)
}
Видишь? Сохранили текст из поля перед смертью, а при рождении — достали и подставили обратно. Красота!
Но есть важные моменты, чувак:
- Не пытайся запихнуть в эту сумку овердохуища данных. Тяжёлые объекты вроде картинок (
Bitmap) — это пиздец, не для этого она. Сумка-то не резиновая, и система может просто отказаться её таскать. - Для чего-то серьёзного и постоянного — это не твой инструмент. Тут
ViewModelв помощь, или база данных.onSaveInstanceState()— это для лёгкой временщины, типа текста в поле или позиции скролла. - И ещё: этот метод вызывается не всегда. Если ты сам явно закрыл активити через
finish(), то никакого сохранения не будет, система считает, что ты так захотел. Так что не удивляйся потом, где твои данные.
В общем, хитрая жопа эта система, но если понять принцип — жить становится проще. Главное — не пытайся сделать из этого метода универсальную свалку, а то будет тебе хиросима.