【Android】registerForActivityResult新的向上传递数据技术(使用java语言解释)

4、registerForActivityResult 向上一个活动传递数据

startActivityForResult 的替代方案registerForActivityResult

4.1 设计思路

大致思路:先向下传递一个Intent,向下的activity操作这个Intent后再次将这个Intent返回给上一个activity。

image-20230718113337072

既然需要使用新的功能,那么我们就必须要先了解以下,刚说到的ActivityResultLauncherActivityResultContractActivityResultCallback到底是些什么东西

  • ActivityResultLauncher 从字面意思其实就能很好理解,可以理解它就是一个Activity的启动器,它的作用就是承载启动对象与返回对象,通registerForActivityResult返回该对象,这时并不会立即启动另一个Activity。
  • ActivityResultContract 是用来协定所需的输入类型以及结果的输出类型,Android默认提供了一些常用的定义,例如上面所使用到到ActivityResultContracts.StartActivityForResult()。当然这里你也可以通过继承ActivityResultContract实现自己的定义。
  • ActivityResultCallback 通过名字就可以了解到这是启动Activity并返回到当前Activity时的结果回调。

4.2 设计ActivityResultLauncher

根据上面的流程图我们可以知道首先先实现ActivityResultLauncher,java实现代码如下:

private ActivityResultLauncher<Intent> resultLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            //判断是否传入正确的result
            if(result.getResultCode() == RESULT_OK){
                Intent intent = result.getData();   //获取上一个活动返回的Intent
                //判断上一个活动的Intent是否存在,存在则在日志中输入
                if(intent != null){
                    String str = intent.getStringExtra("data_return");
                    Log.d("DATA",str);
                }
            }
        }
    });

通过这段代码我们可以看到使用了registerForActivityResult这个方法,传递了两个参数。

4.2.1 registerForActivityResult() 方法解析

registerForActivityResult() 方法接收两个参数。

  • 第一个参数是一种 Contract 类型。

    Contract 用于指定一个 Activity 被调用时,使用 I 类型的输入,产生 O 类型的输出。

  • 第二个参数是回调。即当存在返回值时,处理返回结果的代码。用 lambda 表达式来实现

image-20230718114557356

在实现一个 Activity 向上一个 Activity 传递数据的需求中第一个参数可以传入 ActivityResultContracts.StartActivityForResult()该对象的 输入类型 I 为 Intent,输出类型 O 为 ActivityResult

4.3 向下传递Intent

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActivityMainBinding  activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());

    setContentView(activityMainBinding.getRoot());

    Button button = (Button) activityMainBinding.button1;
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
            //向下传递Intent
            resultLauncher.launch(intent);
        }
    });
}

4.4 下一个活动接收Intent

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActivityMain2Binding binding = ActivityMain2Binding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    View button = binding.button2;

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //获取前一个活动传递的Intent
            Intent intent = getIntent();
            //给这个Intent封装value
            intent.putExtra("data_return","xupt3G");
            //返回活动的结果
            setResult(RESULT_OK,intent);

            Toast.makeText(getApplicationContext(),"已经返回结果", Toast.LENGTH_SHORT).show();
            finish();
        }
    });
}

setResult()方法接收两个参数,第一个参数用于向上个活动返回处理结果,一般只使用RESULT OKRESULT_CANCELED这两个值,第二个参数则把带有数据的Intent传递回去。

image-20230718115455681

现在当我们返回上一个活动时就会正常返回值了。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
`registerForActivityResult` 是 Android Jetpack 中的一个 API,用于注册一个 Activity Result 的回调函数。它可以方便地处理 startActivityForResult 和 onActivityResult 的复杂性,使得开发者可以更加轻松地处理 Activity 之间的数据传递和交互。 使用 `registerForActivityResult` 可以避免使用 startActivityForResult 和 onActivityResult 这两个方法,而是使用更简单和类型安全的方式来处理 Activity 之间的交互。例如,您可以使用以下代码在一个 Activity 中启动另一个 Activity 并等待其返回结果: ``` // 创建一个 ActivityResultLauncher 对象 ActivityResultLauncher<Intent> launcher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { // 处理返回结果 Intent data = result.getData(); // ... } }); // 启动另一个 Activity Intent intent = new Intent(this, AnotherActivity.class); launcher.launch(intent); ``` 在上面的代码中,我们创建了一个 `ActivityResultLauncher` 对象,并将其与一个 `StartActivityForResult` 合同进行关联。然后,我们可以使用 `launcher` 对象启动另一个 Activity 并等待其返回结果。一旦另一个 Activity 返回结果,我们的回调函数将被调用,并且我们可以处理返回的数据使用 `registerForActivityResult` 可以使得代码更加简洁和易于维护,并且可以避免一些常见的错误和异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼小小虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值