0x1、引言

【Jetpack】学穿:Activity Results API

不是什么新玩意了,恰逢最近拆公司项目的BaseFragment时看到介个:

【Jetpack】学穿:Activity Results API

下划线?Deprecated?点开源码看下啥原因,有啥替代方案:

【Jetpack】学穿:Activity Results API

Android释说这种写法oJavaut了,可在 ActivityResultContract 中传入一个 RequestMultiplePermission测试英文s 对象,并在回调中处理结果。除此之外,诸如 startActivityForResult()onActivityResult() 等都过时了。

搜了一波官方文档《获取 activity 的结果 》,没找到具体原因,笔者猜测官方旨在开源帮助开发者:减少样板代码、解耦

以前跳转新页面回传数据,得经历这三步:

  • 定义REQUEST_CODE,同一个页面有多个数据时java是什么意思,避免重复;
  • 调用 startActivityForR宫颈癌esult(Intent, REQUEST_CODE)
  • 重写 onActivityResult(),判断requestCode和resultCode,拿到值后执行后续工龄差一年工资差多少逻辑;

简易代码示例如下

【Jetpack】学穿:Activity Results API

新页面,一个简单的setResult,然后finijava怎么读sh():

【Jetpack】学穿:Activity Results API

而使用 Activity Result API,你只需定义一个函数,然后launch()一下:

【Jetpack】学穿:Activity Results API

跳转页面不用动,可以看到:移除了onActivi开源节流tyResult()的重写,工龄越长退休金越多吗少写了一个REQUEST_CODE。看着好像是简洁了一些,对了网上一堆旧文章说要依赖activity-ktjava编译器x和fragment-ktx,笔者使用1.4.0的activitJavay和fragment测试手机是否被监控包,发现已经内置这些java语言东西了,可以不Java依赖,技术迭代飞快,建议读者使用时以官方文档为准。

0x2、原理浅探

【Jetpack】学穿:Activity Results API

Activity Results API的使用非常简单 (侧面说明封装得好),它测试工程师由三个要素组成:启动器 + 协定工龄差一年工资差多少 + 结果回调

① ActivityResultLauncher → 启动器

registerForActivityResult() 的返回值,用于:承载启动对象与返回对象

【Jetpack】学穿:Activity Results API

② ActivityResultContract → 协定/契约

第一个入参,协定的是枸杞所需的输入类型结果的输出类型

【Jetpack】学穿:Activity Results API

方法看着有点懵?没关android手机系,找两个个具体实现类看看就知道了。ActivityResultCon枸杞tracts 给我们提供了一些 常用的协定,拿来即用:

【Jetpack】学穿:Activity Results API

罗列下各自的作用 (直接看代码实现也能猜到干嘛的~):

  • StartActivityForResult() → 通用协定,不做任何转换,Intent作为输入,ActivityResult作为输出;
  • StartIntentSenderForResult() → 内部Intent请求;
  • RequestMultiplePermissions() → 请求一组权限;
  • RequestPermission() → 请求单个权限;
  • Ta开源众包ke开源阅读PicturePreview()Java → 调用MediaStore.ACTION_IMAGE测试抑郁症_CAPTURE拍照,返回Bitmap图片;
  • TakePicture() → 调用MediaStore.ACTION_IMAGE_CAPTURjava是什么意思E拍照,并将图片保存在给定Uri,返回true表示保存成功;
  • TakeVideo() → 调用MediaStore.ACTION_VIandroid的drawable类DEO_CAPTURE录制,并将视频保存在给定Uri,返回true表示保存成功;
  • PickContact() → 调用通讯录APP获取联系人;
  • GetContent()android是什么系统 提示选Go择一条内容,返回一个通过ContentResolver#openInputStrandroid下载eam(Uri)访问原生数据的Uri地址测试你的自卑程度(content://形式) 。默认情况下,它增加了 Intent#CATEGORY_OPENABLE,开源中国 返回可开源节流是什么意思以表示流的内容;测试手机是否被监控
  • GetMultipleContents() → 提示选择多条内容;
  • OpenDocumenandroid手机t() → 提示选择文档,返回Uri;
  • OpenMultipleDocuments() → 提示用户选择多个文档,以List形式,返回他们的Uri;
  • OpenDocumenJavatTree() → 提示用户选择目录,返回Uri;
  • CreateDocument() → 提示用户选择创建新文档的路径,返回已创建项目的Uri。

附:调用文件选择器,获取指定类型的文件,可在launch()方法里使用mimetype指定调用文件类型,文件mimetype对照表可参见Go:media-types

挑两个协议看看具体代码实现,先是 StartActivityForResult

【Jetpack】学穿:Activity Results API

返回类型ActivityResult实现了Parcelable序列化接口,定义了需要用到的两个字段:mResultCode 和 mData。

【Jetpack】学穿:Activity Results API

接着是 TakePicturePreview

【Jetpack】学穿:Activity Results API

所以 ActivityResultContract 中的函数意义分别是:

  • createIntent(context: Context, input: I)测试抑郁症的20道题: Intent → 创建用测试抑郁症startActivityForResult 的intent对象;
  • parseResult (resultCode: Int, intent: Intent?): O → 对 ojavascriptnActivityResult 的结果进行转换;
  • getSynchronousResult() → 可选,处理一些不需要启动Activandroid是什么手机牌子ity就能知测试用例道预期结果的场景,如RequestPermijava语言ssion会用到;

了解函数意义后,如果你觉得内置协定满足不了你,完全可以自定义一波,官方示例如下:

class PickRingtone : ActivityResultContract<Int, Uri?>() {
    override fun createIntent(context: Context, ringtoneType: Int) =
        Intent(RingtoneManager.ACTION_RINGTONE_PICKER).apply {
            putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, ringtoneType)
        }
    override fun parseResult(resultCode: Int, result: Intent?) : Uri? {
        if (resultCode != Activity.RESULT_OK) {
            return null
        }
        return result?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
    }
}

③ ActivityResultCallback → 结java语言果回调

第二个入参,见名知意:启动Activity并返枸杞回当前Actgoogleivity时的 结果回调

【Jetpack】学穿:Activity Results API

就定义了一个回调方法,Acjava怎么读tivity R测试抑郁症的20道题esult API 又是 模版方法模式 封装的思想体现,开发仔按需注入 协定类型结果回调 即可,无需关注底层细节。巴适得很!

【Jetpack】学穿:Activity Results API

杰哥当然不会止步于调别人写好的API,接着再探一波更深层次的原理,弄清楚整条调用链路。


0x2、原理再探

在Activity、Fragment中开源中国可以直接使用 registerForActivityResult(),是因为开源众包 ComponentActivityFragm开源矿工ent 都实现了 ActivityResultCaller 接口。

【Jetpack】学穿:Activity Results API

① Activity

先跟下 ComponentActivity#registerForActiviandroid是什么系统tyResult()

【Jetpack】学穿:Activity Results API

java模拟器一个参数构造了一个key,规则:activity_rq# + 一个自增的AtomicInteger值,怪不得java环境变量配置不用另外定义一个REQ测试UEST_CODE,就能进行区分。

继续跟 ActivityResultRegistry#register()测试手机是否被监控

【Jetpack】学穿:Activity Results API

开源软件着好像挺复杂,其实不然,核心就是:

添加了一个观察者,当生命周期组件(传入的第2个参数) 状态切换到测试英文 ON_START 时执行回调

然后下半段返回了一个 ActivityResultLauncher 实例:

【Jetpack】学穿:Activity Results API

跟下 onLaunch() 发现是一个抽象方法,具体实现在 ComponentActivity 中:

【Jetpack】学穿:Activity Results API

到此,基测试英文本的测试抑郁症的20道题调用链条就浮出水面了:

  • ComponentActivity 内部初始化了一个 ActivityResultRegistry 实例,并重写了 onLaunch()
  • ② 开发者调用 registerForActivity开源众包Result() 最终调用 ActivityResultRegistry.register(),在此添加了一个观察者,当生命周期状态切换到ON_START时,执行协定 Contract.parAndroidseResuljava是什么意思t() 生成输出内容,并把结果作为参数开源节流传入回调 callback.onActivityResult() 中。
  • ③ 注意!②是要生命周期发生改java面试题变才会java模拟器触发的,开发者要调用 ActivityResultLauncher.launch(google) 才会发起测试跳转,其中回调了 onLaunch() 方法,在此调用了协定 Contract.createInte测试手机是否被监控nt() 返回一测试手机是否被监控个和 startAc开源阅读tivityForResult() 搭配使用的 Intent 实例。
  • ④ 跳转目标Activity后返回此页面,生命周期发生改变,然后回调②中的相关代码。测试工程师

javaee述起来好像有点拗口,不过你自己照着跟下源码就清楚了,接着龚俊跟下Fragment~

② Fragment

同样跟下 registerForActivityResult()

【Jetpack】学穿:Activity Results API

最终调用 prepareCallInternal()

【Jetpack】学穿:Activity Results API

【Jetpack】学穿:Activity Results API

思路也很简单,想办法拿到 宿主Activity中的ActivityResultRegistryandroid/harmonyos实例,调它的 registe测试你的自卑程度r() 拿到返回的 ActivityResultLGoauncher实例引用。最后返回 新的ActivityResult开源矿工Launcher 实例,在launch()中调用前面那个Activity的 ActivityResultLauncJavaher实例引用 的launch()方法。TM调的是Activity的launch(),这一手 委托代理 玩挺6啊。

【Jetpack】学穿:Activity Results API

对了,这有个小细节,生命周期组件传入的是 Fra开源阅读app下载安装gment.this,所以不用担心Fragment销毁没解绑导致的内存泄露问题。

③ 非Activity/Fragment 接收Activity结果

实现一个 LifecycleObserv测试英文er 用于处理协定的注册和启开源众包动器的启动,代码示例如下:

【Jetpack】学穿:Activity Results API

调用处:

【Jetpack】学穿:Activity Results API

④ 亿点小细节:配置改变引起Activity重建的处理

ActivityResultRegistry 中还发现了介个:

【Jetpack】学穿:Activity Results API

好家伙,连配置更改导致重建测试英文的场景也考虑到了吗?

【Jetpack】学穿:Activity Results API

保存了:key(requestCode)相关的数据、处理java面试题结果、Random随机数实例。

【Jetpack】学穿:Activity Results API

requestCode和Result得以保留,java编译器Activity重建后,再把它们分发给新注册的CallGoback,避免了数工龄越长退休金越多吗据的丢失。

【Jetpack】学穿:Activity Results API

⑤ 亿点补充:测试Activity结果调用

默认情况下,registerForActivityResult() 会自动使用Activity提供的 ActivityResultRegistry,而它还提供了一个重公积金载,支持传入自己的 ActivityResultRegistry 实例。能干嘛?拦截结果调用进行测试啊,不会另外启动另一个Activity。代码示例如下:

【Jetpack】学穿:Activity Results API


0x3、关于封装

Actijava是什么意思vity Results API 了解得七七八八了,接下来可以放心地用到项目中了,虽然它的API已测试工程师经很工资超过5000怎么扣税简单易用了。android是什么手机牌子但对于 喜欢偷懒到极致的开发仔 来说还是不够Go的,可以利用Kotlin相关的语法特性,封装下再少写一些代码。

捋下API使用链条:

  • regandroid的drawable类isterForActiviandroid平板电脑价格tyResult()ActiviAndroidtyResultLauncher,需在ON_SGoTART或之前注册,在OnCreate()时再初始化会报错,还得传入一个**ActivityRegooglesultContract** 实例,最后跟一个 ActivityResultCallback 回调。
  • 调用 ActivityResultLauncher#launch() 才触发页面跳转,需要传入一个输入(如Intent)实例。

最简单的封装就是写几个 扩展方法,从Actandroid下载安装ivityResultLauncher生成和launch()调用处入手:

// 扩展
fun ComponentActivity.registerActResult(callback: ActivityResultCallback<ActivityResult>) =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        callback.onActivityResult(it) }
fun Fragment.registerActResult(callback: ActivityResultCallback<ActivityResult>) =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        callback.onActivityResult(it) }
fun Intent.launch(launcher: ActivityResultLauncher<Intent>) {
    launcher.launch(this)
}
// 注册处
private val mLauncher = registerActResult { 
    shortToast("收到测试数据:${it.data?.getStringExtra("value")}") 
}
// 调用处
Intent(this, SecondActivity::class.java).launch(mLauncher)

还可以在优化下,比如改成基于 ActivityResul测试你适合学心理学吗tCall开源er 进行扩展,然后把常用的一些跳转,如权限、打开相机、录像等写成一个个扩展函数,用的时候直接调用即可。懒得自己写或者想找参考的可以看看android是什么系统 → ActivityResult.kt

如果想代码写得更少更优雅,可以折腾得更复杂些,比如结合生命周期回调,各种简化调用的扩展,甚至弄成DSL调用等,具工商银行体可以参考这些:

  • iDeMonnnnnn/DeMon-ARA
  • T测试英文xcA/ManageStartActivity
  • Flywith24/Flywith2java语言4-ActivityResultRequeandroid的drawable类st

开源矿工么封测试工程师装看自己,觉得适合就行,笔者就懒得整那么复杂了~

【Jetpack】学穿:Activity Results API


0x4、小结

借着重构BaseFragm测试英文ent的机缘巧合,过了波Activity Results API的用法,阅读源码了解到背后的实现原理,小试了一google下封装。心里有底了,赶紧在重构项目的时候安排上!!!

【Jetpack】学穿:Activity Results API

有问题或者建议欢迎在评论区提出,肝文不易,如果本文有帮到你的话,开源矿工可以给个三连,谢谢~


参考文献

  • 官方文档:获取 activity 的结果

  • 优雅地google封装 Activity Result测试英文 API,完美地替代 sandroid是什么手机牌子tartActivityForResult()

  • Android onActivityResult的替代方法—registerForActivityResult