1.什么是activity results api
Activity Results API 是 Google官方推荐的Activity、Fragment获取返回结果的方式。相当于原startActivityForResult 和onActivityResult方法。
2.引入原因:
- 随着应用的扩展,onActivityResult回调方法各种嵌套、耦合严重、难以维护。
- 在google最新的activity-ktx beta版本中已经废弃了原onActivityResult方法,推荐使用Activity Results API来处理页面数据的处理。
- 通过新的 Activity Result API,我们可以单独的类中处理结果回调,真正做到单一职责。
3.使用步骤
主要用到两个组件
ActivityResultContract
: 协议,它定义了如何传递数据和如何处理返回的数据
ActivityResultLauncher
: 启动器,调用ActivityResultLauncher的launch方法来启动页面跳转,作用相当于原来的startActivity()。
3.1 首先自定义一个ActivityResultContract
,实现两个activity互传的数据处理
class MyActivityResultContract : ActivityResultContract<String, String?>() {
override fun createIntent(context: Context, input: String?): Intent {
return Intent(context, SecondActivity::class.java).apply {
putExtra("input", input)
}
}
override fun parseResult(resultCode: Int, intent: Intent?): String? {
val data = intent?.getStringExtra("result")
return if (resultCode == Activity.RESULT_OK && !TextUtils.isEmpty(data)) data else null
}
}
3.2 调用registerForActivityResult
方法,注册刚刚定义的contract协议,返回一个activityResultLauncher
对象。
val activityResultLauncher = registerForActivityResult(MyActivityResultContract()) {
Toast.makeText(this, "result value is :${it}", Toast.LENGTH_LONG).show()
}
3.3 用返回的launcher对象启动另一个activity界面
btn_start_second.setOnClickListener {
activityResultLauncher.launch("second activity start")
}
4.除此之外,谷歌定义了一系列的常用的ActivityResultContract协议 方便的获取权限、拍照等等。
例如权限获取就可以简化成以下几句代码。
btnRequestPermission.setOnClickListener {
askLocationPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
}
// Single Permission Contract
private val askLocationPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { result ->
if(result){
Log.e("TAG", "Location permnission granted")
}else{
Log.e("TAG", "Location permnission denied")
}
}
总结
使用activity results api替代传统的onActivityResult方法,可以简化我们的代码,提高代码的重用性。
btw.当前版本还不是稳定版本,可以等release版本出来再投入使用。