如何从SecondActivity正确返回数据至MainActivity?
嘿,我来帮你理清这个问题——你完全不用在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

