在應用中,可能會在當跳轉到另外一個Activity的時候需要傳遞資料過去,這時就可能用Bundle對象;
在MainActivity中,有一個導航至BActivity的Intent,
Intent
複製代碼 代碼如下:{
Intent intent = new Intent(Context context, Class<?> class);
//new一個Bundle對象,並將要傳遞的資料匯入,Bunde相當於Map<Key,Value>結構
Bundle bundle = new Bundle();
bundle.putString("name","Livingstone");
bundle.putXXX(XXXKey, XXXValue);
//將Bundle對象添加給Intent
intent.putExtras(bundle);
//調用intent對應的Activity
startActivity(intent);
}
在BActivity中,通過以下代碼擷取MainActivity所傳過來的資料
Bundle bundle = this.getIntent().getExtras();// 擷取傳遞過來的封裝了資料的Bundle
String name = bundle.getString("name");// 擷取name_Key對應的Value
// 擷取值時,添加進去的是什麼類型的擷取什麼類型的值
--> bundle.getXXX(XXXKey);
return XXXValue
上面講述的都是一般的基礎資料型別 (Elementary Data Type),當需要傳遞對象的時候,可以使該對象實現Parcelable或者是Serializable介面;
通過Bundle.putParcelable(Key,Obj)及Bundle.putSerializable(Key,Obj)方法將對象添加到Bundle中,再將此Bundle對象添加到Intent中!
在跳轉的目標頁面通過Intent.getParcelableExtra(Key)擷取實現了Parcelable的對象;
在跳轉的目標頁面通過Intent.getSerializableExtra(Key)擷取實現了Serializable的對象;
今天在研究的時候發現,Intent.putExtra(Key,Value);其實也可以傳遞資料,包括上面所講的對象!
實現Serializable介面很簡單,不再描述;
下面描述實現Parcelable介面:
複製代碼 代碼如下:public class Book implements Parcelable {
private String bookName;
private String author;
public static final Parcelable.Creator CREATOR = new Creator() {// 此處必須定義一個CREATOR成員變數,要不然會報錯!
@Override
public Book createFromParcel(Parcel source) {// 從Parcel中擷取資料,在擷取資料的時候需要通過此方法擷取對象執行個體
Book book = new Book();
book.setAuthor(source.readString());// 從Parcel讀取資料,讀取資料與寫入資料的順序一致!
book.setBookName(source.readString());
return book;
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override// 寫入Parcel
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(author);// 將資料寫入Parcel,寫入資料與讀取資料的順序一樣!
dest.writeString(bookName);
}
}
關於Parcel,大概查閱了一下描述:
一個final類,用於寫或讀各種資料,所有的方法不過就是writeValue(Object)和read(ClassLoader)!(個人翻譯理解)