Android Intent 使用 Parcel 反序列化出错.
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 源代码:
看不出来有什么异常
public void writeToParcel(Parcel out, int flags) { out.writeString(mAction); Uri.writeToParcel(out, mData); out.writeString(mType); out.writeInt(mFlags); out.writeString(mPackage); ComponentName.writeToParcel(mComponent, out); if (mSourceBounds != null) { out.writeInt(1); mSourceBounds.writeToParcel(out, flags); } else { out.writeInt(0); } if (mCategories != null) { out.writeInt(mCategories.size()); for (String category : mCategories) { out.writeString(category); } } else { out.writeInt(0); } if (mSelector != null) { out.writeInt(1); mSelector.writeToParcel(out, flags); } else { out.writeInt(0); } if (mClipData != null) { out.writeInt(1); mClipData.writeToParcel(out, flags); } else { out.writeInt(0); } out.writeBundle(mExtras); } public static final Parcelable.CreatorCREATOR = new Parcelable.Creator () { public Intent createFromParcel(Parcel in) { return new Intent(in); } public Intent[] newArray(int size) { return new Intent[size]; } }; /** @hide */ protected Intent(Parcel in) { readFromParcel(in); } public void readFromParcel(Parcel in) { setAction(in.readString()); mData = Uri.CREATOR.createFromParcel(in); mType = in.readString(); mFlags = in.readInt(); mPackage = in.readString(); mComponent = ComponentName.readFromParcel(in); if (in.readInt() != 0) { mSourceBounds = Rect.CREATOR.createFromParcel(in); } int N = in.readInt(); if (N > 0) { mCategories = new HashSet (); int i; for (i=0; i
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复