Ответ
Activity может быть уничтожена системой в нескольких случаях:
-
Конфигурационные изменения (поворот экрана, изменение языка и т.д.) - система уничтожает Activity и создает новую с сохранением состояния через
onSaveInstanceState(). -
Нехватка памяти - система может убить фоновые Activity для освобождения ресурсов.
-
Явный вызов
finish()- разработчик сам завершает Activity. -
Принудительное завершение приложения пользователем через настройки.
Пример обработки состояния:
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. Вот тогда будет тебе хиросима, а не восстановление состояния. Короче, думай головой, что реально нужно сохранить на пять секунд, пока система новое активити слепит.