如何让Android Deeplink每次打开MainActivity?解析launchMode差异
Android Deeplink 跳转问题与LaunchMode解析
问题背景
在AndroidManifest中注册了响应Deeplink的MainActivity,配置如下:
<activity android:name=".MainActivity" android:label="@string/app_name" android:launchMode="singleTop" android:exported="true" android:theme="@style/Theme.TestDeeplink"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="testdeeplink" /> </intent-filter> </activity>
同时存在DashboardActivity,用户从MainActivity点击按钮可跳转至该页面:
<activity android:name=".DashboardActivity" android:label="DashboardActivity" android:theme="@style/Theme.TestDeeplink"/>
通过adb命令测试Deeplink:
首次调用:
adb shell am start -d testdeeplink://test Starting: Intent { dat=testdeeplink://test }
第二次调用(此时已跳转到DashboardActivity):
adb shell am start -d testdeeplink://test Starting: Intent { dat=testdeeplink://test } Warning: Activity not started, intent has been delivered to currently running top-most instance.
测试现象:
- 当应用停留在MainActivity时,调用Deeplink会触发
onNewIntent方法,正常接收Intent - 当应用跳转到DashboardActivity后,调用Deeplink不会触发
onNewIntent,也不会打开MainActivity
解决方案
将MainActivity的launchMode从singleTop修改为singleTask或singleInstance后,即可实现每次调用Deeplink都强制打开MainActivity。
LaunchMode 详细差异解析
1. standard(默认模式)
- 每次启动Activity都会创建新实例,无论栈中是否已有该Activity的实例
- 新实例被压入当前任务栈顶部
- 适用于无特殊跳转逻辑的普通页面
2. singleTop
- 若目标Activity已在当前任务栈顶部,则不创建新实例,直接调用该实例的
onNewIntent方法 - 若目标Activity不在栈顶,仍会创建新实例压入栈顶
- 你的问题根源在此:当DashboardActivity在栈顶时,MainActivity不在栈顶,Deeplink的Intent只会传递给当前栈顶的DashboardActivity,但该页面未配置对应IntentFilter也未处理该Intent,导致
onNewIntent不触发,MainActivity也无法唤起
3. singleTask
- 系统会检查当前任务栈中是否存在该Activity的实例:
- 若存在,会将该实例之上的所有Activity弹出栈,让该实例回到栈顶,同时调用其
onNewIntent方法 - 若不存在,则创建新实例压入栈顶
- 若存在,会将该实例之上的所有Activity弹出栈,让该实例回到栈顶,同时调用其
- 该Activity会作为任务栈的根Activity(未指定任务栈时使用默认栈)
- 适合作为应用入口或需要唯一实例、同时清理上层页面的场景,比如你的Deeplink入口MainActivity
4. singleInstance
- 逻辑与
singleTask类似,但该Activity会独占一个全新的任务栈 - 整个系统中只会存在该Activity的一个实例
- 适用于完全独立于其他页面的场景(如系统拨号、设置页面),普通应用开发中较少使用
内容的提问来源于stack exchange,提问作者Hien Nguyen
相关产品推荐
相关产品推荐

