有中间Activity时,如何通过ActivityResultContract让Activity获取结果?
用Activity Result API实现结果直接转发(替代FLAG_ACTIVITY_FORWARD_RESULT)
针对你在迁移startActivityForResult到Activity Result API时遇到的问题——Activity A无法接收Activity C的返回结果,以下是适配新API的解决方案,核心是保留原FLAG_ACTIVITY_FORWARD_RESULT的逻辑并结合新API特性调整:
基础实现(直接转发)
这种方式完全对应旧逻辑,B启动C后直接销毁,结果跳过B直达A:
1. Activity A 配置结果接收器
A需要注册ActivityResultLauncher来接收最终结果,正常启动B即可:
// Activity A 代码 private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data // 处理来自C的返回数据 } } // 启动Activity B的方法 fun navigateToB() { val intent = Intent(this, ActivityB::class.java) resultLauncher.launch(intent) }
2. Activity B 启动C并转发结果
B不需要自己注册结果接收器,直接启动C并设置转发标记,随后立即销毁自身:
// Activity B 代码 fun navigateToC() { val intent = Intent(this, ActivityC::class.java) // 添加转发结果标记,让C的结果直接返回给启动B的组件(即A) intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT) startActivity(intent) // 必须调用finish,否则B会留在返回栈,结果会先到B而非A finish() }
3. Activity C 返回结果
C正常设置结果并销毁即可,无需额外处理:
// Activity C 代码 fun sendResultBack() { val resultIntent = Intent().apply { putExtra("result_key", "来自C的返回值") } setResult(RESULT_OK, resultIntent) finish() }
进阶实现(B需预处理结果时)
如果B需要先处理C的结果再传递给A,可以用手动转发的方式:
// Activity B 代码 private val cResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> // 将C的结果原封不动(或处理后)返回给A setResult(result.resultCode, result.data) finish() } fun navigateToC() { val intent = Intent(this, ActivityC::class.java) cResultLauncher.launch(intent) }
这种方式不需要设置FLAG_ACTIVITY_FORWARD_RESULT,适合B需要对C的结果做中间处理的场景。
排查A收不到结果的常见原因
- B启动C后未调用
finish():B留在返回栈,C的结果会先返回给B,若B未处理则A收不到。 - B调用了
setResult():会覆盖转发流程,A收到的是B的结果而非C的。 - 未正确添加
Intent.FLAG_ACTIVITY_FORWARD_RESULT标记:转发逻辑不生效,结果仍返回给B。
内容的提问来源于stack exchange,提问作者codemonkey
相关产品推荐
相关产品推荐

