引言
Activity Results API 是 Android Jetpack 组件库中用于处理 Activity 启动结果的新机制。随着 AndroidX 的演进,传统的 startActivityForResult 和 onActivityResult 方法已被标记为过时(Deprecated)。这一变化旨在解决 Fragment 生命周期管理中的复杂性,减少样板代码,并实现更好的解耦。
在重构项目 BaseFragment 时,我们常会遇到旧代码中遗留的下划线标记或 Deprecated 提示。查看源码可知,官方推荐使用 ActivityResultContract 配合 registerForActivityResult 来替代旧方案。本文将深入探讨新 API 的使用方式、核心原理以及如何在实际项目中封装应用。
传统方案的痛点
在使用旧方案跳转页面回传数据时,通常需要经历以下步骤:
- 定义 REQUEST_CODE,若同一页面有多个数据请求需避免重复;
- 调用
startActivityForResult(Intent, REQUEST_CODE); - 重写
onActivityResult(),判断 requestCode 和 resultCode,拿到值后执行后续逻辑。
这种模式存在明显缺陷:
- 代码冗余:每个 Activity 都需要维护一堆 REQUEST_CODE 常量;
- 类型不安全:requestCode 是整数,容易混淆;
- 生命周期耦合:Fragment 中处理 onActivityResult 需要依赖宿主 Activity,容易导致内存泄漏或状态丢失。
新方案的优势
使用 Activity Results API,只需定义一个函数,然后 launch() 一下即可。它移除了对 onActivityResult 的重写需求,也无需手动管理 REQUEST_CODE。技术迭代飞快,建议读者使用时以官方文档为准,目前较新的 activity 和 fragment 包已内置相关功能,无需额外依赖 activity-ktx 和 fragment-ktx。
核心概念与使用
Activity Results API 的使用非常简单,它由三个核心要素组成:启动器 (Launcher) + 协定 (Contract) + 结果回调 (Callback)。
1. ActivityResultLauncher → 启动器
registerForActivityResult() 的返回值即为启动器对象,用于承载启动对象与返回对象。它负责将契约转换为 Intent 并发起跳转,同时监听结果回调。
2. ActivityResultContract → 协定/契约
这是第一个入参,协定的是所需的输入类型和结果的输出类型。ActivityResultContracts 类提供了一些常用的协定,开发者可以直接拿来即用。
以下是常用协定的作用说明:
- StartActivityForResult:通用协定,不做任何转换,Intent 作为输入,ActivityResult 作为输出;
- RequestMultiplePermissions:请求一组权限;
- RequestPermission:请求单个权限;
- TakePicturePreview:调用 MediaStore.ACTION_IMAGE_CAPTURE 拍照,返回 Bitmap 图片;
- TakePicture:调用 MediaStore.ACTION_IMAGE_CAPTURE 拍照,并将图片保存在给定 Uri,返回 true 表示保存成功;
- TakeVideo:调用 MediaStore.ACTION_VIDEO_CAPTURE 录制,并将视频保存在给定 Uri,返回 true 表示保存成功;
- PickContact:调用通讯录 APP 获取联系人;


