Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后
的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让
一个类去实现Serializable 这个接口就可以了。
private ArrayList<Users> list = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList<Users>();
for (int i =0;i<10;i++){
Users users = new Users();
users.setName("jarry"+i);
users.setAge(12+i);
users.setSex("男");
list.add(users);
}
Intent intent = new Intent(this,NextActivity.class);
intent.putExtra("users_datas",list);
startActivity(intent);
NextActivity:
private ArrayList<Users> users = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
Intent intent = getIntent();
users = (ArrayList<Users>) intent.getSerializableExtra("users_datas");
for (int i =0;i<users.size();i++){
String name = users.get(i).getName();
int age = users.get(i).getAge();
String sex = users.get(i).getSex();
Log.d("NextActivity",name+","+age+","+sex);
}
}
实体类:
public class Users implements Serializable{
private String name;
private int age;
private String sex;
。。。。
}
Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都
是Intent 所支持的数据类型,这样也就实现传递对象的功能了。
Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让Person 类去实现了
Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中
describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel
的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方
法,整型数据就调用writeInt()方法,以此类推。
除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了
Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()
和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age
字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法
读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的
实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小
就可以了。
接下来在FirstActivity 中我们仍然可以使用相同的代码来传递Person 对象,只不过在
SecondActivity 中获取对象的时候需要稍加改动,如下所示:
Person person = (Person) getIntent().getParcelableExtra(“person_data”);
注意这里不再是调用getSerializableExtra()方法,而是调用getParcelableExtra()方法来获
取传递过来的对象了,其他的地方都完全相同。
这样我们就把使用Intent 来传递对象的两种实现方式都学习完了,对比一下,Serializable
的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable 方式低一
些,所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。
public class Users implements Parcelable {
private String name;
private int age;
private String sex;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
parcel.writeString(sex);
}
public static final Parcelable.Creator<Users> CREATOR = new Parcelable.Creator<Users>(){
@Override
public Users createFromParcel(Parcel parcel) {
Users person = new Users();
person.name = parcel.readString(); // 读取name
person.age = parcel.readInt();
person.sex = parcel.readString();
return person;
}
@Override
public Users[] newArray(int i) {
return new Users[i];
}
};
}
NextActivity:
users = intent.getParcelableArrayListExtra("users_datas");
欢迎关注我Github : @ 我的github