Что означает флаг singleTop в launch modes Activity в Android
Что проверяют
Знаете ли вы, что режим запуска управляет стеком задачи, и понимаете ли, что singleTop действует только на вершину стека. Дальше почти всегда идут вопросы про onNewIntent и про дубликаты экранов при переходе из уведомления.
Как отвечать
Режим объявляется атрибутом android:launchMode="singleTop" у Activity в манифесте либо задаётся на конкретный переход флагом Intent.FLAG_ACTIVITY_SINGLE_TOP. Смысл такой: если экземпляр этой Activity уже находится на вершине стека текущей задачи, новый экземпляр не создаётся, а в существующий приходит onNewIntent(intent). Если тот же экран лежит в стеке, но не на вершине, создаётся новый экземпляр, и дубликаты возможны.
Порядок вызовов полезно назвать самому: сначала onPause, затем onNewIntent, затем onResume. Метод onCreate при этом не вызывается.
Чем отличается от соседей:
standardсоздаёт новый экземпляр на каждый вызов, даже если такой же уже открыт;singleTaskдержит в задаче один экземпляр и при повторном запуске убирает всё, что лежит выше, тоже черезonNewIntent;singleInstanceпомещает Activity в отдельную задачу, где она остаётся единственной.
Где спотыкаются
Забывают вызвать setIntent(intent) внутри onNewIntent. Метод getIntent() продолжает возвращать самый первый intent, и экран показывает данные прошлого уведомления. Ошибка живучая, потому что при холодном старте всё работает правильно.
Ждут от singleTop, что экран будет один на всё приложение. Режим спасает только от повторного открытия подряд. Стоит вклиниться другому экрану, и второй экземпляр появится. Для единственности нужен singleTask или флаг FLAG_ACTIVITY_CLEAR_TOP.
Оставляют разбор аргументов только в onCreate. При попадании в ветку singleTop метод не вызывается, и экран просто не реагирует на новый intent. Разбор нужно вынести в отдельную функцию и звать её из обоих мест.