关于onActivityResult回调问题

本文探讨了在Android开发中,Activity间交互的细节。重点关注ActivityA使用startForResult启动ActivityB时,onActivityResult回调的行为,以及ActivityB以singleTask模式启动时对回调的影响。

1. Activity A使用startForResult启动Activity B,B什么都不做并返回A,A中的onActivityResult回调是否会执行?

startActivity()方法,最终都是调用startActivityForResult()方法。默认的requestCode = -1, resultCode = 0,当你的requestCode != -1时,onActivityResult()一定会被调用。


2. 如果Activity B以singleTask模式启动,则A启动B的时候,A的onActivityResult会被立即执行

如图:假设当前的应用程序存在两个栈:其中一个直接显示在屏幕上负责与用户完成交互,叫Back Stack;另一个是隐藏在后台的Background Task,且位于该栈顶的Activity Y的启动模式被设置为singleTask。

       如果Activity 2中调用Background Task中已经启动过的Activity Y,则Background Task占据屏幕并且将该Task下所有的栈保留当前的栈位置和顺序push进Back Task形成新的结构。在Activity界面按返回键,则Activity Y出栈,Activity X占据屏幕。因此可见,由Activity2调用的Activity Y,但返回键后,回退显示的是Activity X。所以,即使在Activity Y执行setResult()函数,Activity2也是无法接收到的。
      由于这种现象的存在,所以android系统处于某种保护机制,发现将要跳转的Activity的启动模式是singleTask时,若需要执行onActivityResult()函数则立即执行。

是的,**`onActivityResult` 是一种回调机制**。 --- ### 🔍 什么是 `onActivityResult`? `onActivityResult` 是 Android 中用于**接收其他 Activity 返回结果**的回调方法。当你在一个 Activity 中调用 `startActivityForResult()` 启动另一个 Activity 时,被启动的 Activity 可以通过 `setResult()` 返回数据,系统会回调原始 Activity 的 `onActivityResult()` 方法。 --- ### ✅ 示例代码: #### 启动另一个 Activity 并请求结果: ```kotlin val intent = Intent(this, SecondActivity::class.java) startActivityForResult(intent, REQUEST_CODE) ``` #### 接收返回结果: ```kotlin override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) { val result = data?.getStringExtra("result_key") Toast.makeText(this, "收到结果:$result", Toast.LENGTH_SHORT).show() } } ``` --- ### 🧠 它为什么是回调? - 回调的本质是:**在某个事件发生后,系统自动调用你的方法**。 - `onActivityResult()` 就是这样一个机制:当目标 Activity 返回结果时,系统会“回调”这个方法,通知你结果已经返回。 --- ### ⚠️ 注意:`onActivityResult` 已被废弃(在 Activity 和 Fragment 中) 从 **AndroidX Activity 和 Fragment 1.2.0 开始**,官方推荐使用 **`ActivityResultLauncher` + `ActivityResultContracts`** 的新 API 来替代 `onActivityResult()`,它基于回调机制,但更安全、结构更清晰。 --- ### ✅ 新方式:使用 `ActivityResultLauncher`(推荐) #### 1. 在 Activity 或 Fragment 中声明 launcher: ```kotlin private lateinit var launcher: ActivityResultLauncher<Intent> ``` #### 2. 初始化: ```kotlin launcher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == RESULT_OK) { val data = result.data?.getStringExtra("result_key") Toast.makeText(this, "收到结果:$data", Toast.LENGTH_SHORT).show() } } ``` #### 3. 使用: ```kotlin val intent = Intent(this, SecondActivity::class.java) launcher.launch(intent) ``` --- ### ✅ 总结: | 问题 | 回答 | |------|------| | `onActivityResult` 是回调吗? | ✅ 是的,它是典型的回调方法 | | 原理是什么? | 系统在目标 Activity 返回结果后,自动调用该方法 | | 是否已过时? | 是,在现代开发中推荐使用 `ActivityResultLauncher` | | 为什么推荐新方式? | 更灵活、类型安全、生命周期绑定更好 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值