在android的Intent中,我可能要传递一些复杂的数据类型,如list<T>、或者自己定义的实体类,我们不能像传递String、int一样传递它。这时候我们应该把自定义的类型序列化。有两种方式来实现序列化,一种是实现Serializable接口,一种是实现Parcelable接口。两者的区别:实现Serializable比较简单,实体类直接implements Serializable即可;Parcelable接口使用稍微复杂,但是代码运行效率更优秀,提高代码性能。本篇主要讲怎样实现类的Parcelable
参考文章:http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0204/3944.html
Parcelable的源码:
public interface Parcelable {
public static final int PARCELABLE_WRITE_RETURN_VALUE = 0x0001;
public static final int CONTENTS_FILE_DESCRIPTOR = 0x0001;
//内容描述方法,可以不看
public int describeContents();
//相当于将实体类写入Parcel方法,
public void writeToParcel(Parcel dest, int flags);
//读取接口
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
}
Parcelable使用步骤
1. implements Parcelable 实现Parcelable的方法
2.重写writeToParel方法,将实体类的参数写入
3.重写describeContentes方法,默认返回0即可
4.实例化静态内部对象CREATOR实现接口Parcelable.Creator
理解:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象,也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,再通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。
Parcelable示例:
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by 4 on 2016/4/6.
*/
public class Student implements Parcelable{
private String name;
private int age;
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 int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
private static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>(){
@Override
public Student createFromParcel(Parcel source) {
return new Student(source);
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
protected Student(Parcel parcel){
this.name = parcel.readString();
this.age = parcel.readInt();
}
}
在Android Studio中可以快速实现对象的Parcelable化
1.安装Android Parcelable code generator插件
打开File ---> Settings ---> Plugins ---> Browse repositories...
重启Android studio,显示下图,则说明安装成功
使用插件Parcelable化对象,右键对象空白处,选择 Generate(生成)---->Parcelable--->OK
生成的代码:
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by 4 on 2016/4/5.
*/
public class Book implements Parcelable {
private String bookName;
private int bookNum;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public int getBookNum() {
return bookNum;
}
public void setBookNum(int bookNum) {
this.bookNum = bookNum;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.bookName);
dest.writeInt(this.bookNum);
}
public Book() {
}
protected Book(Parcel in) {
this.bookName = in.readString();
this.bookNum = in.readInt();
}
public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
@Override
public Book createFromParcel(Parcel source) {
return new Book(source);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
}