You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android隐式Deep Link无唯一URI路径如何实现统一动态路由

问题根因

你遇到的根路径跳转异常是因为Navigation组件的DeepLink匹配规则为:只要路径匹配,无论是否携带配置的查询参数都会命中规则,若多个页面的DeepLink规则重叠,会优先匹配导航图中先声明的页面规则,所以你当前任务面板的DeepLink规则覆盖了首页的根路径规则。

无唯一URI时的统一路由实现方案

不需要为每个页面配置独立URI,通过统一调度层即可实现全链路动态跳转,实现步骤如下:

  1. 仅在应用入口(主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>
  1. 在主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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:48:05