Parcelable心得
对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的。 Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java
SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在进程间通信(IPC)中。实现Serializable接口非常简单,声明一下就可以了。而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
Parcelable接口的作用:实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态。
Parcel用来完成数据的序列化传递。
通过实现Parcelable接口序列化对象的步骤:
1、实现Parcelable接口。
2、并且实现Parcelable接口的public
void writeToParcel(Parcel dest, int flags)方法 。
3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。
简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。
下面是实例代码:
public
class
Person
implements
Parcelable {
public
static
final
Parcelable.Creator<Person> CREATOR =
new
Creator<Person>() {
@Override
public
Person[] newArray(
int
size) {
return
null
;
}
@Override
public
Person createFromParcel(Parcel source) {
Person result =
new
Person();
result.age = source.readInt();
result.name = source.readString();
result.address = source.readParcelable(Address.
class
.getClassLoader());
return
result;
}
};
private
Address address;
private
String name;
private
int
age;
@Override
public
int
describeContents() {
return
0
;
}
public
Address getAddress() {
return
address;
}
public
void
setAddress(Address address) {
this
.address = address;
}
@Override
public
void
writeToParcel(Parcel dest,
int
flags) {
dest.writeInt(age);
dest.writeString(name);
dest.writeParcelable(address, PARCELABLE_WRITE_RETURN_VALUE);
}
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;
}
@Override
public
String toString() {
return
"Person [address="
+ address +
", name="
+ name +
", age="
+ age
+
"]"
;
}
}
|
最后在使用的时候可以用
intent.putExtra,直接存入Parce
最后说明一下,官方的文档里说在不同进程之间使用Parce,在同进程内使用Bind,但在我测试的时候发现,不管是activity之间的传递,还是activit到service到broadcast,都是可以用Parce的
public
void
sendBroadCast(View viwe){
Log.d(
"test"
,Thread.currentThread().getName()+
"发送了一个消息给广播"
);
Person person =
new
Person();
person.setAge(
18
);
Address address =
new
Address();
address.setStreet(
"延陵南路"
);
person.setName(
"carlos"
);
person.setAddress(address);
// Intent intent = new Intent("aaaa");
Intent intent =
new
Intent(
"aaaa"
);
intent.setClass(
this
, SendActivity.
class
);
// intent.putParcelableArrayListExtra(name, value)
intent.putExtra(
"person"
, person);
// sendBroadcast(intent);
startActivity(intent);
}
|