Parcel其翻译为“包袱”、“包裹”。在Android系统中Binder进程间通信(IPC)中经常使用到Parcel类对象来实现客户端和服务端的数据交互,而AIDL技术也是通过Parcel来实现交互。
查阅Android源码Parcel类,其中常用方法有
obtain() 获得一个新的parcel对象,相当于java中new一个对象
dataSize() 得到当前parcel对象的实际存储空间
dataCapacity() 得到当前parcel对象的已分配的存储空间,该值大于或等于dataSize()返回值 。
dataPostion() 获得当前parcel对象的偏移量(类似于文件流指针的偏移量)
setDataPosition() 设置偏移量(类似于移动指针到特定位置)
recyle() 清空并回收parcel对象所占内存
writeXXX()方法表示写于一个XXX类型的数
readXXX()方法表示读取一个XXX类型的数
比如:writeInt(int) 写入一个整数;readInt()读取一个整数。
值得注意的是,读取或写入特定类型的数之后会导致偏移量的变化,对于同一个parcel对象,偏移量是公用的。其以一个字节作为一个单位,假设去读一个32bit的float(java语言),则偏移量为4。
引用网友的一张图片
下面通过一个Android的小例子来认识这个类的使用
MainActivity类代码
package com.example.androidtest_parcel;
import android.os.Bundle;
import android.os.Parcel;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
private Button mWI,mWF,MWD;
private Button mRI,mRF,mRD;
private TextView mTextView1;
private EditText mEdit;
private Parcel mParcel;
private int p