Ответ
Да, onSaveInstanceState сохраняет данные только для временного уничтожения активити (например, при повороте экрана). При убийстве процесса система не гарантирует сохранение этого Bundle. Для долговременного хранения используйте:
SharedPreferences- для простых данных- Локальную БД (Room) - для сложных структур
- Файлы - для больших данных
Пример сохранения в onSaveInstanceState:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("KEY", "value")
}
Для восстановления - onCreate(savedInstanceState: Bundle?) или onRestoreInstanceState().
Ответ 18+ 🔞
Э, слушай, тут один момент, который многих вводит в ступор. Вот этот onSaveInstanceState — он работает как временная записочка в кармане, пока ты в туалет отошёл. Повернул телефон — всё норм, достал из кармана записку, прочитал. Но если тебя, грубо говоря, вынесли из бара в бессознательном состоянии (система убила процесс), то эти бумажки из кармана нахуй выкидывают. Понимаешь? Доверия к этому механизму — ноль ебать.
Так что если тебе надо, чтобы данные пережили настоящий разгром, а не просто поворот экрана, то надо пользоваться нормальными хранилищами.
Варианты, которые реально работают:
SharedPreferences— идеально для всякой ерунды: логина, настроек, последнего выбранного размера шрифта. Просто, быстро, но для списка из 1000 объектов — пиздец как неудобно.- Локальная база (типа Room) — вот это уже серьёзно. Для списков, сложных объектов, всего, что имеет структуру. Немного повозиться придётся, но зато надёжно, ёпта.
- Файлы — если у тебя там гигабайты фоток, видео или какой-нибудь огромный JSON с каталогом товаров. В
onSaveInstanceStateтакое не запихнёшь, там лимиты.
А вот как этим onSaveInstanceState пользоваться, если всё-таки для поворота надо:
Сохраняем, когда нас начинают сворачивать:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("MY_KEY", "Вот это значение")
}
А восстанавливаем, когда нас снова разворачивают. Можно в onCreate (смотри, там savedInstanceState может быть null!):
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.my_layout)
if (savedInstanceState != null) {
val myValue = savedInstanceState.getString("MY_KEY")
// ... и делаем что-то с этим значением
}
}
Или можно в отдельном методе onRestoreInstanceState — он вызывается после onStart(), когда точно известно, что состояние есть для восстановления.
Короче, запомни: для лёгкой тряски — Bundle. Для ядерной зимы, когда система решит почистить память, — SharedPreferences, база или файлы. Выбор за тобой, чувак.