当前位置: 首页 > 科技观察

Android进阶:全面拥抱ActivityResultsAPI替代onActivityResult

时间:2023-03-13 01:36:08 科技观察

本文转载请联系Android开发编程码号。前言随着应用的扩展,onActivityResult回调方法嵌套、耦合严重、难以维护;在Google最新的activity-ktxbeta版中,原有的onActivityResult方法已经被废弃,推荐使用ActivityResultsAPI来处理页面数据;通过新的ActivityResultAPI,我们可以在单独的类中处理结果回调,真正做到职责单一。今天我们将介绍:一、Activityresultsapi的介绍和使用1、什么是resultsapiActivityResultsAPI是Google官方推荐的Activity和Fragment获取和返回结果的方式。ActivityResultContract是一个抽象类,也是我们需要定义的协议。需要定义如何传输数据,如何处理返回的数据;相当于原来的startActivityForResult和onActivityResult方法;定义了如何传递数据以及如何处理返回的数据;ActivityResultLauncher:Launcher,调用ActivityResultLauncher的launch方法启动页面跳转,相当于原来的startActivity()。2.1在app下的build.gradle中添加依赖implementation'androidx.activity:activity-ktx:1.2.0-beta01'implementation'androidx.fragment:fragment-ktx:1.3.0-beta01'。2.2首先自定义一个ActivityResultContract,实现两个activity之间的数据处理apply{putExtra("input",input)}}overridefunparseResult(resultCode:Int,intent:Intent?):String?{valdata=intent?.getStringExtra("result")returnif(resultCode==Activity.RESULT_OK&&!TextUtils.isEmpty(data))dataelsenull}}调用registerForActivityResult方法,注册刚刚定义的合约协议,返回一个activityResultLauncher对象。valactivityResultLauncher=registerForActivityResult(MyActivityResultContract()){Toast.makeText(this,"resultvalueis:${it}",Toast.LENGTH_LONG).show()}2.3使用返回的launcher对象启动另一个activity接口btn_start_second.setOnClickListener{activityResultLauncher.launch("secondactivitystart")}3.使用内置的ActivityResultContract跳转到页面。你也可以使用ActivityResultContracts类来调用Google内置的Contract,里面包含了各种常用的Contracts。@StartActivityForResult:通用契约,不做任何Conversion,Intent作为输入,ActivityResult作为输出,也是最常用的契约;@RequestMultiplePermissions:用于请求一组权限;@RequestPermission:用于请求单一权限;@TakePicturePreview:调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值为BitmapPicture@TakePicture:调用MediaStore.ACTION_IMAGE_CAPTURE拍照,将图片保存到给定的Uri地址,返回true表示保存成功;@TakeVideo:调用MediaStore.ACTION_VIDEO_CAPTURE进行视频拍摄,保存到给定的Uri地址,并返回缩略图;@PickContact:从通讯录APP获取联系人;@GetContent:提示用户选择一段内容,返回一个Uri地址(content://格式),通过ContentResolver#openInputStream(Uri)访问原始数据。默认情况下,它添加了Intent#CATEGORY_OPENABLE,它返回可以表示流的内容;@CreateDocument:提示用户选择文档,返回一个以(file:/http:/content:)开头的Uri。@OpenMultipleDocuments:提示用户选择一个文档(可以选择多个),并以List的形式分别返回它们的Uri;@OpenDocumentTree:提示用户选择目录,并将用户的选择作为Uri返回,应用程序可以完全管理返回的目录中的Documentation;privatevalactivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){if(it.resultCode==RESULT_OK){valresult=intent?.getStringExtra("result")tvName.text=result}}btnStartSecond.setOnClickListener{//点击跳转到SecondActivityvalintent=Intent(this,SecondActivity::class.java)intent.putExtra("name","我是第一页传过来的参数")activityResultLauncher.launch(intent)}使用系统自带的ActivityResultContract很方便实现页面间的值传递。总结使用活动结果api代替传统的onActivityResult方法可以简化我们的代码,提高代码的复用性;快点!