Andorid學習之路(七)之 Serializable接口和Parcelable接口

Activity之間的數據傳輸

activity之間的數據傳輸我們可以通過Intent對象的putExtra方法,通過這個可以傳輸很多不同類型的數據,比如說字符串、整數、實數、對象等。

首先以一個字符串舉例來說一下:

通過putExtra傳輸字符串可以通過如下方法:

putExtra(String name, String value):intent

第一個參數爲用來讓接收數據的activity辨別的字符串,相當於HashMap中的索引值。

第二個爲要發送的數據(這裏是字符串)。

在目標activity中通過這個name來找到這個value。

當前activity中:

String str = "你好";
intent.putExtra("data", str);

目標activity中:

Bundle bundle = getIntent().getExtras();
String str = bundle.getString("data");

上面只是簡單的說明一下如何傳輸字符串。

那麼如何傳輸對象呢?這貨比較特殊,不能像putExtra("data", Object)這樣進行傳輸,沒有這種方法。

在重載方法中可以找到兩個比較特殊的方法:

putExtra(String name, Serializable value):intent

putExtra(String name, Parcelable value):intent

Serializable和Parcelable分別是兩個接口,那麼要傳輸對象,則只需要使得類實現這兩個接口之一就行了。

我們先來看一下Serializable實現,創建一個類Obj並且實現該接口:

import java.io.Serializable;

public class Obj implements Serializable{
	private String name;

	public String getName() {
		return name;
	}

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

當前activity:

Obj obj = new Obj();
obj.setName("李剛");
intent.putExtra("data", obj);

目標activity:

Bundle bundle = getIntent().getExtras();
Obj obj = (Obj) bundle.get("data");
String name = obj.getName();

再來看一下Parcelable實現,創建一個類Obj2並且實現該接口:

import android.os.Parcel;
import android.os.Parcelable;

public class Obj2 implements Parcelable{

	private String name;
	private String age;
	
	public String getName() {
		return name;
	}

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

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}
	
	@Override
	public int describeContents() {
		return 0;
	}

	/*
	 * 創建CREATOR常量(必須要這樣做)
	 * */
	public static Parcelable.Creator<Obj2> CREATOR = new Creator<Obj2>() {
		
		@Override
		public Obj2[] newArray(int size) {
			return null;
		}
		
		/*
		 * 重寫createFromParcel方法
		 * */
		@Override
		public Obj2 createFromParcel(Parcel source) {
			//通過讀取Parcel類對象的屬性,來set當前類的屬性
			Obj2 obj2 = new Obj2();
			obj2.setName(source.readString());
			obj2.setAge(source.readString());
			return obj2;
		}
	};
	
	/*將對象屬性保存到Parcel類對象中*/
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeString(name);
		dest.writeString(age);
	}
}

看起來是不是要比實現Serializable接口要複雜的多?但是這種方法要好多的,主要是該方法速度快,性能好(一般用這種)。

當前activity:

Obj2 obj2 = new Obj2();
obj2.setName("李剛");
obj2.setAge("38歲");
intent.putExtra("s1", obj2);

目標activity:

Bundle bundle = getIntent().getExtras();
Obj2 obj2 = (Obj2) bundle.get("s1");
String name = obj2.getName();
String age = obj2.getAge();

以上就是兩種實現對象傳輸的方法。


THE END~



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