本人刚开始入门Android,如有错误之处,请多多包涵,并帮我指出错误,谢谢~
前言
最近在阅读《Android编程权威指南》这本书,在5.3节中关于Activity间的数据传输这一块,从父Activity跳转到子Activity,想要实现从子Activity获取返回结果,书上提供的是startActivityForResult这种过时的方法。现在官方已经推荐新的方法了,也就是registerForActivityResult。大神们的帖子都用的是kotlin语言来介绍的,由于看不懂kotlin代码我只好自己捣鼓了,废话不多说,直接说说Java版本怎么使用。
一、场景
- 现在有
FatherActivity
和SonActivity
两个页面
从Father跳转到Son,使用startActivity(Intent intent)方法,其中通过Intent来实现数据传递,Intent可以传递基本数据类型和对象。
- 那么
SonActivity
在做完相关操作后回退到FatherActivity
时,如何把操作后的数据回调给FatherActivity
呢?有两个思路- 在SonActivity中做完相关操作后,向FatherActivity发送广播;
- 使用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();
}
});
}
}
注:本文主要用于个人学习总结使用,如有侵权请联系删除!