Как пережить смерть процесса
Вопрос
Расскажи, что такое смерть процесса, как её воспроизвести и как сделать экран устойчивым к ней.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Система убивает процесс в фоне, при возврате восстанавливает стек и Bundle
ViewModel и синглтоны создаются заново
Ввод и выбор пользователя в SavedStateHandle или rememberSaveable
Данные из персистентного хранилища по id
Воспроизвести: свернуть, adb shell am kill, вернуться
Осторожно с синглтонами, в которых хранили состояние сессии
Что могут спросить следом
- Чем это отличается от Don't keep activities?
- Что будет с глобальным синглтоном, где лежал текущий пользователь?
Разбор
Когда приложение в фоне, система может убить его процесс, чтобы освободить память. Пользователь об этом не знает: при возврате Android восстанавливает стек экранов и отдаёт им сохранённые Bundle, но всё в памяти процесса создаётся заново, включая ViewModel и синглтоны. Типичный баг: экран открывается, а данные пустые или приложение падает, потому что в синглтоне не оказалось текущего пользователя. Чтобы быть устойчивым, я сохраняю в SavedStateHandle или rememberSaveable то, что пользователь ввёл или выбрал, а данные восстанавливаю из базы или сети по сохранённому id. Глобальное состояние сессии беру из персистентного хранилища, а не из памяти. Воспроизвожу так: сворачиваю приложение, выполняю adb shell am kill с именем пакета и возвращаюсь из списка недавних. Опция «Don't keep activities» полезна, но проверяет только уничтожение Activity, процесс и синглтоны при этом живы.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.