Android Results API
开发过程中,我们经常需要从当前活动启动另一个活动获取一些数据,比如从图库选择图片,读取通讯录,拍照等,以前我们通常都是使用startActivityForResult去启动一个Activity,但是现在发现它过时了,官方推荐使用Activity Results API,下面我们看一下它的使用方式。
1、导入依赖
implementation 'androidx.activity:activity:1.2.0-beta01'
implementation 'androidx.fragment:fragment:1.3.0-beta01'
2、构建启动器
构建启动器,注册,注册接口处理返回结果。
ActivityResultLauncher<Intent> content = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),new ActivityResultCallback<ActivityResult>() {@Overridepublic void onActivityResult(ActivityResult result) {// 获取返回结果和返回的resultCodeIntent data = result.getData();int resultCode = result.getResultCode();// 获取结果数据就可以做其他的逻辑了// data.getStringExtra("name");}});
注意我们这里的写法,需要启动活动,所以第一个参数是ActivityResultContracts.StartActivityForResult(),
如果是其他动作,找ActivityResultContracts下对应的类,比如权限申请,打开文件等等操作。
ActivityResultContracts.GetContent
ActivityResultContracts.openDocument
ActivityResultContracts.RequestPermission
ActivityResultContracts.PickContact
…
根据需要,我们还可以定义自己的协议类,继承自ActivityResultContracts类,而上面所提供的这些类也是这样实现的,比如PickContact这个类
public static final class PickContact extends ActivityResultContract<Void, Uri>{}
ActivityReultLauncher:启动器,是一个泛型类,根据我们想要启动的Activity传入相应类型,如果不确定类型,可以随便传入一个,在确定ActivityResultContract类型之后再根据提示更改即可,启动器通过launch方法进行跳转。
ActivityResultContract:协议,它定义了传递的数据的类型和如何传递。
ActivityResultCallback:结果回调接口。
在合适的地方通过launch方法去启动一个活动,比如点击按钮等,当结果返回时会自动调用注册的回调函数。
content.launch(new Intent(this,MainActivity2.class));
那Activity中如何返回结果呢?使用方法和以前一样的
@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity2.this,MainActivity.class);intent.putExtra("name","我来自activity2");setResult(Activity.RESULT_OK,intent);finish();}
3、其他用法
查询联系人信息
ActivityResultLauncher<Void> contacts = registerForActivityResult(new ActivityResultContracts.PickContact(),new ActivityResultCallback<Uri>() {@Overridepublic void onActivityResult(Uri result) {if (result!=null){Cursor cursor = getContentResolver().query(result,null,null,null,null);if (cursor.moveToFirst()){String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));Log.d(TAG, "onActivityResult: "+name);}}}});
启动
contacts.launch(null);
申请权限
ActivityResultLauncher<String> permission = registerForActivityResult(new ActivityResultContracts.RequestPermission(),new ActivityResultCallback<Boolean>() {@Overridepublic void onActivityResult(Boolean result) {if (result){Toast.makeText(MainActivity.this, "申请权限成功", Toast.LENGTH_SHORT).show();}else {Toast.makeText(MainActivity.this, "申请权限失败", Toast.LENGTH_SHORT).show();}}});
启动器传入需要申请的权限名称
permission.launch(Manifest.permission.READ_CONTACTS);
拍张照
ActivityResultLauncher<Void> takePicture = registerForActivityResult(new ActivityResultContracts.TakePicturePreview(),new ActivityResultCallback<Bitmap>() {@Overridepublic void onActivityResult(Bitmap result) {if (result!=null){binding.imageView.setImageBitmap(result);}}});
启动
takePicture.launch(null);
4、注意事项
ActivityResultLauncher必需在activity的onCreate()方法或fragment的onCreate()、onAttach()前先注册,然后在需要调用的地方调用launch方法。
Android Results API相关推荐
- 第48讲 Android Camera2 API FD人脸检测
本讲是Android Camera专题系列的第48讲,我们介绍Android Camera2 API专题的FD人脸检测,包括如下内容: FD Metadata FD模式 FD Results FD 实 ...
- Android的API与差异化之路
Android的API与差异化之路 发挥Android特色:框架API和开源(开放) Android平台就如同×××长城般,两岸的硬件业厂商 ...
- Android 中文API (94) —— MediaController
前言 本章内容是android.widget.MediaController,版本为Android 2.3 r1,翻译来自"唐明",再次感谢"唐明" !期待你一 ...
- Android 中文 API 文档 (45) —— AbsoluteLayout.LayoutParams
前言 本章内容是 android.widget.AbsoluteLayout.LayoutParams,版本为Android 2.2 r1,翻译来自"绵白糖",再次感谢" ...
- Android 中文API (92) —— MenuInflater
前言 本章内容是android.view.MenuInflater,版本为Android 2.3 r1,翻译来自"獨鍆躌踄",欢迎大家访问他的博客:http://www.cnblo ...
- Android 中文 API (90) —— WindowManager
一.结构 public interface WindowManager extends android.view.ViewManager android.view.WindowManager 二.概述 ...
- Android 中文API (70) —— BluetoothDevice[蓝牙]
前言 本章内容是 android.bluetooth.BluetoothDevice,为Android蓝牙部分的章节翻译.蓝牙设备类,代表了蓝牙通讯国足中的远端设备.版本为 Android 2.3 r ...
- Android 设备管理API概览(Device Administration API)
原文:http://android.eoe.cn/topic/android_sdk Android 2.2通过提供Android设备管理API的支持来引入企业应用支持.在系统级的设备管理API提供了 ...
- Android中文API(127) —— MessageQueue
结构 继承关系 public class MessageQueue extends Object java.lang.Object android.os.MessageQueue 类概述 保存消息列表 ...
最新文章
- C#统计一段时间内有多少个星期几
- 如何搭建modem编译环境
- permute是最好的Mac上面的格式转换器
- 安装SQL Server2008错误解决方案
- 科学计算机乱码,谁知道我的科学计算器这是怎么了?屏幕一堆乱码,什么都按不了...
- C#正则表达式判断输入日期格式是否正确
- 关于 SAXParseException Content is not allowed in Prolog (前言中不允许有内容)
- sketch设置字体技巧(二)---通过组合法重新组建字体
- 如何PDF转Word文档?快把这些方法收好
- php txt bom,使用 PHP 函数或者软件去除文件的 BOM 头字符 - 文章教程
- 【经验分享】如何将拍摄的照片制作成扫描件 PS+WORD教程
- vscode是什么(vscode干嘛用的)
- Problem L: 数羊————思维不严谨
- vue 所有dom加载完毕后操作dom节点
- 顺序表的建立、查找、插入、删除
- Docker 18.09.0更换阿里镜像加速器
- 报错SyntaxError: Unexpected token T in JSON at position 0 at JSON.parse (<anonymous>)的解决方法
- python粒子风暴_气象雷达应用中常见的名词解释
- 做人温和一点,做事狠一点。
- 计算机毕业设计 基于SSM的公交线路查询和管理系统
热门文章
- Date类的getDay()和getDate()方法
- Double的compareTo
- 【Proteus8+keil5的仿真使用】
- 现实环境中,关于Teb Local Planner 参数调试总结
- xp系统如何查看计算机用户,xp查看电脑配置、查看电脑型号详细教程和命令
- 使用IMP导入数据时遇到ORA-20005的错误
- Internet Download Manager浏览器插件安装方法
- 凯捷面试(2):JavaWeb、框架
- 【js原生调用Node.js】使用spawn如果cwd不存在会报错
- 矩阵理论| 特殊矩阵:Hermite矩阵/共轭对称矩阵