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