背景

昨天复习了Activity的生命周期,生命周期的五大状态,还有一些常见的生命周期调用方法,那么今天我们就来看看Activity之间是怎样传递数据的。

Activity之间传递数据

1,传统Intent

传递基本数据类型

AcvivityB向MainActivity发送数据

1
2
3
Intent intent = new Intent(ActivityB.this, MainActivity.class);
intent.putExtra("sendTextOne", sendTextOne);
startActivity(intent);

MainActivity获取数据

1
2
Intent intent = getIntent();
getTextOne = intent.getStringExtra("sendTextOne");

2,传递多种数据类型(Bundle)

MainActivity向ActivityB发送数据

1
2
3
4
5
Intent intent = new Intent(MainActivity.this, ActivityB.class);
Bundle bundle = new Bundle();
bundle.putString("sendString", "MainActivity发送数据到B");
bundle.putBoolean("sendBoolean", true);
intent.putExtra("key", bundle); //封装对象

ActivityB获取数据

1
2
3
4
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("key");
getTextOne = bundle.getString("sendString");
isTrue = bundle.getBoolean("sendBoolean");

3,传递对象( Serializable )

对象序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.Serializable;

public class Person implements Serializable {
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

private String name;
private int age;
}

MainActivity向ActivityB发送数据

1
2
3
4
5
6
7
8
Person person = new Person();
person.setAge(18);
person.setName("Daisy");
Bundle bundle = new Bundle();
bundle.putSerializable("person", person);
Intent intent = new Intent(MainActivity.this, ActivityB.class);
intent.putExtras(bundle);
startActivity(intent);

ActivityB接收数据

1
person = (Person)getIntent().getSerializableExtra("person");

展示数据

1
2
text1.setText(person.getName()+"");
text2.setText(person.getAge()+"");

4,传递对象( Parcelable )

对象序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class ParcelablePerson implements Parcelable {

private String name;
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
public ParcelablePerson(String name, int age){
this.name = name;
this.age = age;
}
protected ParcelablePerson(Parcel in) {
name = in.readString();
age = in.readInt();
}

public static final Creator<ParcelablePerson> CREATOR = new Creator<ParcelablePerson>() {
@Override
public ParcelablePerson createFromParcel(Parcel in) {
return new ParcelablePerson(in);
}

@Override
public ParcelablePerson[] newArray(int size) {
return new ParcelablePerson[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
}
}

MainActivity向ActivityB发送数据

1
2
3
4
5
6
ParcelablePerson person = new ParcelablePerson("Max", 2);
Bundle bundle = new Bundle();
bundle.putParcelable("ParcelablePerson", person);
Intent intent = new Intent(MainActivity.this, ActivityB.class);
intent.putExtras(bundle);
startActivity(intent);

ActivityB接收数据

1
person =(ParcelablePerson)getIntent().getParcelableExtra("ParcelablePerson");

ActivityB显示数据

1
2
text1.setText(person.getName()+"");
text2.setText(person.getAge()+"");

这也是我第一次接触到Parcelable接口,之前看到和写过的都是 Serializable接口 ,所以上网特意搜索了一下,看看Parcelable是个什么神奇的东西。总结如下

  • Parcelable是Android独有提供的序列化接口,Serializable是Java提供的序列化接口,Parcelable只能在Android中使用,Serializable可以在使用Java语言的地方使用。
  • Serializable使用简单但是开销大,因为序列化过程需要大量的I/O操作。
  • Parcelable使用麻烦但是效率高,因为直接在内存中进行读写,内存的读写大于I/O。
  • Serializable一般是存储本地数据或者通过网络传输数据。
  • Parcelable一般在内存中使用,像Intent,Bundle传递数据。

5,startActivityForResult + setResult方式(Activity跳转之后还得返回数据/结果)

MainActivity像ActivityB发送数据

1
2
3
4
5
6
7
8
toB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, ActivityB.class);
intent.putExtra("data", "MainActivity像ActivityB传递数据");
startActivityForResult(intent, REQUESTCODE);
}
});

ActivityB获取从MainActivity得到的数据

1
getText = getIntent().getStringExtra("data");

ActivityB显示内容

1
text1.setText(getText);

ActivityB向MainActivity返回数据

1
2
3
4
5
6
7
8
9
toMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("data", "ActivityB向MainActivity返回数据");
setResult(RESULT_OK, intent);
finish();
}
});

MainActivity通过onActivityResult得到数据并显示

1
2
3
4
5
6
7
8
9
@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQUESTCODE){
text1.setText(data.getStringExtra("data"));
}
}
}

6、通过全局数据传递对象(Application)

如果某些数据需要长时间的保存,以便于程序随时调用,最好使用全局对象

MyAppliaction

1
2
3
4
5
6
7
8
9
10
public class Myappliaction extends Application {
private String username; //Myappliaction设置应用的全局变量
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}

清单文件

1
2
3
<application
android:name=".Myappliaction">

设置全局对象

1
2
3
4
5
public class MainActivity extends Activity {
application = (Myappliaction) getApplication();
application.setUsername("Daisy");
}

获取全局对象

1
2
3
4
5
public class OtherActivity extends Activity {
application = (Myappliaction) getApplication();
username = application.getUsername();
}