在Android开发中,我们经常使用startActivityForResult来获取activity执行完操作的返回值,但是在新版本的AndroidX中已经推荐使用Activity Result API来替换它。
1private fun openSecondActivity() {
2 val intent = Intent(this, SecondActivity::class.java)
3 startActivityForResult(intent, REQUEST_CODE)
4}
5
6override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
7 super.onActivityResult(requestCode, resultCode, data)
8 if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) {
9
10 }
11}
ActivityResultLauncher的使用用法
1private val secondLauncher =
2 registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
3 if (it.resultCode == Activity.RESULT_OK && it.data != null) {
4
5 }
6 }
7
8private fun openSecondActivity() {
9 val intent = Intent(this, SecondActivity::class.java)
10 secondLauncher.launch(intent)
11}
以上是ActivityResultLauncher最简单的用法,直接使用StartActivityForResult作为约定,在实际开发中,使用ActivityResultLauncher分为三步。
如果要使用ActivityResultLauncher,首先需要引入依赖库,最新版本参考官方文档。
implementation 'androidx.activity:activity-ktx:x.x.x'
implementation 'androidx.fragment:fragment-ktx:x.x.x'
比如说,我们在启动Activity时需要传入Int类型的参数,在执行完Activity之后得到String类型结果,我们可以这样创建约定。
class ThirdActivityResultContract : ActivityResultContract<Int, String?>() {
override fun createIntent(context: Context, input: Int?): Intent {
return Intent(context, ThirdActivity::class.java).putExtra("id", input)
}
override fun parseResult(resultCode: Int, intent: Intent?): String? {
return intent?.getStringExtra("result")
}
}
这样其实是把封装和解析Intent的工作摘出来了,减轻Activity的工作量,遵循了单一职责原则。
使用registerForActivityResult方法注册上一步创建的约定,并且传入一个ActivityResultCallback回调,用于处理Activity处理之后返回的结果。
private val activityLauncher = registerForActivityResult(ThirdActivityResultContract()) {
//handle string type result
findViewById<TextView>(R.id.textView).text = it
}
我们只需要调用第二步创建的activityLauncher.launch(..)方法即可启动Activity,并且传入我们指定的Int类型的参数。
activityLauncher.launch(123)
另外,它还可以用来简化申请运行时权限,我们可以使用RequestPermission和RequestMultiplePermissions约定来申请单个或多个运行时权限,比如申请相机权限,这部更多内容可以参考官方文档。
private val cameraPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
findViewById<TextView>(R.id.result).text = "is granted: $it"
}
cameraPermission.launch(Manifest.permission.CAMERA)
下面是一个完整的示例项目。