【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
118 0
|
存储 缓存 自然语言处理
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
174 0
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
|
前端开发 API C++
相似度99%?Jetpack Compose 与 React Hooks API对比
众所周知Jetpack Compose设计理念甚至团队成员很多都来自React,在API方面参考了很多React(Hooks) 的设计,通过与React进行对比可以更好地熟悉Compose的相关功能。
373 0
|
API Android开发 Kotlin
【Jetpack】学穿:Activity Results API(下)
【Jetpack】学穿:Activity Results API
328 0
|
API 开发者
【Jetpack】学穿:Activity Results API(上)
【Jetpack】学穿:Activity Results API
187 0
|
安全 API Android开发
Jetpack:使用 ActivityResult 处理 Activity 之间的数据通信
本文先介绍ActivityResult的基本使用,最后会通过源码来探讨背后的原理。 在Android中,我们如果想在Activity之间双向传递数据,需要使用startActivityForResult启动,然后在onActivityResult中处理返回,另外申请权限也是类似的步骤。 但是这样的处理方式会让我们的代码变得非常复杂,并且也无法保证在 Activity 发送或接收数据时参数的类型安全。
417 0
|
3天前
|
JSON 安全 API
如何高效编写API接口:以Python与Flask为例
构建RESTful API的简明教程:使用Python的Flask框架,从环境准备(安装Python,设置虚拟环境,安装Flask)到编写首个API(包括获取用户列表和单个用户信息的路由)。运行API服务器并测试在`http://127.0.0.1:5000/users`。进阶话题包括安全、数据库集成、API文档生成和性能优化。【6月更文挑战第27天】
21 7
|
3天前
|
JSON 安全 API
实战指南:使用PHP构建高性能API接口服务端
构建RESTful API的简要指南:使用PHP和Laravel,先安装Laravel并配置数据库,接着在`api.php`中定义资源路由,创建`PostController`处理CRUD操作,定义`Post`模型与数据库交互。使用Postman测试API功能,如创建文章。别忘了关注安全性、错误处理和性能优化。
12 2
|
5天前
|
人工智能 运维 Serverless
函数计算产品使用问题之启动的实例是否有调用api接口停止功能
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6天前
|
数据挖掘 API 开发者
​Email API有哪些,最好的3个API接口有哪些
Email API如SendGrid、Mailgun和AOKSend是企业自动化邮件通信的关键工具。它们提供邮件发送、接收和管理功能,提升效率,优化客户体验。SendGrid以其高可靠性、强大分析和易于集成备受青睐;Mailgun以灵活性和高发送率著称;而AOKSend则以其高效、详细分析和易用性脱颖而出。通过使用这些API,企业能实现定制化邮件服务,跟踪性能,提升邮件营销效果。