告别繁琐的onActivityResult!Android Activity Result API完全指南


还在为onActivityResult中混乱的回调逻辑而烦恼吗?Activity Result API为你带来了更优雅、更安全的解决方案!

前言: 为什么需要Activity Result API?

在Android开发中,我们经常需要启动其他Activity(如相机、相册、联系人选择等)并获取返回结果。传统的做法是使用startActivityForResult()onActivityResult(),但这种模式存在诸多问题:

  1. 代码耦合严重: 结果处理逻辑集中在onActivityResult方法中
  2. 类型不安全: 需要手动解析Intent数据,容易出错
  3. 生命周期问题: 结果返回时Activity可能已被销毁
  4. 权限请求与结果处理分离: 权限请求和结果处理不在同一处

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值