Android 优雅的Activity回调代码封装

原文地址: Android 优雅的Activity回调代码封装 - Stars-One的杂货小窝

之前提到Jetpack架构组件学习(3)——Activity Results API使用 - Stars-One的杂货小窝来替换我们常用的startActivityForResult,但实际上,虽然说是解耦合了,但写法确实有些繁琐

最近迭代项目空闲了研究些,没想到同事已经封装好了(还帮他测出一个bug,之后也是修复了),就记录下

PS:以下代码已封装在我的库中stars-one/XAndroidUtil: 封装自己常用的一些Android的组件或工具,可以直接依赖使用

代码

下面代码直接复制到一个文件里即可,因为是扩展方法

private val nextLocalRequestCode = AtomicInteger()

private val nextKey: String
    get() = "activity_rq#${nextLocalRequestCode.getAndIncrement()}_starsone"

/**
 * Activity启动并回调数据(不用再写onActivityResult方法里接收数据)
 */
fun ComponentActivity.startActivityForResult(
    intent: Intent,
    result: (ActivityResult) -> Unit
) {
    var launcher by Delegates.notNull<ActivityResultLauncher<Intent>>()
    launcher = activityResultRegistry.register(
        nextKey,
        ActivityResultContracts.StartActivityForResult()
    ) {
        result.invoke(it)
        launcher.unregister()
    }
    lifecycle.addObserver(object : LifecycleEventObserver {
        override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
            if (event == Lifecycle.Event.ON_DESTROY) {
                launcher.unregister()
                lifecycle.removeObserver(this)
            }
        }
    })
    launcher.launch(intent)
}

至于代码如何得到到,实际上也是翻源码翻出来的,具体的我就没有细究了,似乎是Activity Results AP有提供不和生命周期一起绑定使用的方法来着

使用的话就Activity对象调用即可

startActivityForResult(Intent()){
    val resultCode = it.resultCode
    if (resultCode==Activity.RESULT_OK) {
        val dataIntent = it.data
        //你的逻辑
    }
}
posted @ 2024-01-04 23:54  Stars-one  阅读(82)  评论(0编辑  收藏  举报