Android进阶:全面拥抱Activity Results API来替代onActivityResult

开发 前端
Activity Results API 是 Google官方推荐的Activity、Fragment获取返回结果的方式。ActivityResultContract是一个抽象类,也是我们需要定义的协议,它需要去定义如何传递数据和如何处理返回的数据。

[[428908]]

本文转载自微信公众号「Android开发编程」,作者Android开发编程。转载本文请联系Android开发编程代码众号。

前言

随着应用的扩展,onActivityResult回调方法各种嵌套、耦合严重、难以维护;

在google最新的activity-ktx beta版本中已经废弃了原onActivityResult方法,推荐使用Activity Results API来处理页面数据的处理;

通过新的 Activity Result API,我们可以单独的类中处理结果回调,真正做到单一职责。

今天我们就来介绍下:

一、activity results api介绍和使用方法

1、什么是results api

Activity Results API 是 Google官方推荐的Activity、Fragment获取返回结果的方式。ActivityResultContract是一个抽象类,也是我们需要定义的协议,它需要去定义如何传递数据和如何处理返回的数据;

相当于原startActivityForResult 和onActivityResult方法;

2、使用步骤

主要用到两个组件

  • ActivityResultContract: 协议,它定义了如何传递数据和如何处理返回的数据;
  • ActivityResultLauncher: 启动器,调用ActivityResultLauncher的launch方法来启动页面跳转,作用相当于原来的startActivity()。

2.1在app下的build.gradle中加入依赖

  1. mplementation 'androidx.activity:activity-ktx:1.2.0-beta01' 
  2.  
  3. implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01' 

2.2首先自定义一个ActivityResultContract,实现两个activity互传的数据处理

  1. class MyActivityResultContract : ActivityResultContract<String, String?>() { 
  2.     override fun createIntent(context: Context, input: String?): Intent { 
  3.         return Intent(context, SecondActivity::class.java).apply { 
  4.             putExtra("input", input) 
  5.         } 
  6.     } 
  7.     override fun parseResult(resultCode: Int, intent: Intent?): String? { 
  8.         val data = intent?.getStringExtra("result"
  9.         return if (resultCode == Activity.RESULT_OK && !TextUtils.isEmpty(data)) data else null 
  10.     } 
  11. 调用registerForActivityResult方法,注册刚刚定义的contract协议,返回一个activityResultLauncher对象。 
  12.   val activityResultLauncher = registerForActivityResult(MyActivityResultContract()) { 
  13.             Toast.makeText(this, "result value is :${it}", Toast.LENGTH_LONG).show() 
  14.         } 

2.3 用返回的launcher对象启动另一个activity界面

  1. btn_start_second.setOnClickListener { 
  2.             activityResultLauncher.launch("second activity start"
  3.    } 

3、使用内置的 ActivityResultContract来进行页面跳转

还可以通过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返回,应用程序可以完全管理返回目录中的文档;
  1. private val activityResultLauncher = 
  2.         registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 
  3.             if (it.resultCode == RESULT_OK) { 
  4.                 val result = intent?.getStringExtra("result"
  5.                 tvName.text = result 
  6.             } 
  7.         } 
  8.    btnStartSecond.setOnClickListener { 
  9.             //点击跳转到SecondActivity 
  10.             val intent = Intent(this, SecondActivity::class.java) 
  11.             intent.putExtra("name""我是第一个页面传过去的参数"
  12.             activityResultLauncher.launch(intent) 
  13.         } 

使用系统内置的ActivityResultContract可以很方便的实现页面间传值来。

总结

使用activity results api替代传统的onActivityResult方法,可以简化我们的代码,提高代码的重用性;一起加油!

 

责任编辑:武晓燕 来源: Android开发编程
相关推荐

2021-10-13 07:30:13

AndroidAlarmManageWorkManager

2011-10-14 09:27:57

Hadoop数据库SQL Server

2011-10-14 16:03:30

微软Hadoop

2013-12-02 09:44:33

RadwareOpenStack

2022-06-30 11:36:10

KubeSphereGitOpsLinux

2016-03-24 14:02:05

ActivityAndroid启动

2021-08-23 06:27:46

AndroidctivitysetContentV

2021-10-03 15:08:32

Android

2021-08-24 07:53:28

AndroidActivity生命周期

2021-08-11 17:15:17

AndroidActivity场景

2015-05-20 15:51:50

敏捷网络/华为

2014-11-20 13:07:18

OracleSaaS

2015-05-21 08:55:46

华为敏捷网络

2019-02-19 14:52:01

微软开源Windows

2020-02-03 09:20:43

深度学习编程人工智能

2022-06-28 12:02:11

ClouderaCDP混合数据

2016-10-27 15:14:05

华为OpenStack

2015-11-23 17:14:04

eBayKubernetesOpenStack

2016-07-14 16:33:52

灾备
点赞
收藏

51CTO技术栈公众号