目录
还在为onActivityResult中混乱的回调逻辑而烦恼吗?Activity Result API为你带来了更优雅、更安全的解决方案!
前言: 为什么需要Activity Result API?
在Android开发中,我们经常需要启动其他Activity(如相机、相册、联系人选择等)并获取返回结果。传统的做法是使用startActivityForResult()和onActivityResult(),但这种模式存在诸多问题:
- 代码耦合严重: 结果处理逻辑集中在
onActivityResult方法中 - 类型不安全: 需要手动解析Intent数据,容易出错
- 生命周期问题: 结果返回时Activity可能已被销毁
- 权限请求与结果处理分离: 权限请求和结果处理不在同一处
一、Activity Result API核心组件
1.1 ActivityResultLauncher
这是启动操作并接收结果的入口,支持泛型输入和输出类型。
// 创建启动器
val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
result ->
// 处理结果
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data
// 处理返回数据
}
}
1.2 ActivityResultContract
定义输入类型(I)和输出类型(O)的协议,封装操作逻辑。
// 内置合约示例
ActivityResultContracts.TakePicture() // 拍照
ActivityResultContracts.GetContent() // 选择文件
ActivityResultContracts.RequestPermission() // 请求权限
1.3 ActivityResultRegistry
生命周期管理组件,自动管理回调的注册和注销。
二、预定义合约:覆盖90%常用场景
Activity Result API内置了丰富的合约,满足大多数开发需求:
| 合约 | 功能 | 输入类型 | 输出类型 |
|---|---|---|---|
| StartActivityForResult | 通用Activity启动 | Intent | ActivityResult |
| RequestPermission | 请求单个权限 | String | Boolean |
| RequestMultiplePermissions | 请求多个权限 | Array | Map<String, Boolean> |
| TakePicture | 拍照保存 | Uri | Boolean |
| GetContent | 选择文件 | String(MIME类型) | Uri |
| PickContact | 选择联系人 无 | Uri | |
| CreateDocument | 创建文档 | String(文件名) | Uri |
三、实战演练:一步步学会使用
3.1 权限请求(告别requestPermissions)
传统方式:
// 需要重写onRequestPermissionsResult方法
ActivityCompat.requestPermissions(this,
new String[]{
Manifest.permission.CAMERA},
REQUEST_CODE);
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
// 处理结果
}
新方式:
class MainActivity : AppCompatActivity() {
// 1. 声明启动器
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) {
isGranted: Boolean ->
// 3. 处理结果
if (isGranted) {
Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



