Android Kotlin多Activity传参异常:所有变量均取最后Activity值
问题根源
- 参数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"。
- 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
相关产品推荐
相关产品推荐

