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

使用Navigation Component与Compose时如何跳转至第三方应用

Navigation Component 本身是为应用内页面导航设计的,跳转第三方应用依赖 Android 系统的隐式 Intent 能力,有两种常用实现方案:

方案1:直接在页面中调用 Intent 跳转(适合零散跳转需求)

不需要修改 NavHost 配置,直接在触发跳转的交互逻辑里构造 Intent 启动即可,示例如下(给 Overview 页面加跳转 Gmail 发邮件的按钮):

composable(RallyScreen.Overview.name) {
    val context = LocalContext.current
    Column {
        Text(RallyScreen.Overview.name)
        Button(onClick = {
            // 构造发邮件的隐式Intent,系统会自动匹配Gmail等邮件类应用
            val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
                data = Uri.parse("mailto:recipient@example.com")
                putExtra(Intent.EXTRA_SUBJECT, "邮件标题")
                putExtra(Intent.EXTRA_TEXT, "邮件正文内容")
                // 如果要强制跳转Gmail,添加这行指定包名即可
                // setPackage("com.google.android.gm")
            }
            // 先校验有可接收的应用再跳转,避免出现崩溃
            if (emailIntent.resolveActivity(context.packageManager) != null) {
                context.startActivity(emailIntent)
            }
        }) {
            Text("跳转到Gmail发邮件")
        }
    }
}

如果希望所有跳转逻辑都走 navController 统一管控,可以将第三方跳转注册为虚拟的 DeepLink 目的地:

步骤1:在NavHost中注册虚拟目的地

NavHost(
    navController = navController,
    startDestination = RallyScreen.Overview.name,
    modifier = Modifier.padding(innerPadding)
) {
    // 原有页面配置保持不变
    composable(RallyScreen.Overview.name) { 
      Text(RallyScreen.Overview.name)
    }
    composable(RallyScreen.Accounts.name) {
        Text(RallyScreen.Accounts.name) 
    }
    composable(RallyScreen.Bills.name) { 
        Text(RallyScreen.Bills.name) 
    }

    // 新增发邮件的虚拟导航目的地,绑定DeepLink规则
    composable(
        route = "send_email/{target_email}",
        deepLinks = listOf(
            navDeepLink {
                action = Intent.ACTION_SENDTO
                uriPattern = "mailto:{target_email}"
            }
        )
    ) { backStackEntry ->
        val context = LocalContext.current
        val targetEmail = backStackEntry.arguments?.getString("target_email") ?: ""
        LaunchedEffect(Unit) {
            val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
                data = Uri.parse("mailto:$targetEmail")
            }
            if (emailIntent.resolveActivity(context.packageManager) != null) {
                context.startActivity(emailIntent)
            }
            // 跳转完成后回退到上一个页面,避免停留在空的虚拟目的地
            navController.popBackStack()
        }
    }
}

步骤2:触发跳转

在任意需要跳转的位置统一调用 navController 导航即可:

navController.navigate("send_email/recipient@example.com")

注意事项

Android 11(API 30)及以上版本需要在 AndroidManifest.xml 中添加 queries 声明,才能正常检测到第三方应用:

<manifest ...>
    <queries>
        <!-- 匹配所有邮件应用 -->
        <intent>
            <action android:name="android.intent.action.SENDTO" />
            <data android:scheme="mailto" />
        </intent>
        <!-- 如果需要指定检测Gmail,添加这行 -->
        <package android:name="com.google.android.gm" />
    </queries>

    <application ...>
    ...
    </application>
</manifest>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:24:05