Activity Result API 使用与源码分析

本文详细介绍了Android的ActivityResult API的使用,包括如何在其他类中接收Activity的结果,通过LifecycleObserver实现注册和启动。文章还探讨了内部实现,包括register、launch方法的源码分析,以及结果回调的处理流程。通过对源码的解析,读者可以更深入理解ActivityResult API的工作原理。
摘要由CSDN通过智能技术生成

如果系统内置协定不满足需求,可以通过继承ActivityResultContract类来自定义协定,ActivityResultContract有两个范型参数,InputOutput。然后现实它的两个方法,createIntent方法来创建你的意图IntentparseResult方法通过resultCodeintent来解析结果并返回Output类型。 类似StartActivityForResult源码

public static final class StartActivityForResult

extends ActivityResultContract<Intent, ActivityResult> {

public Intent createIntent(@NonNull Context context, @NonNull Intent input) {

return input;

}

public ActivityResult parseResult(

int resultCode, @Nullable Intent intent) {

return new ActivityResult(resultCode, intent);

}

}

6.在其它类中接收Activity的结果

需要通过实现LifecycleObserver来实现协定的注册和启动器启动。

Activity注册这个观察者

var myLifecycleObserver=MyLifecycleObserver(registry = activityResultRegistry)

lifecycle.addObserver(myLifecycleObserver)

调用

myLifecycleObserver.selectImage()

实现DefaultLifecycleObserver,在onCreate注册协定

class MyLifecycleObserver(private val registry : ActivityResultRegistry) :DefaultLifecycleObserver{

lateinit var getContent : ActivityResultLauncher

override fun onCreate(owner: LifecycleOwner) {

getContent = registry.register(“key”, owner, ActivityResultContracts.GetContent(),

ActivityResultCallback { log(it) })

}

fun selectImage(){

getContent.launch(“image/*”)

}

}

二,源码


使用版本activity-ktx:1.2.2,fragment-ktx:1.3.3

1.register

registerForActivityResult方法最终会调用ActivityResultRegistryregister方法,通过不同的key生成一个唯一的requestCode,把这个requestCode保存下来,在结果返回时使用。通过Lifecycle添加一个观察者,监听Activity的ON_START,ON_STOP,ON_DESTROY事件。在ON_START事件到来时,会从mPendingResults这个bundle对象中通过key获取结果,如果有结果,则将结果回调到调用者处。ON_STOP事件则是移除这个key对应的CallbackAndContract对象,ON_DESTROY事件移除这个key对应的所有信息。最后返回ActivityResultLauncher对象给调用者使用。

public final <I, O> ActivityResultLauncher register(

@NonNull fina

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值