使用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发邮件") } } }
方案2:通过 Navigation DeepLink 统一管理(适合需要标准化路由的场景)
如果希望所有跳转逻辑都走 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
相关产品推荐
相关产品推荐

