Android中Intent是用来实现组件之间的通信的,可以在组件之间传递数据。可以传递一些基本类型的数据,也可以传递自定义对象类型的数据,但是如果要传递自定义类型的对象数据,这个自定义类型的对象必须是实现了Serializable接口或者是实现Parcelable接口。
1.实现Serializable接口的对象
实现Serializable接口非常简单,Serializable接口中没有需要实现的函 数。直接使用implements关健字即可,无需其他操作。
public class User implements Serializable{
private int id;
private String name;
public User(){
}
public User(int id,String name){
this.id=id;
this.name=name;
}
public void setId(int id ){
this.id=id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
上述代码就是定义了一个实现了Serializable接口的User对象,这个User对象就可以被Intent中传递。
传递该对象类型的数据
User user=new User(1,"张三");
intent.putExtra("user",user);
获取该对象类型的数据
getIntent().getSerializableExtra("user");
2.实现Parcelable接口的对象
实现Parcelable接口步骤:
(1)重写describeContents方法,默认返回0就可以。
(2)重写writeToParcel方法。
(3)实例化静态内部类对象CREATOR
public class User implements Parcelable{
private int id;
private String name;
public User(){
}
public User(int id,String name){
this.id=id;
this.name=name;
}
public void setId(int id ){
this.id=id;
}
public int getId(){
return id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
public int describeContents(){
return 0;
}
public void writeToParcel(Parcel out,int flags ){
out.writeInt(id);
out.writeString(name);
/* 一定要按照成员变量声明的顺序来打包数据(写数据)*/
}
public static final Parcelable.Creaator<User>
CREATOR=new Parcelbale.Creator<User>(){
/*返回实现Parcelable接口的单个实例*/
public User createFromParcel(Parcel source){
User user=new User();
user.setId(source.readInt());
user.setName(source.readString());
return user;
/*一定要按照成员变量声明的顺序来读数据*/
}
/*返回实现Parcelable接口的多个实例*/
public User[] newArray(int size){
return new User[size];
}
}
}
上述代码是定义了一个实现Parcelable接口的对象,这个User对象也可以被Intent传递。
传递对象类型的数据
User user=new User(1,"张三");
intent.putExtra("user",user);
获取该对象类型的数据
getIntent().getParcelableExtra("user");
实际上让对象实现Serializable接口和Parcelbale接口就是实现对象的序列化。
对象的序列化:把对象数据转成字节序列的过程就称之为对象的序列化。
对象的反序列化:把字节序列恢复成对象数据的过程就是反序列化。
对象序列化的目的:
(1)实现对象数据的持久化 ,就是把对象数据保存到文件、数据库中。
(2)在网络中、程序内部以及程序间传输对象数据。
这两种实现对象序列化方式的比较:
Parcelable的性能要比Serializable好,内存开销小,一般用于内存间数据的传输。如Activity间数据的传输。
Serializable主要用于对象数据的持久化以及网络间对象数据的传输。