本文转载自微信公众号「Android开发编程」,进阶全作者Android开发编程。面拥转载本文请联系Android开发编程代码众号。进阶全
随着应用的面拥扩展,onActivityResult回调方法各种嵌套、进阶全耦合严重、面拥难以维护;
在google最新的进阶全activity-ktx beta版本中已经废弃了原onActivityResult方法,推荐使用Activity Results API来处理页面数据的面拥处理;
通过新的 Activity Result API,我们可以单独的进阶全类中处理结果回调,真正做到单一职责。面拥
今天我们就来介绍下:
Activity Results API 是 Google官方推荐的Activity、Fragment获取返回结果的面拥方式。ActivityResultContract是进阶全一个抽象类,也是我们需要定义的协议,它需要去定义如何传递数据和如何处理返回的数据;
相当于原startActivityForResult 和onActivityResult方法;
主要用到两个组件
ActivityResultContract: 协议,云南idc服务商它定义了如何传递数据和如何处理返回的数据; ActivityResultLauncher: 启动器,调用ActivityResultLauncher的launch方法来启动页面跳转,作用相当于原来的startActivity()。2.1在app下的build.gradle中加入依赖
mplementation androidx.activity:activity-ktx:1.2.0-beta01 implementation androidx.fragment:fragment-ktx:1.3.0-beta012.2首先自定义一个ActivityResultContract,实现两个activity互传的数据处理
class MyActivityResultContract : ActivityResultContract<String, String?>() { override fun createIntent(context: Context, input: String?): Intent { return Intent(context, SecondActivity::class.java).apply { putExtra("input", input) } } override fun parseResult(resultCode: Int, intent: Intent?): String? { val data = intent?.getStringExtra("result") return if (resultCode == Activity.RESULT_OK && !TextUtils.isEmpty(data)) data else null } } 调用registerForActivityResult方法,注册刚刚定义的contract协议,返回一个activityResultLauncher对象。 val activityResultLauncher = registerForActivityResult(MyActivityResultContract()) { Toast.makeText(this, "result value is :${ it}", Toast.LENGTH_LONG).show() }2.3 用返回的launcher对象启动另一个activity界面
btn_start_second.setOnClickListener { activityResultLauncher.launch("second activity start") }还可以通过ActivityResultContracts类来调用谷歌为我们内置的Contract,其中包含来各种常用的Contract
@StartActivityForResult: 通用的Contract,不做任何转换,Intent作为输入,ActivityResult作为输出,这也是最常用的一个协定; @RequestMultiplePermissions:用于请求一组权限; @RequestPermission: 用于请求单个权限; @TakePicturePreview: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值为Bitmap图片 @TakePicture: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,并将图片保存到给定的Uri地址,返回true表示保存成功; @TakeVideo: 调用MediaStore.ACTION_VIDEO_CAPTURE 拍摄视频,亿华云保存到给定的Uri地址,返回一张缩略图; @PickContact: 从通讯录APP获取联系人; @GetContent: 提示用选择一条内容,返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址(content://形式) 。默认情况下,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的内容; @CreateDocument: 提示用户选择一个文档,返回一个(file:/http:/content:)开头的Uri。 @OpenMultipleDocuments: 提示用户选择文档(可以选择多个),分别返回它们的Uri,以List的形式; @OpenDocumentTree: 提示用户选择一个目录,并返回用户选择的作为一个Uri返回,应用程序可以完全管理返回目录中的文档; private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == RESULT_OK) { val result = intent?.getStringExtra("result") tvName.text = result } } btnStartSecond.setOnClickListener { //点击跳转到SecondActivity val intent = Intent(this, SecondActivity::class.java) intent.putExtra("name", "我是第一个页面传过去的参数") activityResultLauncher.launch(intent) }使用系统内置的ActivityResultContract可以很方便的实现页面间传值来。
使用activity results api替代传统的onActivityResult方法,可以简化我们的代码,提高代码的重用性;一起加油!
源码下载