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);
 
     
 
     }


转自:http://www.cnblogs.com/carlosk/archive/2012/09/28/2707521.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值