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

Compose Navigation调用activity()跳转时如何向目标Activity传参

可直接使用activity()方法传递参数,无需中转页

NavGraphBuilder.activity() 扩展本身已经内置了参数自动注入逻辑,和composable()遵循完全一致的参数规则,不需要额外写中转Composable手动构造Intent。

具体实现步骤

  • 第一步:在路由路径中声明参数占位符,和普通Compose路由的参数声明规则一致
  • 第二步:通过activity配置块的arguments参数绑定参数的类型规则
  • 第三步:跳转时直接通过navController.navigate()传入拼接好参数的路由即可,Navigation组件会自动将所有路由参数写入启动目标Activity的Intent Extras中,目标Activity直接按常规方式取参即可。

代码示例

路由配置

navigation(
    startDestination = "home",
    route = "main"
) {
    composable("home") {
       HomeScreen(...)
    }

    // 其余Compose屏幕...

    // 配置带参数的Activity路由
    activity(route = "tickets/{config}") {
        activityClass = ExternalActivity::class
        // 定义参数解析规则
        arguments = listOf(
            navArgument("config") {
                type = NavType.StringType
                // 可按需配置defaultValue、nullable等属性
            }
        )
    }
}

跳转调用

// 直接传入带参数的路由即可,无需手动构造Intent
navController.navigate("tickets/${yourConfigValue}")

目标Activity取参

在ExternalActivity中直接按原生方式取参即可,和手动调用startActivity传参的取值逻辑完全一致:

class ExternalActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val config = intent.getStringExtra("config")
        // 后续业务逻辑
    }
}

注意事项

  • 如果需要传递Parcelable/Serializable类型的复杂参数,使用对应类型的NavType即可,比如NavType.SerializableType(Config::class.java),参数同样会被自动写入Intent。
  • 不要通过路由传递超过1MB的大对象,受Android原生Binder事务缓冲区限制,大参数请通过ViewModel、本地持久化等跨组件数据共享方案传递。
  • 这种实现不会产生中转Composable页带来的回退栈异常、重复触发启动逻辑等副作用,是Navigation组件官方支持的标准用法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:21:34