您好,登錄后才能下訂單哦!
android開發(fā)中,我們的Activity之間總避免不了進行數(shù)據(jù)的傳遞,幾種傳遞方式大致如下,各有各的用處:
1、Intent攜帶簡單的數(shù)據(jù)
Intent intent=new Intent(); Bundle bundle=new Bundle(); bundle.putString("username","Mary"); bundle.putInt("age",23); intent.putExtras(bundle);
參數(shù)接收:
Bundle bundle=getIntent().getExtras(); String username=bundle.getString("username"); int age=bundle.getInt("age");
2、Intent攜帶例如ArrayList之類復(fù)雜的數(shù)據(jù)
注意:在傳參數(shù)前,要用新增加一個List將對象包起來
初始化數(shù)據(jù):
Map<String,String> map=new HashMap<String,String>(); map.put("aaa","hello"); map.put("bbb","world"); List<Map<String,String>> list=new ArrayList<Map<String,String>>(); list.add(map); Intent intent=new Intent(); Bundle bundle=new Bundle(); //須定義一個list用于在bundle中傳遞需要傳遞的List<Object>,這個是必須要的 ArrayList bundleList=new ArrayList(); bundleList.add(list); bundle.putParcelableArrayList("list",bundleList); intent.putExtras(bundle);
參數(shù)接收:
Bundle bundle=getIntent().getExtras(); List bundleList=bundle.getParcelbleArrayList("list"); List<Map<String,String>> list=(List<Map<String,String>>)bundleList.get(0); //遍歷輸出
3、通過實現(xiàn)Serializable接口傳遞參數(shù)
初始化數(shù)據(jù):
Map<String,String> map=new HashMap<String,String>(); map.put("aaa","hello"); map.put("bbb","world"); Bundle bundle=new Bundle(); bundle.putSerializable("map",map); Intent intent=new Intent(); intent.putExtras(bundle);
參數(shù)接收:
Bundle bundle=getIntent().getExtras(); //HashMap沒問題 //LinkedHashMap,轉(zhuǎn)換時會拋出ClassCastException,何解 Map<String,String> map=(Map<String,String>)bundle.getSerializable("map"); //遍歷輸出
4、通過實現(xiàn)Parcelable接口,把要傳的數(shù)據(jù)打包在里面,然后在接收端自己分解出來。這個是Android獨有的,在其本身的源碼中也用得很多,效率要比Serializable相對要好。
Parcelable實現(xiàn)要點:需要實現(xiàn)三個東西
1)writeToParcel 方法。該方法將類的數(shù)據(jù)寫入外部提供的Parcel中.聲明如下:
writeToParcel (Parcel dest, int flags) 具體參數(shù)含義見javadoc
2)describeContents方法。沒搞懂有什么用,反正直接返回0也可以
3)靜態(tài)的Parcelable.Creator接口,本接口有兩個方法:
createFromParcel(Parcel in) 實現(xiàn)從in中創(chuàng)建出類的實例的功能
newArray(int size) 創(chuàng)建一個類型為T,長度為size的數(shù)組,僅一句話(return new T[size])即可。估計本方法是供外部類反序列化本類數(shù)組使用。
定義一個DataParcelable實現(xiàn)Parcelable接口,將要傳輸?shù)臄?shù)據(jù)定義在這個類里面:
package com.xin.activity; import java.util.HashMap; import java.util.Map; import android.os.Parcel; import android.os.Parcelable; public class DataParcelable implements Parcelable{ //定義要被傳輸?shù)臄?shù)據(jù) public int age; public String username; public String password; public Map<String,String> map=new HashMap<String,String>(); @Override public int describeContents() { return 0; } /** * 類的數(shù)據(jù)寫入外部提供的Parcel */ @Override public void writeToParcel(Parcel out, int flags) { //將數(shù)據(jù)映射到Parcel中去 out.writeInt(age); out.writeString(username); out.writeString(password); out.writeMap(map); } public static final Parcelable.Creator<DataParcelable> CREATOR=new Parcelable.Creator<DataParcelable>() { /** * 創(chuàng)建出類的實例 */ @SuppressWarnings("unchecked") @Override public DataParcelable createFromParcel(Parcel in) { DataParcelable data=new DataParcelable(); //將映射在Parcel對象中的數(shù)據(jù)還原出來 //這里的順序一定要和writeToParcel中定義的順序一致才行 data.age=in.readInt(); data.username=in.readString(); data.password=in.readString(); data.map=in.readHashMap(HashMap.class.getClassLoader()); return data; } @Override public DataParcelable[] newArray(int size) { return new DataParcelable[size]; } }; }
注意上面方法中createFromParcel讀取的順序要和writeToParcel寫入的順序一致才行,這樣才能保證相同數(shù)據(jù)類型的數(shù)據(jù)能夠按順序被讀取出來!里面是這樣的一個設(shè)計機制.
初始化DataParcelable數(shù)據(jù)并將其放到Intent對象中去:
Intent intent=new Intent(MainActivity.this,OtherActivity.class); DataParcelable data=new DataParcelable(); data.age=23; data.username="hello"; data.password="world"; data.map=new HashMap<String,String>(); data.map.put("aaa","123"); data.map.put("bbb","456"); intent.putExtra("data", data); startActivity(intent);
讀取DataParcelable中的數(shù)據(jù):
Intent intent=getIntent(); DataParcelable data=intent.getParcelableExtra("data"); System.out.println("age="+data.age+",username="+data.username+",password="+data.password+",map="+data.map); 大家根據(jù)自己的需要和使用場景,選擇自己的數(shù)據(jù)存儲方式吧?。?/pre>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。