关于Activity之间利用Intent传输数据的操作应该很了解了吧,不外乎就是现在ActivityA中新建一个Intent变量,用.putExtra(string name,string/int/boolean value)将数据传入其中,然后将这个intent作为.startActivity(Intent intent)的变量来启动ActivityB,在Activity中用getIntent().getStringExtra/getIntExtra/getBooleanExtra(string name)来获取参数即可,但是假如我需要传送的是一个自定义类的变量呢?Serializable和Parcelable就是用于解决这个问题的。
首先接收Serializable,这个英文的翻译是“序列化”的意思,顾名思义就是将对象转换成可传输的状态,要使用这个方法很简单,只需要在写自定义类的时候,让这个类实现Serializable这个接口即可,这个接口不要求重写任何方法,接着在ActivityA中还是同样的方式把自定义类的变量传入,启动ActivityB,这里开始有点不同,比方说自定义类的类名是Person的话,获取传输来的变量这么写:
Person person=(Person) getIntent().getSerializableExtra(String name)
可以看到,首先是需要强转为Person类,然后用的是.getSerializableExtra()方法来获取。这个方法使用起来非常简便,但是因为需要将变量进行序列化之后再传输,在效率上是有点打折扣的,于是有了Parcelable。
Parcelable相对来讲就麻烦得多了,首先还是先将自定义类实现Parcelable接口,这个接口需要重写两个方法,describeContents()方法只需要写return 0;即可,writeToParcel(Parcel dest,int flages)里面,需要把这个类的属性写入,dest.writeString/writeInt/writeBoolean()将这个类有的属性都依次写入进去。接着还需要提供一个名为CREATOR的常量,一般我们这么写:
public static final Parcelable.Creator<类名> CREATOR = new Parcelable.Creator<类名>(){
@override
public 类名 createFromParcel(Parcel source){
类名 A=new 类名();
A.属性1=source.readString/readInt/readBoolean();
...............
return A;}
@override
public 类名[] newArray(int size){
return new 类名[size];}
这是这个接口要求加入的,按照要求写即可,这里需要注意的一点是,在createFromPacel中,为每一个属性赋值的时候,你可能疑惑如果属性里面有多个string,我怎么知道获取的是不是这个属性?有没有ID标识。答案是这里需要按照你在writeToPacel()中写入的顺序读取。
之后的传入方法是一样的,在ActivityB中的读取方法就变成了.getParcelableExtra()而已。