开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
在Android的开发中,我们时常会遇到两个Activity之间传递数据的场景,那么在Activity之间如何传递数据呢?
Activity之间传递数据呢,包含了向上一个Activity和向下一个Activity传递数据,我们分别将它们成为“数据传递”和“数据回传”,数据传递和数据回传其实有很多种方法实现,这篇文章简单来介绍几种方法吧。
1. 数据传递(将数据传递给下一个Activity)
在数据传递中,我们主要介绍使用
Extra和Bundle传递,这两种方法也是我们最常用和最简单的方法。
- 使用
Extra传递
Intent的Extra属性经常用于Activity之间传递数据,其存储数据的方式与HashMap存储数据的方式相同,都是使用Key-Value键值对来存储数据。在启动Activity时将需要存储的值塞入Intent,再在Activity启动后从Intent里取出来使用。
// Activity1跳转至Activity2
Intent intent = new Intent(this, SettingActivity.class);
intent.putExtra("name", "GuaJi");
intent.putExtra("age", 22);
startActivity(intent);
// 在Activity2接收数据
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", 0); // int不能为空,所以必须设置默认值0
若我们需要传入多组数据,可以用Bundle将每组数据包裹起来再塞入Intent来传递。
// Activity1跳转至Activity2
Intent intent = new Intent(this, SettingActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "GuaJi");
bundle.putInt("age", 22);
intent.putExtra("bundle01", bundle);// 将打包好的Bundle存入
startActivity(intent);
// 在Activity2接收数据
Bundle bundle = getIntent().getBundleExtra("bundle01");// 取出Bundle
String name = bundle.getString("name");
int age = bundle.getInt("age", 0);
- 使用
Bundle传递
也可以创建Bundle来存储数据,然后再将Bundle传递下去。
// Activity1跳转至Activity2
Intent intent = new Intent(this, SettingActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "GuaJi");
bundle.putInt("age", 22);
intent.putExtras(bundle);// 注意方法名是putExtras
startActivity(intent);
// 在Activity2接收数据
Bundle bundle = getIntent().getExtras();// 注意方法名是getExtras
String name = bundle.getString("name");
int age = bundle.getInt("age", 0);
2. 数据回传(将数据传递给下一个ACtivity)
- 使用旧版
startActivityForResult()方法实现
在
Activity Result API还没有推出之前,一般都是使用startActivityForResult()方法,当API推出之后,该方法便被弃用了,不过还是可以用的,就是不知道什么时候被完全抛弃。
在启动Activity时候我们不能再使用StartActivity()方法,而改为startActivityForResult()来启动Activity,该方法需要我们传入目标Itent和请求码,其中请求码是我们自己设定的,用于区分请求来源。因为传入的请求码在上层Activity中的onActivityResult()监听会返回,那么我们就可以知道返回的数据是由哪个Itent传递过来的。
// 在Activity1中启动Activity2
Intent intent = new Intent(this, ActivityDataTransmission.class);
intent.putExtra("name", "GuaJi");
// 使用该方法启动的Activity支持回传数据,方法需要传入Intent和请求码
startActivityForResult(intent, 2023);
//---------------------------
// 在Activity2返回Activity1并需要传输数据时
Intent intent = new Intent();
intent.putExtra("sex", 1); // 数据写入
setResult(2023, intent); // 设置数据和请求码
finish(); // 返回Activity1
break;
//---------------------------
// 在Activity1中重写onActivityResult()方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 核对请求码
if (requestCode == 2023) {
int sex = data.getIntExtra("sex", -1); // 获取回传的数据
Toast.makeText(this, "回传的数据Sex: " + sex, Toast.LENGTH_SHORT).show();
}
}
- 使用新版
Activity Result API实现
未完待续~