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
        //你的邏輯
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章