Когда Activity может быть уничтожена

Ответ

Activity может быть уничтожена системой в нескольких случаях:

  1. Конфигурационные изменения (поворот экрана, изменение языка и т.д.) - система уничтожает Activity и создает новую с сохранением состояния через onSaveInstanceState().

  2. Нехватка памяти - система может убить фоновые Activity для освобождения ресурсов.

  3. Явный вызов finish() - разработчик сам завершает Activity.

  4. Принудительное завершение приложения пользователем через настройки.

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

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

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

Важно сохранять только легковесные данные в Bundle, так как он имеет ограничения по размеру.

Ответ 18+ 🔞

Э, слушай, вот эта ваша Activity — она, бля, как кот на раскалённой крыше, живёт недолго и весело. Система её может прихлопнуть, когда захочет, и даже не попрощавшись. Сам от себя охуеешь, когда приложение вроде работало, а потом — хуй с горы — главный экран на пустом месте отрисовался.

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

Во-вторых, памяти не хватило. Тут уж система без церемоний: видит, что твоя Activity где-то там на задворках в фоне тусуется, а новая фотка пользователю нужна — и просто берёт и выносит её к хуям собачьим, чтобы память освободить. Никаких onSaveInstanceState() уже не будет, тут уже полный аут.

В-третьих, ты сам можешь её добить, крикнув finish(). Ну, тут всё понятно, сам наступил на грабли.

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

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

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("KEY", "Important data") // Прячем свою конфетку
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // А тут достаём. Если Bundle не пустой — значит, нас убили и воскресили.
    val data = savedInstanceState?.getString("KEY") ?: "Default"
}

Но, чувак, тут главное — не обнаглеть! Этот Bundle — не помойка, куда можно всё подряд кидать. Он же имеет лимит по размеру, ядрёна вошь! Туда только самое необходимое: какой-то ID, текст поля ввода, может, позицию прокрутки. А то начнёшь туда гигабайтные фотки пихать — и получишь TransactionTooLargeException. Вот тогда будет тебе хиросима, а не восстановление состояния. Короче, думай головой, что реально нужно сохранить на пять секунд, пока система новое активити слепит.