歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android Intent 使用 Parcel 反序列化出錯

Android Intent 使用 Parcel 反序列化出錯

日期:2017/3/1 9:48:44   编辑:Linux編程

Android Parcel 可以序列化反序列化數據 .但上層的(Intent)卻反序列化失敗.

結論:

查看Android源代碼, Intent 的Parcel 接口代碼,也未能找出問題所在.

如下是我的測試代碼 :

非持久化測試代碼:

final Intent intent = new Intent("cn.eben.bookshelf.VIEW");

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//

序列化前 Intent 內存


Intent { act=cn.eben.bookshelf.VIEW flg=0x10000000 }


Parcel parcel = Parcel.obtain();
intent.writeToParcel(parcel, 0);

byte[] data = parcel.marshall();


Parcel readParcel = Parcel.obtain();
readParcel.unmarshall(data, 0, data.length);
Intent readIntent = Intent.CREATOR.createFromParcel(readParcel);

// readIntent 內存狀態, Intent 反序列化失敗.
Intent { (has extras) }
null
null
null
null
null
Bundle[mParcelledData.dataSize=0]
0
null
null
null
null

context.startActivity(readIntent);// Activite 無法啟動, Intent 無效

// 持久化測試代碼 與內存狀態

調試中,查看內存狀態:

final Intent intent = new Intent("cn.eben.bookshelf.VIEW");

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

查看內存:

序列化前 Intent 內存


Intent { act=cn.eben.bookshelf.VIEW flg=0x10000000 }


Parcel parcel = Parcel.obtain();
intent.writeToParcel(parcel, 0);

byte[] data = parcel.marshall();

// 查看Data內存如下:

[22, 0, 0, 0, 99, 0, 110, 0, 46, 0, 101, 0, 98, 0, 101, 0, 110, 0, 46, 0, 98, 0, 111, 0, 111, 0, 107, 0, 115, 0, 104, 0, 101, 0, 108, 0, 102, 0, 46, 0, 86, 0, 73, 0, 69, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 16, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1]


cv.put("intent", data); //將parcel對持久化.

///讀取

byte[] data = cursor.getBlob(cursor.getColumnIndex("intent"));

//查看讀取到的 Data內存如下: 與寫入的相同.


[22, 0, 0, 0, 99, 0, 110, 0, 46, 0, 101, 0, 98, 0, 101, 0, 110, 0, 46, 0, 98, 0, 111, 0, 111, 0, 107, 0, 115, 0, 104, 0, 101, 0, 108, 0, 102, 0, 46, 0, 86, 0, 73, 0, 69, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 16, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1]


if (null != data && 1 < data.length) {
Intent intent = null;
Parcel parcel = Parcel.obtain();

// 進行反序列化:
parcel.unmarshall(data, 0, data.length);


intent = Intent.CREATOR.createFromParcel(parcel);
// intent 內存狀態, Intent 反序列化失敗.


Intent { (has extras) }
null
null
null
null
null
Bundle[mParcelledData.dataSize=0]
0
null
null
null
null
}

查看Android Intnet 源代碼:

看不出來有什麼異常

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved