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

Jetpack Compose中Nav Host使用Deep Links跳转失效问题求助

问题修复方案

1. 修正Activity启动模式并处理Intent传递

你当前配置的launchMode="singleInstance"会导致新的DeepLink Intent无法正常传递给已启动的Activity,首先推荐将启动模式修改为singleTop。如果必须保留singleInstance配置,需要主动处理两种场景下的Intent:

  • 在onCreate中NavController初始化后,首次处理传入的Intent
  • 重写onNewIntent方法,处理应用已在后台运行时传入的新Intent
// MainActivity.kt
override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    // 手动将新的DeepLink Intent传递给导航控制器
    navController.handleDeepLink(intent)
}

// onCreate方法中补充逻辑
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        val navController = rememberNavController()
        // 首次启动时处理DeepLink
        LaunchedEffect(Unit) {
            if (savedInstanceState == null) {
                navController.handleDeepLink(intent)
            }
        }
        // 原有NavHost逻辑不变
        NavHost(navController = navController, startDestination = "mainView") {
            // ... 原有导航配置
        }
    }
}

navController.handleDeepLink(intent)是触发DeepLink自动跳转的核心调用,必须确保两种场景都覆盖

2. 补全DeepLink匹配规则

你在Manifest中声明了xkcd.com和www.xkcd.com两个域名,但导航配置中只适配了带www前缀的域名,需要把不带前缀的域名也加入DeepLink列表,同时兼容链接末尾带/和不带/的场景:

val rootUri = "https://www.xkcd.com"
val rootUriWithoutWww = "https://xkcd.com"
NavHost(navController = navController, startDestination = "mainView") {
    composable(
        "mainView", 
        deepLinks = listOf(
            navDeepLink { uriPattern = rootUriWithoutWww },
            navDeepLink { uriPattern = rootUri }
        )
    ) {
        MainContent()
    }
    composable(
        route = "singleView/{number}",
        arguments = listOf(navArgument("number") { type = NavType.IntType }),
        deepLinks = listOf(
            // 末尾/?兼容链接带/和不带/的两种情况
            navDeepLink { uriPattern = "$rootUriWithoutWww/{number}/?" },
            navDeepLink { uriPattern = "$rootUri/{number}/?" }
        )
    ) { backStackEntry ->
        val number = backStackEntry.arguments?.getInt("number")
        SingleView(number)
    }
}

3. 移除多余Manifest配置

如果不需要跨任务栈唤起App,可移除android:allowTaskReparenting="true"配置,避免任务栈异常导致的导航跳转失败。

4. 检查依赖版本

如果以上配置都正确仍然无法跳转,升级你的androidx.navigation:navigation-compose依赖到2.5.0及以上稳定版本,低版本存在DeepLink匹配异常的已知bug。

内容的提问来源于stack exchange,提问作者Mr. Pine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:15:04