Activity深度链接启动异常:ADB正常Chrome崩溃,参数缺失报错
问题分析与解决方案
为什么两种启动方式行为不同?
核心原因是启动流程的差异:
- 用ADB命令
adb shell am start -d myscheme://myhost/mypath启动时,是直接调用Activity的系统启动逻辑,完全绕过了Navigation组件的DeepLink解析和Safe Args参数校验流程。只要Activity本身没有主动校验参数,就能正常启动。 - 通过Chrome启动时,系统会触发Navigation组件对DeepLink URI的解析逻辑,此时Safe Args会严格按照导航图中定义的规则校验必填参数。因为你的URI里没有携带
someRequiredArgumentHere这个必填参数,所以直接抛出参数缺失的异常。
解决方案
根据你的业务需求,选择以下任意一种方案:
补全DeepLink URI的必填参数
如果someRequiredArgumentHere确实是业务必需的,需要修改DeepLink的格式,确保Chrome打开时携带该参数。比如:- 若参数是路径参数:
myscheme://myhost/mypath/{someRequiredArgumentHere},调用时传入具体值如myscheme://myhost/mypath/123 - 若参数是Query参数:
myscheme://myhost/mypath?someRequiredArgumentHere=xxx
同时要确保导航图(nav_graph.xml)中对应的目的地节点的DeepLink配置和URI格式匹配。
- 若参数是路径参数:
将参数设为非必填或添加默认值
如果这个参数并非必须,在导航图的参数配置中:- 给参数添加
android:defaultValue属性,指定默认值; - 或者去掉参数的必填标记(Safe Args中未指定
app:nullable="false"的参数默认可选,若之前显式设置了必填,改为app:nullable="true")。
- 给参数添加
统一启动流程的参数校验
为了避免两种启动方式的行为不一致,建议在DeepLinkActivity中主动通过Safe Args获取参数,比如在onCreate中调用:val args = DeepLinkActivityArgs.fromIntent(intent) // 使用args.someRequiredArgumentHere这样即使ADB直接启动Activity,也会触发参数校验,提前发现问题,保证两种启动方式的行为一致。
内容的提问来源于stack exchange,提问作者Augusto Carmo
相关产品推荐
相关产品推荐

