前言
Activity Results API 是 Google官方推荐的Activity、Fragment获取返回结果的方式。之前startActivityForResult的方法获取结果的方法谷歌已经不在推荐使用。
一、使用步骤
1.引入库
代码如下(示例):
implementation 'androidx.appcompat:appcompat:1.3.1'
2. 以启动activity为例
代码如下(示例):
class MainActivity : AppCompatActivity() {
private val myActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ activityResult ->
if(activityResult.resultCode == Activity.RESULT_OK){
val result = activityResult.data?.getStringExtra("result")
Toast.makeText(applicationContext,result,Toast.LENGTH_SHORT).show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding=ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.text.setOnClickListener {
myActivityLauncher.launch(Intent(this,MainActivity2::class.java))
}
}
}
第二个活动正常返回
class MainActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMain2Binding.inflate(layoutInflater)
setContentView(binding.root)
binding.back.setOnClickListener {
val intent = Intent().apply {
putExtra("result", "Hello")
}
setResult(Activity.RESULT_OK, intent)
finish()
}
}
}
3.其他功能
除了StartActivityForResult 官方还提供了很多其他Contract 如下:
-
StartActivityForResult: 通用的Contract,不做任何转换,Intent作为输入,ActivityResult作为输出,这也是最常用的一个协定。
-
RequestMultiplePermissions:用于请求一组权限
-
RequestPermission: 用于请求单个权限
-
TakePicturePreview: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值为Bitmap图片
-
TakePicture: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,并将图片保存到给定的Uri地址,返回true表示保存成功。
-
TakeVideo: 调用MediaStore.ACTION_VIDEO_CAPTURE 拍摄视频,保存到给定的Uri地址,返回一张缩略图。
-
PickContact: 从通讯录APP获取联系人
-
GetContent: 提示用选择一条内容,返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址(content://形式) 。默认情况下,它增加了 Intent#CATEGORY_OPENABLE, 返回可以表示流的内容。
-
CreateDocument: 提示用户选择一个文档,返回一个(file:/http:/content:)开头的Uri。
-
OpenMultipleDocuments: 提示用户选择文档(可以选择多个),分别返回它们的Uri,以List的形式。
-
OpenDocumentTree: 提示用户选择一个目录,并返回用户选择的作为一个Uri返回,应用程序可以完全管理返回目录中的文档。
4 请求权限
//单个权限
private val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
Toast.makeText(applicationContext, "同意", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(applicationContext, "失败", Toast.LENGTH_SHORT).show()
}
}
permissionLauncher.launch(android.Manifest.permission.READ_CONTACTS)
//多个权限
private val permissionsLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { isGrantedMap ->
isGrantedMap.entries.forEach {
if (it.value) {
grantedList.add(it.key)
} else {
deniedList.add(it.key)
}
}
}
permissionsLauncher.launch(arrayOf(android.Manifest.permission.READ_CONTACTS,android.Manifest.permission.CALL_PHONE))