使用 Intent传递对象(Parcelable方式)

package utils;

import android.os.Parcel;
import android.os.Parcelable;

public class PersonParcelable implements Parcelable {
    private String name;
    private int age;

    public PersonParcelable() {
        super();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);//写出name
        dest.writeInt(age);//写出age
    }

    public static final Creator CREATOR = new Creator() {
        @Override
        public PersonParcelable createFromParcel(Parcel source) {
            PersonParcelable person = new PersonParcelable();
            person.name = source.readString();//读取name
            person.age = source.readInt();//读取age
            return person;
        }

        @Override
        public PersonParcelable[] newArray(int size) {
            return new PersonParcelable[size];
        }
    };
}

Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让 Person 类去实现了 Parcelable 接口,这样

就必须重写 describeContents()和 writeToParcel()这两个方法。其中 describeContents()方法直接返回 0

就可以了,而 writeToParcel()方法中我们需要调用 Parcel 的 writeXxx()方法将 Person类中的字段一一写

出。注意字符串型数据就调用 writeString()方 法,整型数据就调用 writeInt()方法,以此类推。

除此之外,我们还必须在 Person 类中提供一个名为 CREATOR 的常量,这里创建了 Parcelable.Creator接

口的一个实现,并将泛型指定为 Person。接着需要重写 createFromParcel() 和 newArray()这两个方法,

在 createFromParcel()方法中我们要去读取刚才写出的 name和 age 字段,并创建一个 Person对象进行返

回,其中 name和 age都是调用 Parcel的 readXxx()方法 读取到的,注意这里读取的顺序一定要和刚才写出

的顺序完全相同。而 newArray()方法中的 实现就简单多了,只需要 new出一个 Person数组,并使用方法

中传入的 size作为数组大小 就可以了。

接下来在 主Activity 中我们仍然可以使用相同的代码来传递 Person 对象,只不过在 另外一个Activity中获

取对象的时候需要稍加改动,如下所示:

Person person = (Person) getIntent().getParcelableExtra("person_data"); 

注意这里不再是调用 getSerializableExtra()方法,而是调用 getParcelableExtra()方法来获 取传递过来的对

象了,其他的地方都完全相同。

你可能感兴趣的:(Android基础)