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

如何从SecondActivity正确返回数据至MainActivity?

搞定Activity返回数据的正确姿势

嘿,我来帮你理清这个问题——你完全不用在onResume()或者onCreate()里硬接返回数据,这俩生命周期方法本来就不是干这个的!正确的做法是用安卓专门提供的Activity结果回调机制,分两种情况给你讲清楚:

一、AndroidX官方推荐的新方案:registerForActivityResult

这是现在谷歌主推的方式,已经替代了旧的startActivityForResult(后者已经被标记为废弃了)。

1. 先在MainActivity里注册结果回调

在MainActivity的onCreate()方法里(或者其他初始化的地方),注册一个ActivityResultLauncher,专门用来处理SecondActivity返回的结果:

// Kotlin代码示例
private val secondActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    // 先判断结果是否成功返回
    if (result.resultCode == Activity.RESULT_OK) {
        result.data?.let { intent ->
            // 从Intent里取出你的自定义对象,注意对象必须实现Parcelable或者Serializable接口
            val yourObject = intent.getParcelableExtra<YourCustomClass>("YOUR_OBJECT_KEY")
            // 到这里就可以处理这个对象啦,比如更新UI、存数据啥的
        }
    }
}

2. 用这个Launcher启动SecondActivity

代替你原来的startActivity(),改用这个Launcher的launch()方法:

val intent = Intent(this, SecondActivity::class.java)
secondActivityLauncher.launch(intent)

二、旧项目兼容方案:startActivityForResult + onActivityResult

如果你维护的是老项目,还在使用这个已废弃的方法,也能搞定:

1. 用startActivityForResult启动SecondActivity

在MainActivity里启动时,要传入一个唯一的请求码:

// Java代码示例
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, 1001); // 1001是自定义请求码,只要全局唯一就行

2. 重写onActivityResult接收结果

在MainActivity里专门重写这个方法——这才是旧版本里接收返回数据的正确位置:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 先验证请求码和结果码是否匹配
    if (requestCode == 1001 && resultCode == RESULT_OK) {
        if (data != null) {
            // 取出你的自定义对象,记得对象要实现Parcelable/Serializable
            YourCustomClass yourObject = data.getParcelableExtra("YOUR_OBJECT_KEY");
            // 在这里处理对象逻辑
        }
    }
}

为啥返回时onCreate/onResume会执行?

你说返回时MainActivity的onCreate()和onResume()都跑了,大概率是因为系统在SecondActivity运行期间,把后台的MainActivity回收了(比如内存不够用)。等你返回时,系统得重新创建MainActivity,所以会走onCreate()。但不管有没有被回收,用上面的回调机制都能拿到返回数据——系统会自动把返回的Intent传递给回调方法,哪怕MainActivity被重建了。

另外再提醒一句:你在SecondActivity里返回数据时,一定要用setResult()方法,比如:

// SecondActivity里的返回代码
val resultIntent = Intent()
resultIntent.putExtra("YOUR_OBJECT_KEY", yourCustomObject)
setResult(Activity.RESULT_OK, resultIntent)
finish() // 关掉SecondActivity回到MainActivity

这样不管啥情况,都能稳稳拿到返回的对象啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:07:42