Activity 数据传递与数据回传

843 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

在Android的开发中,我们时常会遇到两个Activity之间传递数据的场景,那么在Activity之间如何传递数据呢?

Activity之间传递数据呢,包含了向上一个Activity和向下一个Activity传递数据,我们分别将它们成为“数据传递”和“数据回传”,数据传递和数据回传其实有很多种方法实现,这篇文章简单来介绍几种方法吧。

1. 数据传递(将数据传递给下一个Activity)

在数据传递中,我们主要介绍使用ExtraBundle传递,这两种方法也是我们最常用和最简单的方法。

  1. 使用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);
  1. 使用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)

  1. 使用旧版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();
    }
}
  1. 使用新版Activity Result API实现

未完待续~