之前提到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
//你的邏輯
}
}