【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
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
204 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,企业能实现定制化邮件服务,跟踪性能,提升邮件营销效果。