Как работает открытие Activity с флагом singleTask в стеке в Android
Что проверяют
Понимаете ли вы модель задач и бэкстека в Android, а не только определение режима запуска. Следом обычно спрашивают, чем singleTask отличается от singleTop и флага FLAG_ACTIVITY_CLEAR_TOP и как обработать повторный интент.
Как отвечать
Начните с уточнения: singleTask это не флаг интента, а режим запуска, атрибут android:launchMode в манифесте. Поведение при старте такой Activity:
- экземпляра нет: система создаёт его в задаче с подходящей
taskAffinity. По умолчанию affinity у всех Activity приложения одна, поэтому новая задача не появляется, Activity ложится в текущую. Отдельная задача будет, если задать своюtaskAffinity; - экземпляр есть: новый не создаётся. Задача с ним выходит на передний план, все Activity над ним уничтожаются, а сам экземпляр получает
onNewIntent(); - один экземпляр: второй копии не будет, откуда бы её ни пытались запустить.
В onNewIntent() вызывайте setIntent(intent), иначе getIntent() дальше вернёт старый интент, с которым Activity создавалась. Перед onNewIntent() Activity всегда ставится на паузу, так что onResume() придёт уже после.
Сравнение, которого от вас ждут:
singleTop: переиспользует экземпляр, только если он на вершине стека, иначе создаёт новый;singleInstance: Activity живёт одна в собственной задаче, другие туда не попадают;singleInstancePerTask(API 31+): всегда корень задачи, но экземпляров может быть несколько в разных задачах.
Типичные сценарии: главный экран, куда ведут диплинки и уведомления, или экран, куда браузер возвращает пользователя после OAuth. Проверить фактический стек задач помогает adb shell dumpsys activity activities.
Где спотыкаются
Называют singleTask флагом и путают с Intent.FLAG_ACTIVITY_SINGLE_TOP и FLAG_ACTIVITY_NEW_TASK.
Уверены, что singleTask всегда создаёт новую задачу. Без своей taskAffinity Activity остаётся в задаче приложения.
Не обрабатывают onNewIntent() или забывают setIntent(). Данные из уведомления теряются, экран показывает старое содержимое.