Android registerForActivityResult新用法实现两个Activity间数据传递

 更新时间:2023年04月07日 09:09:55   作者:Ci_ci  
这篇文章主要为大家介绍了Android registerForActivityResult新用法实现两个Activity间数据传递详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

今天在做项目的时候,遇到了需要打开文件管理中某个文件夹的需求,在网上看到一个大佬是这样写的:

    private void openMusic(){
        Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:Music");
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
        startActivityForResult(intent, 1);
    }

本想着借鉴过来直接使用,但是IDE上清晰的 startActivityForResult,让我觉得应该仔细研究一下这个方法了。

startActivityForResult用法

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

 startActivityForResult(intent,1)

最终在 onActivityResult 方法中来接收返回的数据。实现 onActivityResult 方法

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1 && resultCode == Activity.RESULT_OK){
        // 处理带回的数据
    }
}

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

Activity Results API介绍

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

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

registerForActivityResult()

在 AppCompatActivity 或者 Fragment 中使用 registerForActivityResult() 方法来代替 startActivityForResult() (Android api29中使用startActivityForResult提示已过时,应该变成registerForActivityResult)。该方法接收两个参数并返回ActivityResultLauncher。其中两个参数一个是ActivityResultContract,一个是ActivityResultCallback。最终使用 activityResultLauncher 调用launch(...)启动目标Activity。

  • ActivityResultLauncher 用于启动另一个 Activity
  • ActivityResultContract 这是一个协议类,它的两个泛型分别表示启动参数的类型和返回结果的类型。可以通过继承的方式来自定义 ActivityResultContract
  • ActivityResultCallback 是单一方法接口,内部只有 onActivityResult 这一个方法,可以接受ActivityResultContract 中定义的输出类型的对象

registerForActivityResult部分源码

ActivityResultCallback部分源码

常规用法

下面实现一个最基本的小例子,首先我在 MainActivity 的 onCreate 方法中,进行如下实现

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_OK) {
                        //获取返回的结果
                        String data = result.getData().getStringExtra("data");
                        Log.d(TAG, "onCreate: " + data);
                        Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
                    }
                });
        Button button1 = findViewById(R.id.button_2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                activityResultLauncher.launch(intent);
            }
        });
    }

之后我在 SecondActivity 的 onCreate 方法中,进行如下实现

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_2);
    Intent intent = new Intent();
    intent.putExtra("data", "这是回调的数据");
    setResult(RESULT_OK, intent);
    finish();
}

需要注意的是:

registerForActivityResult只能在onCreate()中注册,不然在使用的时候会报异常

java.lang.IllegalStateException: LifecycleOwner com.yxf.extensions.MainActivity@f8e47f4 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.

以上就是Android registerForActivityResult新用法实现两个Activity间数据传递的详细内容,更多关于Android registerForActivityResult的资料请关注脚本之家其它相关文章!

相关文章

  • 分享几个Android开发有用的程序代码

    分享几个Android开发有用的程序代码

    本文主要是给大家分享了几个常用而且很实用的程序代码片段,都是个人项目中提取出来的,有需要的小伙伴可以直接拿走使用
    2015-02-02
  • Android WebView组件用法详解

    Android WebView组件用法详解

    这篇文章主要介绍了Android WebView组件用法,结合实例形式详细分析了Android WebView组件的功能、权限设置、布局及使用技巧,需要的朋友可以参考下
    2016-02-02
  • Android自定义控件之继承ViewGroup创建新容器

    Android自定义控件之继承ViewGroup创建新容器

    这篇文章主要介绍了Android自定义控件之继承ViewGroup创建新容器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Android发送xml数据给服务器的方法

    Android发送xml数据给服务器的方法

    这篇文章主要介绍了Android发送xml数据给服务器的方法,以实例形式较为详细的分析了Android发送XML数据及接收XML数据的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Android中用RxJava和ViewPager实现轮播图

    Android中用RxJava和ViewPager实现轮播图

    现在App中实现一个轮播图已经是很多产品的标配了,这篇文章给大家详细介绍了如何利用RxJava和ViewPager实现轮播图,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-09-09
  • 详解android 用webview加载网页(https和http)

    详解android 用webview加载网页(https和http)

    这篇文章主要介绍了详解android 用webview加载网页(https和http),详细的介绍了两个错误的解决方法,有兴趣的可以了解一下
    2017-11-11
  • Android自定义View实现简单水波纹效果

    Android自定义View实现简单水波纹效果

    这篇文章主要为大家详细介绍了Android自定义View实现简单水波纹效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Android开发之DialogFragment用法实例总结

    Android开发之DialogFragment用法实例总结

    这篇文章主要介绍了Android开发之DialogFragment用法,结合实例形式总结分析了Android使用DialogFragment代替Dialog功能的相关使用技巧与注意事项,需要的朋友可以参考下
    2017-11-11
  • 怎样删除android的gallery中的图片实例说明

    怎样删除android的gallery中的图片实例说明

    长按gallery中的图片进行删除该图片的操作,具体实现如下,感兴趣的朋友可以参考下哈
    2013-06-06
  • Android原生绘图工具Paint详细

    Android原生绘图工具Paint详细

    这篇文章要给大家分享的是Android原生绘图工具Paint,android中提供了类似的工具Canvas和Paint,分别对应画布和画笔,本文就来介绍Androi中的Paint,感兴趣的小伙伴一起来学习下面文章内容
    2021-09-09

最新评论