registerForActivityResult用法详解

引言

在以前,我们经常会遇到启动一个 Activity,并从中获取数据的需求,此外还有一些常见的场景是调用系统相机、调用相册获取照片、调用通讯录等。通常的做法就是使用 Intent 携带数据,之后将 Intent 和请求码传入 startActivityForResult 方法来启动下一个Activity。

但是随着应用的开发 onActivityResult 回调方法难以解耦复用后期维护困难。于是Google推出Activity Results API

Activity Results API介绍

Activity Results API 是 Google官方推荐的Activity、Fragment获取数据的方式。它有两个主要的用途:

  • 取代 startActivityForResult 方法,去启动Activity并返回结果
  • 取代 requestPermissions 方法,去请求运行时权限

========================================================================

在 AppCompatActivity 或者 Fragment 中使用 registerForActivityResult() 方法来代替 startActivityForResult() (Android api29中使用startActivityForResult提示已过时,应该变成registerForActivityResult)。

该方法接收两个参数并返回ActivityResultLauncher

一个是ActivityResultContract

一个是ActivityResultCallback

最终使用 activityResultLauncher 调用launch(...)启动目标Activity。

  • ActivityResultLauncher 用于启动另一个 Activity
  • ActivityResultContract 这是一个协议类,它的两个泛型分别表示启动参数的类型和返回结果的类型。可以通过继承的方式来自定义 ActivityResultContract
  • ActivityResultCallback 是单一方法接口,内部只有 onActivityResult 这一个方法,可以接受ActivityResultContract 中定义的输出类型的对象
【注意】:registerForActivityResult只能在onCreate中注册。onstart之后就不能注册了

打开activity 

示例:

        val activityResultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK) {
                //获取返回的结果
                val data = result.data!!.getStringExtra("data")
                Log.d( "tag", "onCreate: $data")
                Toast.makeText(this, data, Toast.LENGTH_SHORT).show()
            }
        }

        val intent = Intent(this@MainActivity, SecondActivity::class.java)
        activityResultLauncher.launch(intent)

申请权限

示例:

//单个权限        
registerForActivityResult(ActivityResultContracts.RequestPermission()){
     if(it){
       //用户同意了该权限
     }else{
       //用户拒绝了该权限
     }

}.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)



// 多个权限
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){it->
            //通过的权限
            val grantedList = it.filterValues { it }.mapNotNull { it.key }
            //是否所有权限都通过
            val allGranted = grantedList.size == it.size
            val list = (it - grantedList).map { it.key }
            //未通过的权限
            val deniedList = list.filter { ActivityCompat.shouldShowRequestPermissionRationale(this, it) }
            //拒绝并且点了“不再询问”权限
            val alwaysDeniedList = list - deniedList
        }.launch(arrayOf("权限1","权限2","权限3"))

其他操作

除了基本用法,ActivityResultContracts还提供了一些ActivityResultContract的实现类,以便进行其他的操作:

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一个跨平台的自动化构建工具,可以用于生成各种不同类型的构建文件,包括Makefile、Visual Studio解决方案、Xcode项目等。下面是CMake的使用方法详解: 1. 安装CMake 首先需要在官网上下载并安装CMake软件。安装完成后,可以在命令行中输入cmake --version来确认是否安装成功。 2. 创建一个CMakeLists.txt文件 在项目根目录下创建一个名为CMakeLists.txt的文件,该文件是CMake的核心配置文件,定义了项目的构建规则。可以使用文本编辑器或者IDE来创建这个文件。 3. 设置项目信息 在CMakeLists.txt文件中,需要设置项目的基本信息,包括项目名称、版本号、语言等。这可以通过使用project命令来实现。例如: ``` project(MyProject VERSION 1.0 LANGUAGES CXX) ``` 这里设置了项目名称为MyProject,版本号为1.0,使用C++作为编程语言。 4. 定义源文件 在CMakeLists.txt文件中,需要定义项目的源文件。可以使用add_executable或add_library命令来添加源文件。例如: ``` add_executable(myapp main.cpp) ``` 这里添加了一个名为myapp的可执行文件,它的源文件是main.cpp。 5. 添加依赖库 如果项目依赖于其他库,需要使用find_package或者add_subdirectory命令来添加依赖库。例如: ``` find_package(Boost REQUIRED COMPONENTS filesystem system) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(myapp ${Boost_LIBRARIES}) ``` 这里添加了一个名为Boost的库,它的组件是filesystem和system。 6. 设置编译选项 在CMakeLists.txt文件中还可以设置编译选项,例如编译标志、链接标志等。可以使用target_compile_options和target_link_libraries命令来设置编译选项。例如: ``` target_compile_options(myapp PRIVATE -Wall -Wextra) target_link_libraries(myapp pthread) ``` 这里设置了编译标记为-Wall和-Wextra,链接标记为pthread。 7. 构建项目 完成以上步骤后,就可以使用cmake命令来生成构建文件,例如: ``` mkdir build cd build cmake .. ``` 这里在项目根目录下创建了一个build目录,并在其中使用cmake命令生成Makefile文件。 最后,使用make命令来编译和构建项目。例如: ``` make ``` 这里编译和构建了项目,并生成myapp可执行文件。 以上就是CMake的使用方法详解。通过CMake,可以方便地管理项目的构建过程,实现跨平台的构建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值