设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间04 现在时间04 缓存数据 十七岁吻的人额头没有粉底

十七岁吻的人额头没有粉底 -- 十七岁

查看: 1900|回复: 3

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:239
  • 打卡月天数:0
  • 打卡总奖励:7648
  • 最近打卡:2025-03-30 17:26:01
等级头衔

等級:晓枫资讯-上等兵

在线时间
34 小时

积分成就
威望
0
贡献
706
主题
675
精华
0
金钱
9857
积分
1446
注册时间
2023-1-15
最后登录
2025-3-30

发表于 2023-5-12 22:04:32 | 显示全部楼层 |阅读模式
前言

今天在做项目的时候,遇到了需要打开文件管理中某个文件夹的需求,在网上看到一个大佬是这样写的:
  1.     private void openMusic(){
  2.         Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:Music");
  3.         Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
  4.         intent.addCategory(Intent.CATEGORY_OPENABLE);
  5.         intent.setType("*/*");
  6.         intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
  7.         startActivityForResult(intent, 1);
  8.     }
复制代码
本想着借鉴过来直接使用,但是IDE上清晰的 startActivityForResult,让我觉得应该仔细研究一下这个方法了。

startActivityForResult用法

在以前,我们经常会遇到启动一个 Activity,并从中获取数据的需求,此外还有一些常见的场景是调用系统相机、调用相册获取照片、调用通讯录等。通常的做法就是使用 Intent 携带数据,之后将 Intent 和请求码传入
  1. startActivityForResult
复制代码
方法来启动下一个Activity
  1. startActivityForResult(intent,1)
复制代码
最终在
  1. onActivityResult
复制代码
方法中来接收返回的数据。实现 onActivityResult 方法
  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  3.     super.onActivityResult(requestCode, resultCode, data);
  4.     if(requestCode == 1 && resultCode == Activity.RESULT_OK){
  5.         // 处理带回的数据
  6.     }
  7. }
复制代码
但是随着应用的开发 onActivityResult 回调方法难以解耦复用后期维护困难。于是Google推出
  1. 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 调用
  1. launch(...)
复制代码
启动目标Activity。

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

ActivityResultCallback部分源码
230458mzknrukty2yxkzxu.jpeg


常规用法

下面实现一个最基本的小例子,首先我在 MainActivity 的 onCreate 方法中,进行如下实现
  1. @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_main);
  5.         ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(
  6.                 new ActivityResultContracts.StartActivityForResult(),
  7.                 result -> {
  8.                     if (result.getResultCode() == RESULT_OK) {
  9.                         //获取返回的结果
  10.                         String data = result.getData().getStringExtra("data");
  11.                         Log.d(TAG, "onCreate: " + data);
  12.                         Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
  13.                     }
  14.                 });
  15.         Button button1 = findViewById(R.id.button_2);
  16.         button1.setOnClickListener(new View.OnClickListener() {
  17.             @Override
  18.             public void onClick(View v) {
  19.                 Intent intent = new Intent(MainActivity.this, SecondActivity.class);
  20.                 activityResultLauncher.launch(intent);
  21.             }
  22.         });
  23.     }
复制代码
之后我在 SecondActivity 的 onCreate 方法中,进行如下实现
  1. @Override
  2. protected void onCreate(@Nullable Bundle savedInstanceState) {
  3.     super.onCreate(savedInstanceState);
  4.     setContentView(R.layout.activity_2);
  5.     Intent intent = new Intent();
  6.     intent.putExtra("data", "这是回调的数据");
  7.     setResult(RESULT_OK, intent);
  8.     finish();
  9. }
复制代码
需要注意的是:
registerForActivityResult
  1. 只能在onCreate()中注册,不然在使用的时候会报异常
复制代码
  1. 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的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2024-9-28 12:18:26 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
12
积分
4
注册时间
2023-6-4
最后登录
2023-6-4

发表于 2024-11-3 02:35:28 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2025-4-7 17:03:45 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表