天天看點

Intent傳遞對象的兩種方法

Android為intent提供了兩種傳遞對象參數類型的方法

分别需要使實體類實作Serializable接口、Parcelable接口

首先我們要知道,傳遞對象,需要先将對象序列化

一、那麼為什麼要對象序列化

 1、永久性儲存對象,儲存對象的位元組序列到本地檔案中;

 2、用過序列化對象在網絡中、程序間傳遞對象;

二、序列化對象什麼時候實作Serializable接口,什麼時候實作Parcelable接口接口

1、Parcelable不能使用将資料存儲在磁盤上,因為Parcelable在外界有變化的情況下不能很好的儲存資料的持續性。

   是以在這種情況下,建議使用Serializable

2、在使用記憶體的時候,Parcelable比Serializable性能高,是以推薦使用Parcelable類。

     并且Serializable在序列化的時候會産生大量的臨時變量,進而引起頻繁的GC。

----------------------------------------------------------------------------------------------------------

下面看下兩種傳遞對象方式的使用方法

一、實體類繼承Serializable接口的方式

1、第一步,将我們需要傳送的對象所屬的實體類實作Serializable接口

1 package com.xqx.IntentDemo;
 2 
 3 import java.io.Serializable;
 4 
 5 /**
 6  * People實體類,含有 name,sex,age三個屬性  ,并實作類的封裝
 7  */
 8 public class People implements Serializable {
 9     private String name;
10     private String sex;
11     private int age;
12 
13     public String getName() {
14         return name;
15     }
16 
17     public String getSex() {
18         return sex;
19     }
20 
21     public int getAge() {
22         return age;
23     }
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     public void setSex(String sex) {
30         this.sex = sex;
31     }
32 
33     public void setAge(int age) {
34         this.age = age;
35     }
36 }      

2、傳遞資料步驟

       //建立Intent對象
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, NewActivity.class);
        //建立實體類
        People people = new People();
        people.setName("Mark");
        people.setSex("boy");
        people.setAge(20);
        //添加傳送資料
        intent.putExtra("people", people);
        startActivity(intent);      

3、接收資料

     Intent intent = getIntent();
        People people = (People) intent.getSerializableExtra("people");
        Log.i("DATA_SHOW","name-->"+people.getName()+",sex-->"+people.getSex()+",age-->"+people.getAge());      

4、Log列印

15794-15794/? I/DATA_SHOW﹕ name-->Mark,sex-->boy,age-->20      

二、實體類繼承Parcelable接口的方式

1、實體類實作Parcelable接口

public class Student implements Parcelable {}      

重寫接口的兩個方法

@Override
    public int describeContents() {
        return 0;
    }
     
    // 将對象的需要傳遞的屬性 以 Parcel parcel.writXxx的形式寫出,具體看屬性的類型
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeString(sex);
        parcel.writeInt(age);
    }      

添加一個常量CREATOR(名字大小必須固定),該常量必須實作Parcelable的内部接口:Parcelable.Creator,并實作該接口中的兩個方法

public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {

        @Override
        public Student createFromParcel(Parcel source) {
            Student student = new Student();
            student.name = source.readString();
            student.sex = source.readString();
            student.age = source.readInt();
            return student;
        }

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

2、傳遞資料

     Intent intent = new Intent();
        intent.setClass(MainActivity.this, NewActivity.class);
        Student student = new Student();
        student.setName("Alice");
        student.setSex("girl");
        student.setAge(19);
        intent.putExtra("student",student);
        startActivity(intent);      
     Intent intent = getIntent();
        Student student = intent.getParcelableExtra("student");
        Log.i("DATA_SHOW","name-->"+student.getName()+",sex-->"+student.getSex()+",age-->"+student.getAge());      

4、Log日志

1280-1280/? I/DATA_SHOW﹕ name-->Alice,sex-->girl,age-->19      

繼續閱讀