Android Intent 使用 Parcel 反序列化出错.

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.Creator<Intent> CREATOR
            = new Parcelable.Creator<Intent>() {
        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<String>();
            int i;
            for (i=0; i<N; i++) {
                mCategories.add(in.readString().intern());
            }
        } else {
            mCategories = null;
        }

        if (in.readInt() != 0) {
            mSelector = new Intent(in);
        }

        if (in.readInt() != 0) {
            mClipData = new ClipData(in);
        }

        mExtras = in.readBundle();
    }

 



你可能感兴趣的:(android,intent,parcel)