IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Results API -> 正文阅读

[移动开发]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>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                // 获取返回结果和返回的resultCode
                Intent 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中如何返回结果呢?使用方法和以前一样的

            @Override
            public 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>() {
            @Override
            public 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>() {
            @Override
            public 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>() {
            @Override
            public void onActivityResult(Bitmap result) {
                if (result!=null){
                    binding.imageView.setImageBitmap(result);
                }
            }
        });

启动

takePicture.launch(null);

4、注意事项

ActivityResultLauncher必需在activity的onCreate()方法或fragment的onCreate()、onAttach()前先注册,然后在需要调用的地方调用launch方法。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:49:24  更:2021-11-11 12:50:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:40:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码