Android隐式Deep Link无唯一URI路径如何实现统一动态路由
问题根因
你遇到的根路径跳转异常是因为Navigation组件的DeepLink匹配规则为:只要路径匹配,无论是否携带配置的查询参数都会命中规则,若多个页面的DeepLink规则重叠,会优先匹配导航图中先声明的页面规则,所以你当前任务面板的DeepLink规则覆盖了首页的根路径规则。
无唯一URI时的统一路由实现方案
不需要为每个页面配置独立URI,通过统一调度层即可实现全链路动态跳转,实现步骤如下:
- 仅在应用入口(主Activity)配置唯一的DeepLink intent-filter,覆盖所有你需要接收的域名规则
<activity android:name=".MainActivity" android:exported="true"> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="app.abc.com" /> </intent-filter> </activity>
- 在主Activity的
onNewIntent和onCreate方法中添加统一路由调度逻辑,所有DeepLink跳转都经过该逻辑分配目标页面
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) handleDeepLink(intent) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化导航控制器等逻辑... handleDeepLink(intent) } private fun handleDeepLink(intent: Intent?) { val uri = intent?.data ?: return val empId = uri.getQueryParameter("empId") val showTaskDetails = uri.getQueryParameter("showTaskDetails")?.toBoolean() ?: false val taskIds = uri.getQueryParameter("taskIds") when { // 无业务参数时跳首页,对应第一类跳转规则 empId.isNullOrEmpty() && taskIds.isNullOrEmpty() -> { navController.navigate(R.id.home_fragment) } // 携带任务相关参数时跳任务面板 showTaskDetails || !taskIds.isNullOrEmpty() -> { val args = bundleOf( "empId" to empId, "taskIds" to taskIds ) navController.navigate(R.id.task_panel_fragment, args) } // 其他参数规则对应跳转目标面板、绩效评审等页面 else -> { navController.navigate(R.id.goal_panel_fragment) } } // 跳转后清空intent,避免重复触发 intent.data = null }
现有配置的快速修复方案
如果不想重构为统一调度模式,可以直接调整导航图中DeepLink的配置优先级:
- 给首页的DeepLink规则添加
android:autoVerify="true"属性,提升匹配优先级 - 给任务面板的DeepLink规则添加参数必填限制,仅当参数存在时才会匹配:
<fragment android:id="@+id/task_panel_fragment" android:name="com.xxx.TaskPanelFragment"> <deepLink app:uri="https://app.abc.com/?empId={empId}&showTaskDetails={showTaskDetails}&taskIds={taskIds}" /> <argument android:name="empId" app:argType="string" android:defaultValue="@null" /> <argument android:name="showTaskDetails" app:argType="boolean" android:defaultValue="false" /> </fragment>
内容的提问来源于stack exchange,提问作者Raghunandan Kavi
相关产品推荐
相关产品推荐

