开发过程中,我们经常需要从当前活动启动另一个活动获取一些数据,比如从图库选择图片,读取通讯录,拍照等,以前我们通常都是使用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相关推荐

  1. 第48讲 Android Camera2 API FD人脸检测

    本讲是Android Camera专题系列的第48讲,我们介绍Android Camera2 API专题的FD人脸检测,包括如下内容: FD Metadata FD模式 FD Results FD 实 ...

  2. Android的API与差异化之路

              Android的API与差异化之路                 发挥Android特色:框架API和开源(开放)     Android平台就如同×××长城般,两岸的硬件业厂商 ...

  3. Android 中文API (94) —— MediaController

    前言 本章内容是android.widget.MediaController,版本为Android 2.3 r1,翻译来自"唐明",再次感谢"唐明" !期待你一 ...

  4. Android 中文 API 文档 (45) —— AbsoluteLayout.LayoutParams

    前言 本章内容是 android.widget.AbsoluteLayout.LayoutParams,版本为Android 2.2 r1,翻译来自"绵白糖",再次感谢" ...

  5. Android 中文API (92) —— MenuInflater

    前言 本章内容是android.view.MenuInflater,版本为Android 2.3 r1,翻译来自"獨鍆躌踄",欢迎大家访问他的博客:http://www.cnblo ...

  6. Android 中文 API (90) —— WindowManager

    一.结构 public interface WindowManager extends android.view.ViewManager android.view.WindowManager 二.概述 ...

  7. Android 中文API (70) —— BluetoothDevice[蓝牙]

    前言 本章内容是 android.bluetooth.BluetoothDevice,为Android蓝牙部分的章节翻译.蓝牙设备类,代表了蓝牙通讯国足中的远端设备.版本为 Android 2.3 r ...

  8. Android 设备管理API概览(Device Administration API)

    原文:http://android.eoe.cn/topic/android_sdk Android 2.2通过提供Android设备管理API的支持来引入企业应用支持.在系统级的设备管理API提供了 ...

  9. Android中文API(127) —— MessageQueue

    结构 继承关系 public class MessageQueue extends Object java.lang.Object android.os.MessageQueue 类概述 保存消息列表 ...

最新文章

  1. C#统计一段时间内有多少个星期几
  2. 如何搭建modem编译环境
  3. permute是最好的Mac上面的格式转换器
  4. 安装SQL Server2008错误解决方案
  5. 科学计算机乱码,谁知道我的科学计算器这是怎么了?屏幕一堆乱码,什么都按不了...
  6. C#正则表达式判断输入日期格式是否正确
  7. 关于 SAXParseException Content is not allowed in Prolog (前言中不允许有内容)
  8. sketch设置字体技巧(二)---通过组合法重新组建字体
  9. 如何PDF转Word文档?快把这些方法收好
  10. php txt bom,使用 PHP 函数或者软件去除文件的 BOM 头字符 - 文章教程
  11. 【经验分享】如何将拍摄的照片制作成扫描件 PS+WORD教程
  12. vscode是什么(vscode干嘛用的)
  13. Problem L: 数羊————思维不严谨
  14. vue 所有dom加载完毕后操作dom节点
  15. 顺序表的建立、查找、插入、删除
  16. Docker 18.09.0更换阿里镜像加速器
  17. 报错SyntaxError: Unexpected token T in JSON at position 0 at JSON.parse (<anonymous>)的解决方法
  18. python粒子风暴_气象雷达应用中常见的名词解释
  19. 做人温和一点,做事狠一点。
  20. 计算机毕业设计 基于SSM的公交线路查询和管理系统

热门文章

  1. Date类的getDay()和getDate()方法
  2. Double的compareTo
  3. 【Proteus8+keil5的仿真使用】
  4. 现实环境中,关于Teb Local Planner 参数调试总结
  5. xp系统如何查看计算机用户,xp查看电脑配置、查看电脑型号详细教程和命令
  6. 使用IMP导入数据时遇到ORA-20005的错误
  7. Internet Download Manager浏览器插件安装方法
  8. 凯捷面试(2):JavaWeb、框架
  9. 【js原生调用Node.js】使用spawn如果cwd不存在会报错
  10. 矩阵理论| 特殊矩阵:Hermite矩阵/共轭对称矩阵