Когда пересоздается Activity

Ответ

При повороте экрана, изменении языка, конфигурации системы или принудительном завершении системой (из-за нехватки памяти). В этих случаях система вызывает onDestroy(), затем создает новый экземпляр и вызывает onCreate().

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

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

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val restoredValue = savedInstanceState?.getString("KEY")
}

Для обработки изменений конфигурации можно использовать android:configChanges в манифесте, но это не рекомендуется для большинства сценариев.

Ответ 18+ 🔞

Э, слушай, вот тебе жизненная ситуация из мира андроида. Представь: ты наконец-то выставил на экране нужный текст, выбрал опцию... И тут — бац! — телефон повернули, язык сменили или система, сука, из-за нехватки памяти твое приложение прибила. Ёпта, волнение ебать!

Что происходит? Всё, твой активити накрылся медным тазом. Система вызывает onDestroy(), а потом, как ни в чём не бывало, создаёт новый экземпляр и запускает onCreate() заново. И всё твое состояние, над которым ты так парился, — на хуй улетело. Сам от себя охуеешь.

Но не всё так плохо, есть же способ сохранить хоть что-то! Перед тем как всё похерить, система даёт тебе последний шанс — метод onSaveInstanceState(). Туда ты можешь запихнуть в Bundle всё, что дорого сердцу.

Вот смотри, как это выглядит в коде:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("KEY", "value") // Кладём свою ценную строку, например
}

Потом, когда система откроет новый экземпляр и вызовет onCreate(), она протянет тебе тот же самый Bundle (если он есть). Ты его раскрываешь и забираешь своё добро обратно.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val restoredValue = savedInstanceState?.getString("KEY") // Ага, вот и наша строка!
}

Вот так, бля, и живём. Восстанавливаем то, что успели спасти.

А ещё есть, конечно, хитрая жопа — атрибут android:configChanges в манифесте. Мол, "система, не трогай ничего, я сам всё обработаю". Но это, чувак, тот самый хуй в пальто. Для 99% случаев так делать не рекомендуется, потому что возьмёшь на себя овердохуища ручной работы, а справишься хуёво. Лучше доверься нормальному механизму сохранения состояния.