Activity Results API使用

作者: 奔跑吧李博 | 来源:发表于2021-03-16 17:59 被阅读0次

我们通常是使用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

相关文章

网友评论

    本文标题:Activity Results API使用

    本文链接:https://www.haomeiwen.com/subject/rzgrcltx.html