intent 的用法相信你已經比較熟悉了,我們可以借助它來啟動活動、傳送廣播、啟動服務等。在進行上述操作的時候,我們還可以在intent 中新增一些附加資料,以達到傳值的效果,比如在firstactivity 中新增如下**:
intent intent = new intent(firstactivity.this, secondactivity.class);
intent.putextra("string_data", "hello");
intent.putextra("int_data", 100);
startactivity(intent);
這裡呼叫了intent 的putextra()方法來新增要傳遞的資料,之後在secondactivity 中就可以得到這些值了,**如下所示:
getintent().getstringextra("string_data");
getintent().getintextra("int_data", 0);
但是不知道你有沒有發現,putextra()方法中所支援的資料型別是有限的,雖然常用的一些資料型別它都會支援,但是當你想去傳遞一些自定義物件的時候就會發現無從下手。不用
擔心,下面我們就學習一下使用intent 來傳遞物件的技巧。
serializable 方式
使用intent 來傳遞物件通常有兩種實現方式,serializable 和parcelable,先來學習一下第一種的實現方式。serializable 是序列化的意思,表示將乙個物件轉換成可儲存或可傳輸的狀態。序列化後的物件可以在網路上進行傳輸,也可以儲存到本地。至於序列化的方法也很簡單,只需要讓乙個類去實現serializable 這個介面就可以了。比如說有乙個person 類,其中包含了name 和age 這兩個字段,想要將它序列化就可以這樣寫:
public class person implements serializable
public void setname(string name)
public int getage()
public void setage(int age)
}
其中get、set 方法都是用於賦值和讀取字段資料的,最重要的部分是在第一行。這裡讓person 類去實現了serializable 介面,這樣所有的person 物件就都是可序列化的了。
接下來在firstactivity 中的寫法非常簡單:
person person = new person();
person.setname("tom");
person.setage(20);
intent intent = new intent(firstactivity.this, secondactivity.class);
intent.putextra("person_data", person);
startactivity(intent);
可以看到,這裡我們建立了乙個person 的例項,然後就直接將它傳入到putextra()方法中了。由於person 類實現了serializable 介面,所以才可以這樣寫。接下來在secondactivity 中獲取這個物件也很簡單,寫法如下:
person person = (person) getintent().getserializableextra("person_data");
這裡呼叫了getserializableextra()方法來獲取通過引數傳遞過來的序列化物件,接著再將它向下轉型成person 物件,這樣我們就成功實現了使用intent 來傳遞物件的功能了。
parcelable 方式
除了serializable 之外,使用parcelable 也可以實現相同的效果,不過不同於將物件進行
序列化,parcelable 方式的實現原理是將乙個完整的物件進行分解,而分解後的每一部分都
是intent 所支援的資料型別,這樣也就實現傳遞物件的功能了。
下面我們來看一下parcelable 的實現方式,修改person 中的**,如下所示:
public class person implements parcelable
@override
public void writetoparcel(parcel dest, int flags)
public static final parcelable.creatorcreator = new parcelable.creator()
@override
public person newarray(int size)
};}
parcelable 的實現方式要稍微複雜一些。可以看到,首先我們讓person 類去實現了parcelable 介面,這樣就必須重寫describecontents()和writetoparcel()這兩個方法。其中
describecontents()方法直接返回0 就可以了,而writetoparcel()方法中我們需要呼叫parcel的write***()方法將person 類中的字段一一寫出。注意字串型資料就呼叫writestring()方法,整型資料就呼叫writeint()方法,以此類推。除此之外,我們還必須在person 類中提供乙個名為creator 的常量,這裡建立了parcelable.creator 介面的乙個實現,並將泛型指定為person。接著需要重寫createfromparcel()和newarray()這兩個方法,在createfromparcel()方法中我們要去讀取剛才寫出的name 和age欄位,並建立乙個person 物件進行返回,其中name 和age 都是呼叫parcel 的read***()方法讀取到的,注意這裡讀取的順序一定要和剛才寫出的順序完全相同。而newarray()方法中的實現就簡單多了,只需要new 出乙個person 陣列,並使用方法中傳入的size 作為陣列大小就可以了。接下來在firstactivity 中我們仍然可以使用相同的**來傳遞person 物件,只不過在secondactivity 中獲取物件的時候需要稍加改動,如下所示:
person person = (person) getintent().getparcelableextra("person_data");
注意這裡不再是呼叫getserializableextra()方法,而是呼叫getparcelableextra()方法來獲取傳遞過來的物件了,其他的地方都完全相同。這樣我們就把使用intent 來傳遞物件的兩種實現方式都學習完了,對比一下,serializable的方式較為簡單,但由於會把整個物件進行序列化,因此效率方面會比parcelable 方式低一些,所以在通常情況下還是更加推薦使用parcelable 的方式來實現intent 傳遞物件的功能。
Intent傳遞物件
serializable即序列化,將物件轉化成可儲存與傳輸狀態。public class student implements serializable public string getid public void setname name public string getname public...
使用Intent傳遞物件 兩種
平常我們可以在intent中新增一些資料,帶到下乙個介面,就像這樣 在第乙個頁面把資料裝進intent intent intent new intent firstactivity.this,secondactivity.class intent.putextra data1 hello inten...
使用Intent傳遞資料
我們先重點講解如何使用intent在多個activity之間傳遞資料,根據前面的介紹我們應該已經清楚,要從activity1傳遞資料到activity2重點是startactivity 和startactivityforresult 兩個方法。1.無引數activity跳轉 intent it ne...