【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
158 0
|
存储 缓存 自然语言处理
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
204 0
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
|
前端开发 API C++
相似度99%?Jetpack Compose 与 React Hooks API对比
众所周知Jetpack Compose设计理念甚至团队成员很多都来自React,在API方面参考了很多React(Hooks) 的设计,通过与React进行对比可以更好地熟悉Compose的相关功能。
436 0
|
API Android开发 Kotlin
【Jetpack】学穿:Activity Results API(下)
【Jetpack】学穿:Activity Results API
369 0
|
API 开发者
【Jetpack】学穿:Activity Results API(上)
【Jetpack】学穿:Activity Results API
217 0
|
安全 API Android开发
Jetpack:使用 ActivityResult 处理 Activity 之间的数据通信
本文先介绍ActivityResult的基本使用,最后会通过源码来探讨背后的原理。 在Android中,我们如果想在Activity之间双向传递数据,需要使用startActivityForResult启动,然后在onActivityResult中处理返回,另外申请权限也是类似的步骤。 但是这样的处理方式会让我们的代码变得非常复杂,并且也无法保证在 Activity 发送或接收数据时参数的类型安全。
450 0
|
7月前
|
存储 安全 Android开发
构建高效的Android应用:Kotlin与Jetpack的结合
【5月更文挑战第31天】 在移动开发的世界中,Android 平台因其开放性和广泛的用户基础而备受开发者青睐。随着技术的进步和用户需求的不断升级,开发一个高效、流畅且易于维护的 Android 应用变得愈发重要。本文将探讨如何通过结合现代编程语言 Kotlin 和 Android Jetpack 组件来提升 Android 应用的性能和可维护性。我们将深入分析 Kotlin 语言的优势,探索 Jetpack 组件的核心功能,并通过实例演示如何在实际项目中应用这些技术。
|
6月前
|
数据管理 API 数据库
探索Android Jetpack:现代安卓开发的利器
Android Jetpack是谷歌为简化和优化安卓应用开发而推出的一套高级组件库。本文深入探讨了Jetpack的主要构成及其在应用开发中的实际运用,展示了如何通过使用这些工具来提升开发效率和应用性能。
|
5月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
71 4
|
6月前
|
Android开发
Jetpack Compose: Hello Android
Jetpack Compose: Hello Android