【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
387 0
|
存储 缓存 自然语言处理
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
369 0
Jetpack 系列(3)—— 为什么 Activity 都重建了 ViewModel 还存在?
|
前端开发 API C++
相似度99%?Jetpack Compose 与 React Hooks API对比
众所周知Jetpack Compose设计理念甚至团队成员很多都来自React,在API方面参考了很多React(Hooks) 的设计,通过与React进行对比可以更好地熟悉Compose的相关功能。
626 0
|
API Android开发 Kotlin
【Jetpack】学穿:Activity Results API(下)
【Jetpack】学穿:Activity Results API
529 0
|
API 开发者
【Jetpack】学穿:Activity Results API(中)
【Jetpack】学穿:Activity Results API
382 0
|
安全 API Android开发
Jetpack:使用 ActivityResult 处理 Activity 之间的数据通信
本文先介绍ActivityResult的基本使用,最后会通过源码来探讨背后的原理。 在Android中,我们如果想在Activity之间双向传递数据,需要使用startActivityForResult启动,然后在onActivityResult中处理返回,另外申请权限也是类似的步骤。 但是这样的处理方式会让我们的代码变得非常复杂,并且也无法保证在 Activity 发送或接收数据时参数的类型安全。
564 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商品数据,支撑电商比价、智能推荐等业务场景。