Могут ли данные в onSaveInstanceState пережить смерть процесса

Ответ

Да, onSaveInstanceState сохраняет данные только для временного уничтожения активити (например, при повороте экрана). При убийстве процесса система не гарантирует сохранение этого Bundle. Для долговременного хранения используйте:

  1. SharedPreferences - для простых данных
  2. Локальную БД (Room) - для сложных структур
  3. Файлы - для больших данных

Пример сохранения в onSaveInstanceState:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("KEY", "value")
}

Для восстановления - onCreate(savedInstanceState: Bundle?) или onRestoreInstanceState().

Ответ 18+ 🔞

Э, слушай, тут один момент, который многих вводит в ступор. Вот этот onSaveInstanceState — он работает как временная записочка в кармане, пока ты в туалет отошёл. Повернул телефон — всё норм, достал из кармана записку, прочитал. Но если тебя, грубо говоря, вынесли из бара в бессознательном состоянии (система убила процесс), то эти бумажки из кармана нахуй выкидывают. Понимаешь? Доверия к этому механизму — ноль ебать.

Так что если тебе надо, чтобы данные пережили настоящий разгром, а не просто поворот экрана, то надо пользоваться нормальными хранилищами.

Варианты, которые реально работают:

  1. SharedPreferences — идеально для всякой ерунды: логина, настроек, последнего выбранного размера шрифта. Просто, быстро, но для списка из 1000 объектов — пиздец как неудобно.
  2. Локальная база (типа Room) — вот это уже серьёзно. Для списков, сложных объектов, всего, что имеет структуру. Немного повозиться придётся, но зато надёжно, ёпта.
  3. Файлы — если у тебя там гигабайты фоток, видео или какой-нибудь огромный 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, база или файлы. Выбор за тобой, чувак.