我们通常是使用onActivityResult来获取页面回传回来的回调以及数据,但是随着应用的扩展,onActivityResult回调方法各种嵌套、耦合严重、难以维护,会有一大堆的switch-case、requestCode要处理。现在可以Activity Results API来替代onActivityResult的用法,在单独的一个中间类中来处理跳转和回传的逻辑处理,做到更好的单一职责。
Activity Results API 是 Google官方推荐的Activity、Fragment获取返回结果的方式。ActivityResultContract是一个抽象类,也是我们需要定义的协议,它需要去定义如何传递数据和如何处理返回的数据。
简单效果演示:
1.引入扩展库依赖:
我们所需的核心类ActivityResultContract来自于这个扩展库。
implementation 'androidx.activity:activity-ktx:1.2.0-beta01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'
2.自定义ActivityResultContract
我们继承ActivityResultContract类自定义自己的处理类,需声明2个泛型类型,第一个参数类型为跳转到第二个页面传入的数据类型,第二个参数类型为第二个页面回传的数据类型,比如这里我都用String做参数类型。
class MyActivityResultContract: ActivityResultContract<String, String>() {
override fun createIntent(context: Context, input: String?): Intent {
//从A activity中带到B activity中的intent
return Intent(context, OtherActivity::class.java).putExtra("params", input)
}
override fun parseResult(resultCode: Int, intent: Intent?): String {
//从B activity中带到A activity中的intent,这里继续从回传的intent中获取所需参数
if (resultCode == 200) {
intent?.let {
return it.getStringExtra("result")
}
}
return ""
}
}
第一个页面点击按钮,通过创建registerForActivityResult对象,启动自定义的activityResultContract。并在回调中接收到parseResult()方法的结果。launch方法的参数会传入createIntent的参数中,进行数据传递处理。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnStart.setOnClickListener {
//从第一个页面传入第二个页面的数据
resultConstract.launch(tvMsg.text.toString())
}
}
var resultConstract = registerForActivityResult(MyActivityResultContract()) {
//接收到第二个页面
tvMsg.text = it
}
}
第二个页面点击按钮,回传信息:
var intent = Intent(OtherActivity@this, MainActivity::class.java)
intent.putExtra("result", "第二个页面信息")
setResult(200, intent)
finish()
参考:
https://mp.weixin.qq.com/s/lWayiBS4T4EHcsUIgnhJzA
https://blog.csdn.net/cj641809386/article/details/109363834