侧边栏壁纸
博主头像
Stars-One的杂货小窝博主等级

所有的创作都是有价值的

  • 累计撰写 277 篇文章
  • 累计创建 46 个标签
  • 累计收到 27 条评论

目 录CONTENT

文章目录

Android 优雅的Activity回调代码封装

Stars-one
2024-01-04 / 0 评论 / 0 点赞 / 281 阅读 / 3225 字

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

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

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

代码

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

import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import java.util.concurrent.atomic.AtomicInteger
import kotlin.properties.Delegates

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
        //你的逻辑
    }
}
0

评论区