appcompat 1.3.0 后startActivityForResult api就被废弃了
取而代之的是Activity Result API,按照官方说法:
位于
ComponentActivity或Fragment中时,Activity Result API 会提供registerForActivityResult()API,用于注册结果回调。registerForActivityResult()接受ActivityResultContract和ActivityResultCallback作为参数,并返回ActivityResultLauncher,供您用来启动另一个 activity。
下面具体来看看怎么使用。
跳转页面并获取返回的数据
- 调用
registerForActivityResult(),注册ActivityResultLauncher实例。registerForActivityResult()接收两个参数,参数一:ActivityResultContracts指定调用的协定类型,因为是跳转页面所以这里使用ActivityResultContracts.StartActivityForResult()ps:ActivityResultContracts定义了常见的协定类型。参数二:ActivityResultCallback用于回调结果,我们可以在这里接收回调数据。
val reqDataLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
}
- 创建
intent并使用launcher实例启动它实现跳转
binding.mainBtnGetResult.setOnClickListener {
Intent(this, SecondActivity::class.java).apply {
reqDataLauncher.launch(this)
}
}
- 在跳转页面设置返回数据
val intent = Intent()
intent.putExtra("result", "result xxxxx")
setResult(RESULT_OK, intent)
finish()
- 在
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定义了一组常见的协定集合,主要包括但不限于:
从上面的RequestPermission 可以看出,Activity Result API 还可以用于权限申请