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

Jetpack Compose Deeplink问题:应用活跃时无法跳转目标页面

问题:Jetpack Compose SingleInstance模式下DeepLink活跃态跳转失效

现象

  • 应用关闭时,点击DeepLink可正常唤起应用并跳转至目标页面;
  • 应用处于活跃/前台状态时,点击DeepLink仅唤起当前页面,无法跳转至目标页;
  • 未设置android:launchMode="singleInstance"时,DeepLink全程正常,但会创建应用新实例;设置该模式后,多实例问题解决,但活跃态下DeepLink跳转失效。

现有代码

MainContent导航代码

@Composable
fun MainContent(navController: NavController) {
    NavHost(
        navController = navController,
        startDestination = "home"
    ) {
        // Home Screen
        composable("home") { HomeScreen(navController) }

        // Profile Screen 带DeepLink配置
        composable(
            route = "profile/{userId}",
            deepLinks = listOf(navDeepLink {
                uriPattern = "https://www.example.com/profile/{userId}"
            })
        ) { backStackEntry ->
            val userId = backStackEntry.arguments?.getString("userId")
            ProfileScreen(userId)
        }
    }
}

尝试的LaunchedEffect处理代码

LaunchedEffect(deepLinkIntent.value) {
    Log.e("DeepLinkNavigation", "Deep Link Data Received: ${deepLinkUri.value}")
    deepLinkIntent.value?.let { intent ->
        navController.handleDeepLink(intent)
        /*val deepLinkRequest = NavDeepLinkRequest.Builder
            .fromUri(uri)
            .build()
        // Attempt to navigate using the deep link request
        if (navController.graph.hasDeepLink(deepLinkRequest)) {
            navController.handleDeepLink(deepLinkRequest)
        }*/
    }
    /*deepLinkUri.value?.let {
        navController.navigate(it.toString())
    }*/
}

日志可打印收到DeepLink数据,但导航无效果。

问题原因

设置singleInstance启动模式后,应用处于前台时,系统会将DeepLink的Intent通过onNewIntent()传递给Activity,而非重新创建Activity实例。默认情况下导航组件不会自动处理这个新Intent,需手动将其转发给NavController。

解决方案

1. 在Activity中重写onNewIntent()并更新状态

在承载Compose的Activity中,维护一个可观察的Intent状态变量,收到新Intent时更新该变量,触发LaunchedEffect处理导航:

class MainActivity : ComponentActivity() {
    private val deepLinkIntent = mutableStateOf<Intent?>(null)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化时传入启动Intent
        deepLinkIntent.value = intent
        setContent {
            YourAppTheme {
                val navController = rememberNavController()
                // 监听Intent变化并处理DeepLink
                LaunchedEffect(deepLinkIntent.value) {
                    deepLinkIntent.value?.takeIf { it.data != null }?.let {
                        navController.handleDeepLink(it)
                    }
                }
                MainContent(navController)
            }
        }
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // 更新当前Intent并通知Composable
        this.intent = intent
        deepLinkIntent.value = intent
    }
}

2. 确保Manifest配置正确

检查Activity的IntentFilter是否包含DeepLink的Scheme、Host和Path规则:

<activity
    android:name=".MainActivity"
    android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 匹配DeepLink规则 -->
        <data
            android:scheme="https"
            android:host="www.example.com"
            android:pathPrefix="/profile" />
    </intent-filter>
</activity>

3. 验证NavController的DeepLink处理逻辑

确保在LaunchedEffect中正确调用navController.handleDeepLink(intent),无需额外判断hasDeepLink,因为handleDeepLink会自动匹配NavGraph中的配置。

内容的提问来源于stack exchange,提问作者Rahul Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:04:56