Android Activity Results API代替onActivityResult处理页面数据

 更新时间:2022年09月06日 15:32:47   作者:儿歌八万首  
说到onActivityResult,我们已经非常熟悉来,通过在A activity启动B activity并且传入数据到B中,然后在A中通过onActivityResult来接收B中返回的数据。在最新的activity-ktx的beta版本中,谷歌已经废弃了onActivityResult

onActivityResult

 @SuppressWarnings("deprecation")
    @Override
    @CallSuper
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        mFragments.noteStateNotSaved();
        super.onActivityResult(requestCode, resultCode, data);
    }

Activity Results API的使用

在最新beta版本中谷歌推荐使用Activity Results API来处理页面数据的处理。通过新的 Activity Result API,我们可以单独的类中处理结果回调,真正做到 单一职责 。

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

implementation 'androidx.activity:activity-ktx:1.2.0-beta01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'

2.自定义ActivityResultContract

自定义ActivityResultContract,用来处理两个activity互传数据的处理,替代onActivityResult方法 其中ActivityResultContract<String, String>第一个泛型参数表示输入的参数类型,即要带到下一个Activity的数据类型, 第二个泛型参数表示输出参数类型,即第二个Activity回传第一个Activity的数据类型。

class CustomActivityResultContract : ActivityResultContract<String, String>() {
    override fun createIntent(context: Context, input: String?): Intent {
        //要传到下一个activity中的数据,从A activity中带到B activity中的数据。
        return Intent(context, SecondActivity::class.java).putExtra("name", input)
    }
    override fun parseResult(resultCode: Int, intent: Intent?): String {
        //从activity回传的数据
        val result = intent?.getStringExtra("result") //从B activity中回传的数据。
        if (resultCode == Activity.RESULT_OK && result != null) {
            return "$result"
        }
        return ""
    }
}

3.注册ActivityResult协议

在A activity中注册ActivityResult协议,使用我们刚刚定义的CustomActivityResultContract。

registerForActivityResult方法有两个参数,第一个参数是传入对应的Contract,第二个参数是回调结果callback。

private val activityLauncher = registerForActivityResult(CustomActivityResultContract()) {
        //第二个页面关闭后回到第一个页面的回调方法
        tvName.text = it
    }

4.调用launch方法开启界面跳转

使用第三步我们生成的启动器对象的launch方法来启动界面跳转,launch方法需要传入一个输入参数,也就是需要带到下一个页面的参数,可以是任意对象:

 btnStartSecond.setOnClickListener {
            //点击跳转到SecondActivity
            activityLauncher.launch("我是第一个页面传过去的参数")
        }

5.使用谷歌内置的 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返回,应用程序可以完全管理返回目录中的文档。

一般情况下使用StartActivityForResult就可以满足大部分需求啦。

 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可以很方便的实现页面间传值来,这样也可以实现解偶操作了。

到此这篇关于Android Activity Results API代替onActivityResult处理页面数据的文章就介绍到这了,更多相关Android Activity Results API内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • kotlin代码中!!操作符的清楚方法

    kotlin代码中!!操作符的清楚方法

    这篇文章主要给大家介绍了关于kotlin代码中!!操作符的清楚方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • Android布局——Preference自定义layout的方法

    Android布局——Preference自定义layout的方法

    PreferenceActivity是一个方便设置管理的界面,但是对于界面显示来说比较单调,所以自定义布局就很有必要了,下面与大家分享下Preference中自定义layout的方法
    2013-06-06
  • Android如何实现蓝牙配对连接功能

    Android如何实现蓝牙配对连接功能

    Android 并没有开放配对连接耳机的接口,而且网上大部分资料都是讲解如何连接蓝牙4.0的,很少有资料详细介绍蓝牙2.0相关的。期间还是踩了不少坑才摸索出解决办法。所以把我自己摸索总结出来的经验梳理记录下,以便备份
    2021-05-05
  • Android JSON数据与实体类之间的相互转化(GSON的用法)

    Android JSON数据与实体类之间的相互转化(GSON的用法)

    这篇文章主要介绍了Android JSON数据与实体类之间的相互转化(GSON的用法),非常具有实用价值,需要的朋友可以参考下。
    2017-01-01
  • Android开发实现生成excel的方法详解

    Android开发实现生成excel的方法详解

    这篇文章主要介绍了Android开发实现生成excel的方法,结合实例形式详细分析了Android生成Excel的具体步骤与存储、导入、添加等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Flutter开发之动态权限的使用

    Flutter开发之动态权限的使用

    众所周知,Android在6.0版本后将权限修改成了动态权限,而iOS则一直使用的是动态权限,所以在Flutter应用开发中如果涉及到一些危险权限,就需要进行动态申请,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-09-09
  • Android指纹登录工具类封装

    Android指纹登录工具类封装

    这篇文章主要为大家详细介绍了Android指纹登录工具类的封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • android隐式意图激活浏览器的实现方法

    android隐式意图激活浏览器的实现方法

    下面小编就为大家带来一篇android隐式意图激活浏览器的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Android编程实现文件浏览功能的方法【类似于FileDialog的功能】

    Android编程实现文件浏览功能的方法【类似于FileDialog的功能】

    这篇文章主要介绍了Android编程实现文件浏览功能的方法,可实现类似于FileDialog的功能,涉及Android针对文件与目录操作的相关技巧,需要的朋友可以参考下
    2016-11-11
  • Android常用的AlertDialog对话框及自定义对话框

    Android常用的AlertDialog对话框及自定义对话框

    本文主要介绍了android常用的AlertDialog对话框及自定义对话框的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04

最新评论