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
 //你的逻辑
 }
}
作者:Stars-one原文地址:https://www.cnblogs.com/stars-one/p/17946427

%s 个评论

要回复文章请先登录注册