第一行代碼-13.2 使用Intent傳遞對象

  使用Intent傳遞一般類型的數據比較簡單,只要通過intent.putExtra(key, value)就可以實現,但是怎麼傳遞自定義類型的數據,就需要使用一些技巧了。
  1、Serializable方式
  Serializable 是序列化的意思,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化後的對象可以在網絡上進行傳輸,也可以存儲到本地。至於序列化的方法也很簡單,只需要讓一個類去實現Serializable 這個接口就可以了。
  下面我們創建Student類,繼承Serializable。

public class Student implements Serializable{

    private String name;

    private String number;

    public void setName(String name) {
        this.name = name;
    } 

    public void setNumber(String number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public String getNumber() {
        return number;
    }

}

  然後就可以用Intent.putExtra來插入Student對象了:

mBSecondActivity.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        Student student = new Student();
        student.setName("Curry");
        student.setNumber("30");
        intent.putExtra("student_data", student);
        startActivity(intent);
    }
});  

  然後在SecondActivity中獲取這個Student對象:

Student student = (Student) getIntent().getSerializableExtra("student_data");

  2、Parcelable方式
  和Serializable方式不同在於,Parcelable 方式的實現原理是將一個完整的對象進行分解,而分解後的每一部分都是Intent 所支持的數據類型,這樣也就實現傳遞對象的功能了。但是它的實現過程比較複雜,下面先創建Person類,並繼承Parcelable接口。

public class Person implements Parcelable{

    private String name;

    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            Person person = new Person();
            person.setName(in.readString());
            person.setAge(in.readInt());
            return person;
        }

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

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

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

  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 作爲數組大小就可以了。
  在SecondActivity中獲取對象的方式差不多,如下:

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

  總結:雖然序列化的方式比較簡單,但是由於會將整個對象序列化,所以效率方面會比Parcelable方法低一些。所以在通常情況下還是更加推薦使用Parcelable 的方式來實現Intent 傳遞對象的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章