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

不同Activity中Fragment跨组件回传结果的最佳通信方案

最佳实现方案:从Activity B的Fragment4向后台Activity A的Fragment2回传结果

核心思路

用Jetpack的Activity Result API是当前最规范的实现方式,不需要在Activity B中转,Fragment4可以直接操作Activity B的结果回传逻辑,最终结果会直接回到发起启动请求的Activity A的Fragment2中。

具体步骤

1. 在Activity A的Fragment2中注册结果回调并启动Activity B

在Fragment2里通过registerForActivityResult注册回调,用这个回调启动Activity B:

// Fragment2.kt
class Fragment2 : Fragment() {
    private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            // 处理从Activity B回传的数据
            val data = result.data?.getStringExtra("KEY_DATA")
            // 这里做你需要的业务逻辑
        }
    }

    // 启动Activity B的方法,比如点击事件触发
    private fun startActivityB() {
        val intent = Intent(requireContext(), ActivityB::class.java)
        startForResult.launch(intent)
    }
}

2. 在Activity B的Fragment4中直接设置结果并关闭Activity

在Fragment4里,通过requireActivity()获取所属的Activity B,直接调用setResult设置结果,然后finish Activity B即可:

// Fragment4.kt
class Fragment4 : Fragment() {
    // 触发回传结果的方法,比如点击确认按钮
    private fun sendResultBack() {
        val resultIntent = Intent().apply {
            putExtra("KEY_DATA", "需要回传的数据")
        }
        // 直接通过Activity设置结果
        requireActivity().setResult(Activity.RESULT_OK, resultIntent)
        // 关闭Activity B,结果会自动回传到Fragment2的回调中
        requireActivity().finish()
    }
}

关键注意事项

  • 确保Activity B的启动模式不是singleInstance或singleTask,这类启动模式会导致结果无法正确回传到Fragment2的回调。
  • 如果Fragment4是嵌套在其他Fragment中的,依然可以通过requireActivity()拿到Activity B,不影响结果设置。
  • 回传数据时尽量使用基础类型或可序列化/可Parcelable的对象,避免传递复杂数据导致异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:54:16