丑橘学Android 之Activity Result API

193 阅读1分钟

appcompat 1.3.0 后startActivityForResult api就被废弃了

image.png 取而代之的是Activity Result API,按照官方说法:

位于 ComponentActivity 或 Fragment 中时,Activity Result API 会提供 registerForActivityResult() API,用于注册结果回调。registerForActivityResult() 接受 ActivityResultContract 和 ActivityResultCallback 作为参数,并返回 ActivityResultLauncher,供您用来启动另一个 activity。

下面具体来看看怎么使用。

跳转页面并获取返回的数据
  1. 调用 registerForActivityResult(),注册 ActivityResultLauncher 实例。registerForActivityResult()接收两个参数,参数一:ActivityResultContracts 指定调用的协定类型,因为是跳转页面所以这里使用ActivityResultContracts.StartActivityForResult()ps:ActivityResultContracts定义了常见的协定类型。参数二:ActivityResultCallback 用于回调结果,我们可以在这里接收回调数据。
val reqDataLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 
}
  1. 创建intent 并使用launcher 实例启动它实现跳转
binding.mainBtnGetResult.setOnClickListener {
    Intent(this, SecondActivity::class.java).apply {
        reqDataLauncher.launch(this)
    }
}
  1. 在跳转页面设置返回数据
val intent = Intent()
intent.putExtra("result", "result xxxxx")
setResult(RESULT_OK, intent)
finish()
  1. ActivityResultCallback 中获取返回的数据
val reqDataLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    if (it.resultCode == RESULT_OK && it.data != null) {
        val stringExtra = it.data!!.getStringExtra("result")
        Log.d("xxx", "back data:$stringExtra")
    }
}

以上就是Activity Result API 跳转页面并获取返回数据的全部过程。

ActivityResultContracts 的其他协定

上面说到ActivityResultContracts定义了一组常见的协定集合,主要包括但不限于:

TakePicture拍摄照片
RequestPermission申请权限
ActivityResultContracts.​RequestMultiplePermissions请求多个权限
GetContent获取单个文件
GetMultipleContents获取多个文件
OpenDocument打开单个文档
OpenMultipleDocuments打开多个文档
OpenDocumentTree打开文档目录
ImageAndVideo
ImageOnly

更多协定请查看

从上面的RequestPermission 可以看出,Activity Result API 还可以用于权限申请