onActivityResult → ActivityResult API

onActivityResult → ActivityResult API

老写法(Java)

java 复制代码
// 启动
Intent intent = new Intent(this, SelectActivity.class);
startActivityForResult(intent, REQUEST_CODE_SELECT);

// 回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_SELECT && resultCode == RESULT_OK && data != null) {
        String result = data.getStringExtra("selected");
        updateUI(result);
    }
}

问题在哪里

requestCode 是 int 常量,多个页面间容易重复导致逻辑混淆。onActivityResultif-else 链随着页面增多越来越长。如果调用方在 Fragment 里,还要处理 result 先传到宿主 Activity 再分发的额外逻辑。

新写法(ActivityResult API)

kotlin 复制代码
// 定义契约
private val selectLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val selected = result.data?.getStringExtra("selected")
        updateUI(selected)
    }
}

// 启动 --- 不需要 requestCode
selectLauncher.launch(Intent(this, SelectActivity::class.java))

Fragment 间回传结果:

kotlin 复制代码
// FragmentA
setFragmentResultListener("selectKey") { _, bundle ->
    val selected = bundle.getString("selected")
    updateUI(selected)
}

// FragmentB
setFragmentResult("selectKey", Bundle().apply {
    putString("selected", "结果")
})
parentFragmentManager.popBackStack()

一句话注意

registerForActivityResult 必须在 onCreate 或之前的生命周期中注册(即 Fragment 的 onCreate 或 Activity 的 onCreate),不能在 onResume 或按钮点击后再注册,否则会抛异常。

Fragment 间的 setFragmentResultListenersetFragmentResult 只需要同一个 requestKey 匹配,不需要任何 requestCode,代码比旧的 onActivityResult 干净太多。


Java Android 老项目迁移系列,持续更新中。

相关推荐
愚公移码2 分钟前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端
驰骋工作流10 分钟前
流程引擎BPM设计之:流程消息
java·工作流引擎·bpm·jflow·ccflow
时间的拾荒人14 分钟前
MySQL 视图详解
android·数据库·mysql
dogstarhuang16 分钟前
从 0 到 1 搭建可收费的 API 开放平台(实战)
java·架构·api
祉猷并茂,雯华若锦1 小时前
Appium 3.x安卓按键与通知栏操作全指南
android·appium
VortMall1 小时前
『平台去经营化』平台治理能力全新重构|VortMall微服务商城系统v1.3.10
java·大数据·微服务·商城系统·开源商城·vortmall·去经营化
吴声子夜歌1 小时前
Redis 3.x——集群故障转移
java·数据库·redis·集群
Java面试题总结1 小时前
mybatis插件
java·tomcat·mybatis
码农coding1 小时前
android 12 SurfaceFlinger开机启动分析
android
hunterandroid2 小时前
Paging 3 RemoteMediator 实战:构建离线优先的分页列表
android·前端