Что такое isFinishing в Activity и как его использовать для определения смены конфигурации
Что проверяют
Знаете ли вы жизненный цикл Activity настолько, чтобы отличать окончательное закрытие экрана от пересоздания. От этого зависит, где освобождать ресурсы и что считать уходом пользователя, а ошибка здесь даёт либо утечки, либо потерю данных при повороте.
Как отвечать
isFinishing() возвращает true, если Activity действительно закрывается: вызван finish(), нажата кнопка назад, экран убран вместе со стеком задачи. При смене конфигурации Activity тоже уничтожается, но завершением это не считается, и флаг остаётся false. Прямой признак пересоздания это isChangingConfigurations().
override fun onDestroy() {
super.onDestroy()
when {
isFinishing -> releaseForGood()
isChangingConfigurations -> keepForRecreate()
}
}Скажите и про современный способ. ViewModel переживает смену конфигурации сама, её onCleared() приходит только при окончательном уничтожении владельца, поэтому ручные проверки нужны редко и в основном для внешних ресурсов: отменить загрузку, отписаться от датчика, закрыть соединение. Данные, которые обязаны пережить смерть процесса, идут в onSaveInstanceState или SavedStateHandle, а не в поле Activity.
Где спотыкаются
Считают этот флаг антонимом смены конфигурации. Ложных значений false хватает и без поворота: систему никто не обязывает завершать экран честно, процесс в фоне могут убить, и тогда оба признака скажут, что завершения нет.
Вешают логику на onPause. Этот вызов приходит и при перекрытии диалогом, и при уходе в шторку, а onStop с onDestroy в жёстких сценариях можно вообще не дождаться. Точка для окончательного освобождения это onDestroy с проверкой, точка для гарантированного сохранения это onSaveInstanceState.
Используют признак вместо хранения состояния. Он ничего не сохраняет: если данные лежали в поле Activity, на повороте они пропадут независимо от проверок. Ответ про isFinishing без упоминания ViewModel и SavedStateHandle звучит как знание из времён, когда поворот экрана чинили статическим полем.