帮酷LOGO
0 0 评论
文章标签:Activiti  对象  act  


使用intent傳遞數據

  • 在activity之間傳遞簡單的數據類型(字元串,int,double...等等)很容易,我們可以使用唯一的鍵將它們放到Intent中,並將它發送到另一個Activity 。

  • 但是,在activity之間傳遞自定義對象時它有點複雜,這是使用serialization的原因。

什麼是序列化?

  • 序列化將數據快速,高效,內部表示轉換為可以保存在持久存儲中或通過網路傳輸的東西。

  • 將數據轉換為它序列化形式通常稱為marshaling ,將它轉換回它生存狀態,在內存表示中稱為反序列化或unmarshaling

有關序列化的更多信息- https://www.inkling.com/read/programming-android-mednieks-1st/chapter-6/serialization

  • 在android中,有兩種實現java對象marshalingunmarshaling的方法,
  1. Serializable(將對象序列化)
  2. Parcelable (將對象作為parcelable)

Serializable vs Parcelable

  • Serializable是一個標記介面,用戶不能根據它要求封送數據,因此當對象Serializable Java將自動序列化它。

  • Parcelable是android自己的序列化協議,在Parcelable中,開發人員編寫自定義代碼來封送和解析。 因此,與序列化相比,它創建較少的垃圾對象,

  • 由於Parcelable的自定義實現,所以,它的性能非常高,

  • 我們強烈推薦在android中序列化對象時使用Parcelable注入,

Parcelable對象

  • 當需要在activity之間傳遞自定義對象時,我們可以將對象標記為Parcelable (實現parcelable介面)。 然後使用intent.putExtra方法將對象放入到Intent中,

  • 下面是parcelable對象(User )的示例實現,

https://github.com/erangaeb/dev-notes/blob/master/android-parcelable/User.java

  • 這是一個簡單的對象,它可以,User對象實現為Parcelable 。

  • 有兩種方法可以從Parcelable介面describeContentswriteToParcel中,writeToParcel方法中的實際對象序列化。

/**
 * Define the kind of object that you gonna parcel,
 * You can use hashCode() here
 */
@Override
public int describeContents() {
 return 0;
}
/**
 * Actual object serialization happens here, Write object content
 * to parcel, reading should be done according to this write order
 * param dest - parcel
 * param flags - Additional flags about how the object should be written
 */
@Override
public void writeToParcel(Parcel dest, int flags) {
 dest.writeString(id);
 dest.writeString(username);
 dest.writeString(email);
 dest.writeString(password);
} 
  • 對象需要有Parcelable.Creator ,Android需要這個欄位來創建新對象,也可以單獨或作為數組,
/**
 * This field is needed for Android to be able to
 * create new objects, individually or as arrays
 *
 * If you don』t do that, Android framework will raises an exception
 * Parcelable protocol requires a Parcelable.Creator object 
 * called CREATOR
 */
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {

 public User createFromParcel(Parcel in) {
 return new User(in);
 }

 public User[] newArray(int size) {
 return new User[size];
 }
};
  • 這個用戶對象是一個簡單的parcelabel對象,可能有更複雜的對象,對於一個實例,你有一個引用另一個對象的對象。 在這種情況下,它們都需要是Parcelable

  • 下面是更複雜的parcelable對象(Sensor )的示例,

https://github.com/erangaeb/dev-notes/blob/master/android-parcelable/Sensor.java

  • Sensor對象包含幾個特殊欄位,
1. User object(user)
2. User list(sharedUsers)
3. boolean field(isMySensor)
  • 當將感測器的用戶對象寫入包時,它使用,
dest.writeParcelable(user, flags);
  • 從包讀取User對象時需要類裝入器,
this.user = in.readParcelable(User.class.getClassLoader());
  • 在將用戶列表(sharedUsers )寫入包時,它使用,
dest.writeTypedList(sharedUsers);
  • 從包讀取用戶列表(sharedUsers )時需要User.CREATOR實例,
this.sharedUsers = new ArrayList<User>();
in.readTypedList(sharedUsers, User.CREATOR);
  • 我們將它轉換為整數值,並且將它保存為整數(因為沒有任何方法直接向包寫入布爾值),而不是將布爾值寫入包,
dest.writeInt(isMySensor? 1 : 0);
  • 讀取布爾值時,我們從保存的整數中得到布爾值,
this.isMySensor = (in.readInt()!= 0);

將對象傳遞給

  • 在啟動Activity中,我們可以將parcelable對象設置為,
User user = new User(" 1" ," u" ," u" ," u" );
ArrayList<User> userList = new ArrayList<User>();
Sensor sensor = new Sensor(" 1" ," s" ," s" , true, user, userList);
intent.putExtra(" com.score.senzors.pojos.Sensor" , sensor);
  • 在目標Activity中,我們可以從Intent附加(綁定)獲取parcelable對象,
Bundle bundle = getIntent().getExtras();
Sensor sensor = bundle.getParcelable(" com.score.senzors.pojos.Sensor" )



文章标签:对象  act  Activiti  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语