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

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

0x1、引言


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


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


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


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


注释说这种写法out了,可在 ActivityResultContract 中传入一个 RequestMultiplePermissions 对象,并在回调中处理结果。除此之外,诸如 startActivityForResult()onActivityResult() 等都过时了。


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


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


  • 定义REQUEST_CODE,同一个页面有多个数据时,避免重复;
  • 调用 startActivityForResult(Intent, REQUEST_CODE)
  • 重写 onActivityResult(),判断requestCode和resultCode,拿到值后执行后续逻辑;


简易代码示例如下


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


新页面,一个简单的setResult,然后finish():


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


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


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


跳转页面不用动,可以看到:移除了onActivityResult()的重写,少写了一个REQUEST_CODE。看着好像是简洁了一些,对了网上一堆旧文章说要依赖activity-ktx和fragment-ktx,笔者使用1.4.0的activity和fragment包,发现已经内置这些东西了,可以不依赖,技术迭代飞快,建议读者使用时以官方文档为准。


0x2、原理浅探


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


Activity Results API的使用非常简单 (侧面说明封装得好),它由三个要素组成:启动器 + 协定 + 结果回调


① ActivityResultLauncher → 启动器


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


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


② ActivityResultContract → 协定/契约


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


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


方法看着有点懵?没关系,找两个个具体实现类看看就知道了。

ActivityResultContracts 给我们提供了一些 常用的协定,拿来即用:


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


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


  • StartActivityForResult() → 通用协定,不做任何转换,Intent作为输入,ActivityResult作为输出;
  • StartIntentSenderForResult() → 内部Intent请求;
  • RequestMultiplePermissions() → 请求一组权限;
  • RequestPermission() → 请求单个权限;
  • TakePicturePreview() → 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回Bitmap图片;
  • TakePicture() → 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,并将图片保存在给定Uri,返回true表示保存成功;
  • TakeVideo() → 调用MediaStore.ACTION_VIDEO_CAPTURE录制,并将视频保存在给定Uri,返回true表示保存成功;
  • PickContact() → 调用通讯录APP获取联系人;
  • GetContent() → 提示选择一条内容,返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址(content://形式) 。默认情况下,它增加了 Intent#CATEGORY_OPENABLE, 返回可以表示流的内容;
  • GetMultipleContents() → 提示选择多条内容;
  • OpenDocument() → 提示选择文档,返回Uri;
  • OpenMultipleDocuments() → 提示用户选择多个文档,以List形式,返回他们的Uri;
  • OpenDocumentTree() → 提示用户选择目录,返回Uri;
  • CreateDocument() → 提示用户选择创建新文档的路径,返回已创建项目的Uri。


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


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