文/程序员男神
前言
最近在整理需求的时候,发现页面之间的数据传输这块是个可以总结的知识点。一般情况下页面之间的数据传输可以有以下几种思路:1、通过startActivityForResult方法进行数据传输;2、通过广播的形式传输;3、可以通过接口的调用来传输数据;4、通过存储介质来分享数据;5、通过EventBus进行页面之间的传输;这边总结一下第一种的简单使用。
一、使用场景
一个主界面(主Activity)通过意图跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回主页面,将子activity中得到的数据显示在主界面/完成的数据交给主Activity处理。这种带数据的意图跳转需要使用activity的onActivityResult()方法。
(1)startActivityForResult(Intent intent, int requestCode);
第一个参数:一个Intent对象,用于携带将跳转至下一个界面中使用的数据,使用putExtra(A,B)方法,此处存储的数据类型特别多,基本类型全部支持。
第二个参数:如果> = 0,当Activity结束时requestCode将归还在onActivityResult()中。以便确定返回的数据是从哪个Activity中返回,用来标识目标activity。
与下面的resultCode功能一致,感觉Android就是为了保证数据的严格一致性特地设置了两把锁,来保证数据的发送,目的地的严格一致性。
(2)onActivityResult(int requestCode, int resultCode, Intent data)
第一个参数:这个整数requestCode用于与startActivityForResult中的requestCode中值进行比较判断,是以便确认返回的数据是从哪个Activity返回的。
第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。适用于多个activity都返回数据时,来标识到底是哪一个activity返回的值。
第三个参数:一个Intent对象,带有返回的数据。可以通过data.getXxxExtra( );方法来获取指定数据类型的数据,
(3)setResult(int resultCode, Intent data)
在意图跳转的目的地界面调用这个方法把Activity想要返回的数据返回到主Activity,
第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED该值默认为0 , RESULT_OK该值默认为-1。
第二个参数:一个Intent对象,返回给主Activity的数据。在intent对象携带了要返回的数据,使用putExtra( )方法。
二、使用步骤
1、startActivityForResult跳转到目标activity。
FirstActivity 页面一个Button,一个Text View。点击Button跳转至SecondActivity,关闭SecondActivity,把SecondActivity的数据传到FirstActivity,显示在TextView上面。
/**
* 描述: 第一个activity
* 作者|时间: djj on 2019/1/14 10:11
* 博客地址: http://www.jianshu.com/u/dfbde65a03fc
*/
public class FirstActivity extends AppCompatActivity {
private Button mBtnStart;
private TextView mTvShow;
private final static int REQUEST_CODE = 1; // 返回的结果码
/**
* 为了得到传回的数据,必须在前面的Activity中(指FirstActivity类)重写onActivityResult方法
*
* @param requestCode 请求码,即调用startActivityForResult()传递过去的值
* @param resultCode 返回码,结果码用于标识返回数据来自哪个新Activity
* @param data 更新后的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CODE) {
mTvShow.setText(data.getExtras().getString("second") + "requestCode:" + requestCode + "resultCode:" + resultCode);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
mBtnStart = findViewById(R.id.btn_start);
mTvShow = findViewById(R.id.tv_shows);
mBtnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//得到新打开Activity关闭后返回的数据
//第二个参数为请求码,可以根据业务需求自己编号
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
});
}
}
activity_first.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="打开Second" />
<TextView
android:id="@+id/tv_shows"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp" />
</LinearLayout>
第二个activity的代码:
/**
* 描述: 第二个activity
* 作者|时间: djj on 2019/1/14 10:16
* 博客地址: http://www.jianshu.com/u/dfbde65a03fc
*/
public class SecondActivity extends AppCompatActivity {
private Button mBtnColse;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mBtnColse = findViewById(R.id.btn_close);
mBtnColse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
//把需要返回的数据存放在intent
intent.putExtra("second", "我是第二页的信息!");
//设置返回数据
setResult(RESULT_OK, intent);
finish();
}
});
}
}
activity_second.xml的文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="关闭Sencond" />
</LinearLayout>
通过data.getExtras().getString("second")我们可以获取Text View的值,也可以看到requestCode、resultCode的数值。
总结
文章虽然简单,自己写一遍还是有点收获,通过自己的总结,基础也可以打的更加牢固把!