如果系统内置协定不满足需求,可以通过继承ActivityResultContract
类来自定义协定,ActivityResultContract
有两个范型参数,Input
和Output
。然后现实它的两个方法,createIntent
方法来创建你的意图Intent
,parseResult
方法通过resultCode
和intent
来解析结果并返回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
方法最终会调用ActivityResultRegistry
的 register
方法,通过不同的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