android activity results api

参考文档

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() {

    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版本出来再投入使用。

你可能感兴趣的:(android activity results api)