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

Android使用Intent跨Activity传值时intent.extras始终为空问题求助

问题原因

当使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT启动MainActivity时,系统会将栈中已存在的MainActivity实例移至栈顶,而非创建新实例。此时MainActivity的onStart方法中获取的intent仍是最初启动它的原始Intent,并非从EditorActivity传递过来的新Intent,因此extras始终为空。

解决方案

方案一:重写onNewIntent方法

在MainActivity中重写onNewIntent方法,该方法会在Activity通过REORDER_TO_FRONT标记重新激活时被调用,可在此处获取新Intent并提取数据:

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    // 更新当前Activity的Intent为新传入的Intent
    setIntent(intent)
    // 提取并处理数据
    intent?.extras?.getString("my_data")?.let {
        myData = it
        // 可在此执行数据更新后的UI操作
    }
}

调用setIntent(intent)后,后续getIntent()会返回新的Intent,也可将原onStart中的读取逻辑移至此处,或基于更新后的Intent在onStart中处理。

方案二:使用Activity Result API(推荐)

这种方式更适配现代Android开发规范,无需依赖栈操作标记,专门用于Activity间返回数据的场景:

  1. 在MainActivity中注册Activity Result Launcher:
private val editorActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == RESULT_OK) {
        val data = result.data?.getStringExtra("my_data")
        data?.let {
            myData = it
            // 处理返回的数据
        }
    }
}
  1. 修改MainActivity跳转至EditorActivity的代码,使用Launcher启动:
editorLink.setOnClickListener {
    val intent = Intent(this, EditorActivity::class.java)
    editorActivityLauncher.launch(intent)
}
  1. 修改EditorActivity的返回逻辑,通过setResult传递数据后关闭当前Activity:
saveButton.setOnClickListener {
    val intent = Intent()
    intent.putExtra("my_data", "my data from other activity")
    setResult(RESULT_OK, intent)
    finish() // 关闭EditorActivity,回到MainActivity
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:45:31