Android 7/8中Deep Link仅首次生效,需刷新网页才可再次触发
嘿,这个问题我之前帮好几个开发者踩过坑!核心原因是Android 7.0(API 24)开始对Deep Link的任务栈管理和Intent匹配逻辑做了调整,旧版本的适配方案到这里就失效了。
问题原因分析
- 任务栈复用逻辑变化:Android 7+首次唤起应用时会为目标Activity创建新任务栈,但后续点击链接时,如果你的Activity的
launchMode或taskAffinity配置不合理,系统不会复用现有栈,反而会把链接当作普通内容展示。 - Intent Filter匹配优先级调整:系统对自定义scheme的匹配校验更严格,如果你的data规则不够严谨,后续带参数的链接可能无法匹配到目标Activity,导致唤起失败。
- 默认应用处理逻辑:首次点击后如果用户没有明确设置你的应用为该scheme的默认处理者,Android 7+后续可能会跳过唤起,直接展示链接内容。
分步解决方案
1. 调整Activity的启动模式与任务栈配置
把目标Activity的launchMode设为singleTask或singleTop,同时确保taskAffinity与应用默认一致(避免自定义特殊值),让系统能复用已存在的Activity实例:
<activity android:name=".YourDeepLinkTargetActivity" android:launchMode="singleTask" android:taskAffinity="${applicationId}"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 你的自定义scheme配置 --> <data android:scheme="your_custom_scheme" android:host="your_host" android:pathPattern="/.*" /> </intent-filter> </activity>
这里的pathPattern="/.*"是为了匹配所有带路径和参数的链接,避免因参数变化导致匹配失败。
2. 处理后续Intent的新数据
因为用了singleTask/singleTop,后续点击的链接会通过onNewIntent()传递,而不是重新创建Activity,所以必须在这个方法里更新并处理新数据:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 更新当前Activity的Intent为新的Deep Link Intent // 在这里解析新的链接参数,执行对应逻辑 parseDeepLinkParams(intent.getData()); } private void parseDeepLinkParams(Uri uri) { if (uri != null) { String targetUrl = uri.getQueryParameter("url"); // 处理业务逻辑,比如跳转对应页面 } }
3. 校验默认应用状态(可选)
可以在首次唤起时检查你的应用是否是该scheme的默认处理者,若不是则引导用户设置,避免后续点击失效:
private void checkDefaultApp() { PackageManager pm = getPackageManager(); Intent testIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("your_custom_scheme://your_host")); ResolveInfo resolveInfo = pm.resolveActivity(testIntent, PackageManager.MATCH_DEFAULT_ONLY); if (resolveInfo == null || !resolveInfo.activityInfo.packageName.equals(getPackageName())) { // 提示用户设置你的应用为默认处理者 showDefaultAppSettingDialog(); } }
4. 测试时注意清除应用默认设置
测试过程中如果遇到唤起异常,可以先在系统设置里清除你的应用的“默认应用”关联,再重新测试,避免之前的错误设置干扰结果。
内容的提问来源于stack exchange,提问作者MadDim
相关产品推荐
相关产品推荐

