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

Android Kotlin多Activity传参异常:所有变量均取最后Activity值

问题根源

  1. 参数Key重复:最可能的原因是Variables.kt中firstMessage和secondMessage被定义为相同的字符串常量。例如:
object Variables {
    const val firstMessage = "message"
    const val secondMessage = "message" // 两个Key完全一致
}

当你在SecondActivity中先后调用putExtra(Variables.firstMessage, ...)和putExtra(Variables.secondMessage, ...)时,由于Key相同,后者的值会直接覆盖前者。最终ThirdActivity通过两个Key获取到的都是最后一次传入的"Second message"。

  1. Intent初始化时机不合理:你在onCreate方法中提前初始化跳转用的Intent对象(比如FirstActivity中的intentGoToSecondActivity),而非在按钮点击事件内部创建。如果Activity发生重建(如屏幕旋转),这个Intent可能残留之前的额外数据,导致后续传参混乱。

修复方案

1. 修正Variables.kt的Key值

确保每个参数的Key唯一,推荐使用大写+下划线的命名规范:

object Variables {
    const val FIRST_MESSAGE = "first_message"
    const val SECOND_MESSAGE = "second_message"
}

2. 在点击事件内部创建Intent

每次点击按钮时创建新的Intent实例,避免旧数据残留:

// FirstActivity.kt 修正后
buttonFirstActivity.setOnClickListener {
    val intentGoToSecondActivity = Intent(this@FirstActivity, SecondActivity::class.java)
    intentGoToSecondActivity.putExtra(Variables.FIRST_MESSAGE, "First message")
    startActivity(intentGoToSecondActivity)
}
// SecondActivity.kt 修正后
buttonSecondActivity.setOnClickListener {
    val intentGoToThirdActivity = Intent(this@SecondActivity, ThirdActivity::class.java)
    val firstMsg = intent.getStringExtra(Variables.FIRST_MESSAGE)
    intentGoToThirdActivity.putExtra(Variables.FIRST_MESSAGE, firstMsg)
    intentGoToThirdActivity.putExtra(Variables.SECOND_MESSAGE, "Second message")
    startActivity(intentGoToThirdActivity)
}

3. 优化参数传递方式(可选)

由于需要传递6个参数,逐个putExtra易出错,推荐用Bundle封装所有参数:

// FirstActivity中封装参数
val bundle = Bundle().apply {
    putString(Variables.FIRST_MESSAGE, "First message")
}
val intent = Intent(this, SecondActivity::class.java)
intent.putExtras(bundle)
startActivity(intent)

// SecondActivity中接收并追加参数
val receivedBundle = intent.extras ?: Bundle()
receivedBundle.putString(Variables.SECOND_MESSAGE, "Second message")
val intentToThird = Intent(this, ThirdActivity::class.java)
intentToThird.putExtras(receivedBundle)
startActivity(intentToThird)

这种方式既简化了代码,也降低了Key冲突的概率。


验证效果

修正后,ThirdActivity的代码保持不变,点击按钮后会正确显示:

First message
Second message

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:35:34