1. 程式人生 > >Android中Intent傳遞自定義物件型別的資料

Android中Intent傳遞自定義物件型別的資料

Android中Intent是用來實現元件之間的通訊的,可以在元件之間傳遞資料。可以傳遞一些基本型別的資料,也可以傳遞自定義物件型別的資料,但是如果要傳遞自定義型別的物件資料,這個自定義型別的物件必須是實現了Serializable介面或者是實現Parcelable介面。

1.實現Serializable介面的物件
實現Serializable介面非常簡單,Serializable介面中沒有需要實現的函 數。直接使用implements關健字即可,無需其他操作。

      public class User implements Serializable{
      private
int id; private String name; public User(){ } public User(int id,String name){ this.id=id; this.name=name; } public void setId(int id ){ this.id=id; } public int getId(){ return id; } public void
setName(String name){ this.name=name; } public String getName(){ return name; } }

上述程式碼就是定義了一個實現了Serializable介面的User物件,這個User物件就可以被Intent中傳遞。

傳遞該物件型別的資料

User  user=new User(1,"張三");
intent.putExtra("user",user);

獲取該物件型別的資料

getIntent().getSerializableExtra
("user");

2.實現Parcelable介面的物件
實現Parcelable介面步驟:
(1)重寫describeContents方法,預設返回0就可以。
(2)重寫writeToParcel方法。
(3)例項化靜態內部類物件CREATOR

public class User implements Parcelable{
 private int id;
      private String name;
      public  User(){
      }
      public User(int id,String name){
         this.id=id;
         this.name=name; 
      }
      public void setId(int id ){
         this.id=id;
        } 
      public int getId(){
            return id;
          }
      public void setName(String name){
           this.name=name;
         }      
      public String getName(){
           return name;
         }   
     }
     public int describeContents(){
         return 0;
      }
     public void writeToParcel(Parcel out,int flags ){
         out.writeInt(id);
         out.writeString(name);
         /* 一定要按照成員變數宣告的順序來打包資料(寫資料)*/
      }
     public static final Parcelable.Creaator<User>
     CREATOR=new Parcelbale.Creator<User>(){
     /*返回實現Parcelable介面的單個例項*/
     public User createFromParcel(Parcel source){
           User user=new User();
               user.setId(source.readInt());
               user.setName(source.readString());
               return user;
               /*一定要按照成員變數宣告的順序來讀資料*/
     }
     /*返回實現Parcelable介面的多個例項*/
     public User[] newArray(int size){
               return new User[size];
     }
}
}

上述程式碼是定義了一個實現Parcelable介面的物件,這個User物件也可以被Intent傳遞。

傳遞物件型別的資料

User user=new User(1,"張三");
intent.putExtra("user",user);

獲取該物件型別的資料

getIntent().getParcelableExtra("user");

實際上讓物件實現Serializable介面和Parcelbale介面就是實現物件的序列化。

物件的序列化:把物件資料轉成位元組序列的過程就稱之為物件的序列化。
物件的反序列化:把位元組序列恢復成物件資料的過程就是反序列化。

物件序列化的目的:
(1)實現物件資料的持久化 ,就是把物件資料儲存到檔案、資料庫中。
(2)在網路中、程式內部以及程式間傳輸物件資料。

這兩種實現物件序列化方式的比較:
Parcelable的效能要比Serializable好,記憶體開銷小,一般用於記憶體間資料的傳輸。如Activity間資料的傳輸。
Serializable主要用於物件資料的持久化以及網路間物件資料的傳輸。