【从子Activity中获取返回结果】registerForActivityResult

本人刚开始入门Android,如有错误之处,请多多包涵,并帮我指出错误,谢谢~


前言

  最近在阅读《Android编程权威指南》这本书,在5.3节中关于Activity间的数据传输这一块,从父Activity跳转到子Activity,想要实现从子Activity获取返回结果,书上提供的是startActivityForResult这种过时的方法。现在官方已经推荐新的方法了,也就是registerForActivityResult。大神们的帖子都用的是kotlin语言来介绍的,由于看不懂kotlin代码我只好自己捣鼓了,废话不多说,直接说说Java版本怎么使用。


一、场景

  • 现在有FatherActivitySonActivity两个页面

从Father跳转到Son,使用startActivity(Intent intent)方法,其中通过Intent来实现数据传递,Intent可以传递基本数据类型和对象。

  • 那么 SonActivity 在做完相关操作后回退到 FatherActivity 时,如何把操作后的数据回调给FatherActivity呢?有两个思路
    1. 在SonActivity中做完相关操作后,向FatherActivity发送广播;
    2. 使用registerForActivityResult方法实现数据回调。

这里只介绍思路2。


二、实现方法

布局代码很简单,省略。

在FatherActivity中

第一步:实例ActivityResultLauncher对象

第二步:设置启动按钮

public class FatherActivity extends AppCompatActivity {
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

		//step1:实例化ActivityResultLauncher对象
  	    ActivityResultLauncher resultLauncher =
	    registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new                  ActivityResultCallback<ActivityResult>() {
        //必须重写此方法,作用是:在数据回调成功后父Activity需要做什么操作,这部分可以结合具体场景来写
        @Override
        public void onActivityResult(ActivityResult result) {
            //回调过来的intent数据
            Intent data = result.getData();
			//回调过来的结果代码
            int resultCode = result.getResultCode();
            if (resultCode == RESULT_OK){
                Toast.makeText(FatherActivity.this,"子页面数据已变化",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(FatherActivity.this,"数据未做改变",Toast.LENGTH_SHORT).show();
            }
        }
    });
        //step2:启动
        mButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(FatherActivity.this, SonActivity.class);
                        resultLauncher.launch(intent);
                    }
         	   });
    }

在SonActivity中

在页面即将结束时,设置回调

public class SonActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity2";
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Log.d(TAG, "2的onCreate被调用");

        mButton = findViewById(R.id.button_son);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("returnData", "我是返回值");
                //这一步最重要,是设置回调结果的
//                setResult(RESULT_OK,intent);
                setResult(RESULT_CANCELED, intent);
                //resultCode(结果代码)可以使用系统设置
                //的RESULT_OK或者RESULT_CANCELED,也可以自己设置一个
                finish();
            }
        });
    }
}

注:本文主要用于个人学习总结使用,如有侵权请联系删除!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值