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

如何在ActivityA中用registerForActivityResult替代onActivityResult实现页面回退

用registerForActivityResult替代onActivityResult实现页面回退逻辑

核心实现步骤(仅需修改ActivityA及内部FragmentA)

原有的ActivityB及内部Fragment逻辑无需改动——依然通过LiveData触发setResult(1000)后finish即可,重点调整ActivityA的结果监听方式:

  1. 在ActivityA中初始化ActivityResultLauncher
    在ActivityA的onCreate方法(或合适的初始化时机)中,注册用于接收ActivityB返回结果的Launcher:
class ActivityA : AppCompatActivity() {
    // 定义Launcher,替代原有的onActivityResult
    private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        // 判断返回的resultCode是否为约定的1000
        if (result.resultCode == 1000) {
            // 关闭当前ActivityA,回到FragmentMain
            finish()
        }
    }

    // 提供给内部FragmentA调用的方法,用于启动ActivityB
    fun startActivityB() {
        val intent = Intent(this, ActivityB::class.java)
        activityResultLauncher.launch(intent)
    }

    // ... 其他原有代码
}
  1. 修改ActivityA_FragmentA启动ActivityB的方式
    将FragmentA中原有的startActivityForResult调用,替换为调用宿主ActivityA提供的startActivityB()方法:
class ActivityA_FragmentA : Fragment() {
    // ... 其他原有代码

    // 启动ActivityB的方法
    private fun launchActivityB() {
        // 调用宿主ActivityA的方法启动ActivityB
        (activity as? ActivityA)?.startActivityB()
    }
}

逻辑说明

这套实现完全兼容原有ActivityB的结果返回流程:ActivityB结束时设置的resultCode=1000会被ActivityA中注册的activityResultLauncher捕获,进而触发ActivityA关闭,最终回到FragmentMain。相比旧的onActivityResult,这种方式无需处理requestCode匹配,逻辑更简洁,也规避了onActivityResult被废弃的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:31:30