代码改变世界

Android开发之使用Intent进行自定义类型数据传输

2013-12-27 15:01  y-z-f  阅读(5182)  评论(0编辑  收藏  举报

一、引言

    我相信一定有人想通过Intent传送自定义类型的数据,但是苦于无法找到putExtra(String name,Object value)这个方法,最后都会妥协,采用字典或者全局变量来

解决,但是你一定也看到了以下这个方法pubExtra(String name,Parcelable value),我相信那些懒惰的人们,可能会一概而过。却不曾想你错失了良机。下面我们将会

全面的介绍如何使用Parcelable(这个是接口,并不是一个类)

 

二、正文

      首先我们看下需要实现这个方法的哪些部分:

 

      其中只有writeToParcel方法是重点,因为这个方法就是将我们这个类的数据写入到Parcel中以便传递。但是这里告诉你一个悲剧的事情,那就是Parcel只有

writeXXXX(XXXX value),readXXXX() 方法,其中XXXX表示的是数据类型。这里要重点注意的是writeXXXX是没有name参数的,这就以为着你无法区分同一种类型数据

具体是什么。但是Parcel提供一个方法 setDataPosition(int pos) 方法。等同于可以切换当前添加数据的索引,就好比我们用了Parelable数组一样的效果,填充好

了一个Parelable的数据之后使用setDataPosition切换到下一索引继续填充数据。

 

         下面是一个示例:

 

      在这里我们这个类只有一个mData变量,并且在方法writeToParcel中将这个变量写到了Parcel中,但是到这里并没有结束。你可以简单的想想,这里我们仅仅将数据存到了Parcel中,

但是怎么恢复数据呢?因为最后Intent是通过Parcel类进行实际的数据传送,等传送到目的之后,当然还需要恢复,所以我们还要实现一个接收Parcel类的构造方法:

 

    到这里我们仅仅是入门了,如果你是有心人可以将鼠标点到这个类的名称部分会看到以下的提示:

 

    显然我们并没有好好的完成这个功能,我们还缺少一个CREATOR字段,当然要求创建这个字段并不是毫无意义的,而且对这个字段也

有要求,必须是Parcelable.Creator<T>类型,其中的T就是我们需要从Parcel转换到的目的类型。

 

     既然我们知道还缺少东西,下面我们就补全:

 

     这里需要讲述的是 writeToParcelcreateFromParcel 这两个方法,在实际传递过程中,当我们把这个自定义类型作为Intent的参数进行传

递时writeToParcel会被调用,意思就是告诉你可以将你的数据封装了,然后到了目的之后再通过调用createFromParcel将封装的数据再恢复回去。

这样就可以将数据的转换全部封装到数据类中,而无需以后在使用的过程中去转换。