什么是Parcelable ?

Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

Parcelable 传递对象

Android序列化对象主要有两种方法:

1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的;

2.实现Parcelable接口,Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),

除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。

Parcelable接口定义

[java] view plain copy print ?
  1. publicinterfaceParcelable{
  2. //内容描述接口,基本不用管
  3. publicintdescribeContents();
  4. //写入接口函数,打包
  5. publicvoidwriteToParcel(Parceldest,intflags);
  6. //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
  7. //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
  8. publicinterfaceCreator<T>{
  9. publicTcreateFromParcel(Parcelsource);
  10. publicT[]newArray(intsize);
  11. }

实现Parcelable接口?

从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法:

1.describeContents方法。内容接口描述,默认返回0就可以;

2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

3.静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in) 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

代码实现

1.封装数据,把实现parcelable接口的Person对象传递到TwoActivity里;

[java] view plain copy print ?
  1. publicclassDemoActivityextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. //封装数据
  8. Personp=newPerson();
  9. p.setId(1);
  10. p.setName("xiaoming");
  11. //用Intent传递Person对象
  12. Intenti=newIntent(this,TwoActivity.class);
  13. i.putExtra("Person",p);
  14. startActivity(i);
  15. }
  16. }
2.TwoActivity获取数据,从DemoActivity传递的Person对象给解析,并打印;
[java] view plain copy print ?
  1. publicclassTwoActivityextendsActivity{
  2. @Override
  3. protectedvoidonCreate(BundlesavedInstanceState){
  4. //TODOAuto-generatedmethodstub
  5. super.onCreate(savedInstanceState);
  6. Personp=(Person)getIntent().getParcelableExtra("Person");
  7. System.out.println("p_id"+p.getId());
  8. System.out.println("p_name"+p.getName());
  9. }
  10. }

3.parcelable接口的实现

[java] view plain copy print ?
  1. publicclassPersonimplementsParcelable{
  2. //成员变量
  3. privateintid;
  4. privateStringname;
  5. //1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
  6. //android.os.BadParcelableException:
  7. //ParcelableprotocolrequiresaParcelable.CreatorobjectcalledCREATORonclasscom.um.demo.Person
  8. //2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
  9. //3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
  10. //4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
  11. //5.反序列化对象
  12. publicstaticfinalParcelable.Creator<Person>CREATOR=newCreator(){
  13. @Override
  14. publicPersoncreateFromParcel(Parcelsource){
  15. //TODOAuto-generatedmethodstub
  16. //必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
  17. Personp=newPerson();
  18. p.setId(source.readInt());
  19. p.setName(source.readString());
  20. returnp;
  21. }
  22. @Override
  23. publicPerson[]newArray(intsize){
  24. //TODOAuto-generatedmethodstub
  25. returnnewPerson[size];
  26. }
  27. };
  28. publicintgetId(){
  29. returnid;
  30. }
  31. publicvoidsetId(intid){
  32. this.id=id;
  33. }
  34. publicStringgetName(){
  35. returnname;
  36. }
  37. publicvoidsetName(Stringname){
  38. this.name=name;
  39. }
  40. @Override
  41. publicintdescribeContents(){
  42. //TODOAuto-generatedmethodstub
  43. return0;
  44. }
  45. @Override
  46. publicvoidwriteToParcel(Parceldest,intflags){
  47. //TODOAuto-generatedmethodstub
  48. //1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错
  49. //2.序列化对象
  50. dest.writeInt(id);
  51. dest.writeString(name);
  52. }
  53. }

更多相关文章

  1. 用Kotlin实现Android点击事件
  2. Android――ContentProvider (一)创建contentProvider
  3. Android柱状图MPAndroidChart使用
  4. android SQLite 的使用
  5. Android开发-面向对象的数据库Db4o
  6. android Sqlite数据库事务处理*.sql 语句集文件
  7. Android(安卓)系统CPU,RAM,ROM,SDCard,MAC等信息查询
  8. Android(安卓)gradle编译指令(implementation、api、provided 等)
  9. 《二》Android(安卓)数据库 SQlite SQLiteOpenHelper

随机推荐

  1. [Android] 图片裁剪总结——调用系统裁剪
  2. Android中的数据传递之Parcelable接口
  3. Android必备:Activity 活动 和 Intent 意
  4. Android 开发一定要看的15个实战项目
  5. Android文件操作中的openFileOutPut和ope
  6. Android Animation学习
  7. Android Afinal使用与总结
  8. Android入门 — 模拟器的创建和运行
  9. android 开发
  10. MobSF安装使用及过程中遇到的错误