欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

registerForActivityResult 封装基类

程序员文章站 2022-03-15 11:36:48
封装完后的用法: startForActivityResult(CActivity::class.java){resultCode, data -> if(resultCode == Activity.RESULT_OK){ val data2 = data.getStringExtra("data2") } }使用startActivityF...

封装完后的用法:

            startForActivityResult(CActivity::class.java){resultCode, data ->
                if(resultCode == Activity.RESULT_OK){
                    val data2 = data.getStringExtra("data2")
                }
            }

使用startActivityForResult的时候,由于有requestCode,我们可以知道data和resultCode从哪个activity里回调回来,但使用registerForActivityResult的时候……

先看看registerForActivityResult的基本用法吧,两个按钮,跳转方式分别为 AAct-->BAct-->AAct   AAct-->CAct-->AAct  

class AActivity : AppCompatActivity() {
    private val startForActivityResult1 = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
        it.resultCode
        it.data
    }

    private val startForActivityResult2 = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){

    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        btnJump1.setOnClickListener {
            startForActivityResult1.launch(Intent(this,BActivity::class.java))
        }
        btnJump2.setOnClickListener {
            startForActivityResult2.launch(Intent(this,CActivity::class.java))
        }
    }
}

由于回调数据没有可以识别出是从哪个activity回调,register后回调无法复用,本身又是个final方法,无法重写,所以跳转到每个activity都需要写一次register,使用方法非常的繁琐

这样看似无解,但如果仔细看源码,可以发现回调顺序遵循的是FILO,这就好办了,封装一下:

open class BaseActivity : AppCompatActivity() {
    private val resultCallBacks: Deque<ResultCallBack> = ArrayDeque()
    private val activityForResult =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            resultCallBacks.pop()?.let {
                it(result.resultCode, result.data?: Intent())
            }
        }

    @JvmOverloads
    protected fun startForActivityResult(
        cls: Class<*>,
        block: Intent.() -> Unit = {},
        callBack: ResultCallBack
    ) {
        resultCallBacks.push(callBack)
        activityForResult.launch(Intent(this, cls).apply(block))
    }

}

使用:

        startForActivityResult(CActivity::class.java, {
            putExtra("data1", "data")
        }) { resultCode, data ->
           
        }

 

本文地址:https://blog.csdn.net/jingzz1/article/details/110236804