【Jetpack】学穿:Activity Results API(中)

简介: 【Jetpack】学穿:Activity Results API

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


网络异常,图片无法展示
|


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


网络异常,图片无法展示
|


接着是 TakePicturePreview


网络异常,图片无法展示
|


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


  • createIntent(context: Context, input: I): Intent → 创建用于 startActivityForResult 的intent对象;
  • parseResult (resultCode: Int, intent: Intent?): O → 对 onActivityResult 的结果进行转换;
  • getSynchronousResult() → 可选,处理一些不需要启动Activity就能知道预期结果的场景,如RequestPermission会用到;


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


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 → 结果回调


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


网络异常,图片无法展示
|


就定义了一个回调方法,Activity Result API 又是 模版方法模式 封装的思想体现,开发仔按需注入 协定类型结果回调 即可,无需关注底层细节。巴适得很!


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


0x2、原理再探


在Activity、Fragment中可以直接使用 registerForActivityResult(),是因为 ComponentActivityFragment 都实现了 ActivityResultCaller 接口。


网络异常,图片无法展示
|


① Activity


先跟下 ComponentActivity#registerForActivityResult()


网络异常,图片无法展示
|


第一个参数构造了一个key,规则:activity_rq# + 一个自增的AtomicInteger值,怪不得不用另外定义一个REQUEST_CODE,就能进行区分。


继续跟 ActivityResultRegistry#register()


网络异常,图片无法展示
|


看着好像挺复杂,其实不然,核心就是:


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


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


网络异常,图片无法展示
|


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


网络异常,图片无法展示
|


到此,基本的调用链条就浮出水面了:


  • ComponentActivity 内部初始化了一个 ActivityResultRegistry 实例,并重写了 onLaunch()
  • ② 开发者调用 registerForActivityResult() 最终调用 ActivityResultRegistry.register(),在此添加了一个观察者,当生命周期状态切换到ON_START时,执行协定 Contract.parseResult() 生成输出内容,并把结果作为参数传入回调 callback.onActivityResult() 中。
  • ③ 注意!②是要生命周期发生改变才会触发的,开发者要调用 ActivityResultLauncher.launch() 才会发起跳转,其中回调了 onLaunch() 方法,在此调用了协定 Contract.createIntent() 返回一个和 startActivityForResult() 搭配使用的 Intent 实例。
  • ④ 跳转目标Activity后返回此页面,生命周期发生改变,然后回调②中的相关代码。

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


相关文章
|
API Android开发
Android Activity Result API
Android Activity Result API
379 0
|
存储 缓存 自然语言处理
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
368 0
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
|
前端开发 API C++
相似度99%?Jetpack Compose 与 React Hooks API对比
众所周知Jetpack Compose设计理念甚至团队成员很多都来自React,在API方面参考了很多React(Hooks) 的设计,通过与React进行对比可以更好地熟悉Compose的相关功能。
625 0
|
API Android开发 Kotlin
【Jetpack】学穿:Activity Results API(下)
【Jetpack】学穿:Activity Results API
519 0
|
API 开发者
【Jetpack】学穿:Activity Results API(上)
【Jetpack】学穿:Activity Results API
321 0
|
安全 API Android开发
Jetpack:使用 ActivityResult 处理 Activity 之间的数据通信
本文先介绍ActivityResult的基本使用,最后会通过源码来探讨背后的原理。 在Android中,我们如果想在Activity之间双向传递数据,需要使用startActivityForResult启动,然后在onActivityResult中处理返回,另外申请权限也是类似的步骤。 但是这样的处理方式会让我们的代码变得非常复杂,并且也无法保证在 Activity 发送或接收数据时参数的类型安全。
562 0
|
3月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
3月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
4月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。
|
3月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。