Существует несколько подходов:
Использование флагов в Intent:
FLAG_ACTIVITY_SINGLE_TOP: Если активность уже находится в топе стека, то вместо создания нового экземпляра будет вызван метод onNewIntent().FLAG_ACTIVITY_CLEAR_TOP: Если активность уже существует в стеке, все активности над ней будут завершены, и она будет приведена к топовой позиции.FLAG_ACTIVITY_NEW_TASK: Часто используется с CLEAR_TOP для работы с активностями из другой задачи.Настройка launchMode в AndroidManifest.xml:
singleTop: Аналогично FLAG_ACTIVITY_SINGLE_TOP при запуске через Intent.singleTask: Активность является корнем новой задачи; если экземпляр уже существует в какой-либо задаче, она будет переведена вперед, и все активности над ней будут завершены.singleInstance: Активность существует в собственной задаче и является единственной активностью в этой задаче.Проверка существования активности перед запуском:
ActivityManager для проверки текущего стека активностей. Этот подход менее предпочтителен из-за сложности и накладных расходов.Реакция на onNewIntent():
singleTop или FLAG_ACTIVITY_SINGLE_TOP, вся логика обработки deeplink должна быть реализована в методе onNewIntent(), а не в onCreate(). Не забудьте вызвать setIntent(intent) внутри onNewIntent() для обновления Intenta, доступного через getIntent().Пример использования launchMode="singleTop" и onNewIntent():
В AndroidManifest.xml:
xml
В классе активности YourDeeplinkActivity:
kotlin
Выбор подхода зависит от конкретного сценария использования и желаемого поведения стека активностей. Наиболее распространенное решение для deeplink'ов, ведущих к уже существующей активности, — использование launchMode="singleTop" и обработка в onNewIntent().