过时的OnActivityResult(二)
发布网友
发布时间:2023-09-10 22:35
我来回答
共1个回答
热心网友
时间:2024-01-25 12:35
针对上篇《过时的OnActivityResult一》,本篇进行源码解析:
先来看一下在Activity中启动launcher之后是怎么实现这种功能的
调用ComponentActivity中的registerForActivityResult,该方法返回一个ActivityResultLauncher用于启动Intent
由于没有自定义ActivityResultRegistry,所以这里使用的是ComponentActivity中的mActivityResultRegistry,调用了ActivityResultRegistry中的register
register则使用了lifecycleOwner实现了自动解绑功能,然后返回了一个ActivityResultLauncher,并调用了invoke方法
这个时候回到ComponentActivity的mActivityResultRegistry看下源码就知道是怎么一回事了,该方法先判断了action是否为权限或者支付,最后调用的startActivityForResult
具体流程大概是这个样子,再来看下是如何拦截onActivityResult的
ActivityResultRegistry拦截了onActivityResult,onRequestPermissionsResult同理,dispatchResult方法判断了是否需要拦截,根据在调用register的时候保存的registerkey来判断
然后拿出mKeyToCallback中保存对应requestCode的回调ActivityResultCallback,这个时候调用ActivityResultCallback的onActivityResult,这样就能拿到对应的数据和状态
fragment也是先拿到mActivityResultRegistry然后还是走的Activity流程