对于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); }
转自:http://www.cnblogs.com/carlosk/archive/2012/09/28/2707521.html |