简要分析Android中的Intent,Bundle,Parcel中的数据传递

Intent是进程间通信的一种简要方式,其通讯数据可以存放在Bundle中,而在实际的进程间通讯过程中,数据则是打包成Parcel对象进行处理的.查看源代码后,简要分析一下其中的数据转换逻辑.
简单的逻辑就是:进程A----Data----Bundle----Intent----Parcel------进程B------Parcel----Intent----Bundle----Data(忽略了ActivityManager)

首先看一个典型的启动service和service启动后处理的简单代码段:

public void startServiceWithData() {
	    String data = "hello";
            Bundle bundle = new Bundle();
            bundle.putSerializable("data", ((Serializable)data));//注释一
            Intent intent = new Intent(context, MyService.class);
            intent.putExtras(bundle);//注释二
            context.startService(intent);//注释三
}
//MyService.java
public int onStartCommand(Intent intent, int arg13, int arg14) { 
	Serializable v0 = intent.getSerializableExtra("data");//注释四
	return 0;
}


简单的概括过程:


1:待传递数据的创建:
....Bundle bundle = new Bundle();创建Bundle对象
....bundle.putSerializable("data",((Serializable)data));
....Intent intent = new Intent(context,MyService.class);//创建intent
....intent.putExtras(bundle);//把bundle存入Intent的mExtras成员变量中


2:进程A启动服务
//创建Parcel,并把Intent中的数据打包到Parcel中,然后调用transact传递Parcel对象 
context.startService(intent);
....-service.writeToParcel(data,0);//service是Intent对象,data是Parcel
........-out.writeBundle(mExtras);//out是Parcel,mExtras是Intent中的Bundle
............-val.writeToParcel(this,0);//val是Bundle,this是Parcel
................-super.writeToParcelInner(parcel,flags);//super是BaseBundle
....................-parcel.writeArrayMapInternal(mMap);//把mMap中的数据按顺序写入parcel中
....-mRemote.transact(START_SERVICE_TRANSACTION,data,reply,0);


3:ActivityManager,onTransact方法中处理进程A的请求,从Parcel对象创建Intent
onTransact-case START_SERVICE_TRANSACTION
....-Intent service = Intent.CREATOR.createFromParcel(data);
........-readFromParcel(in);//in是Parcel
............-mExtras= in.readBundle();//从Parcel中获取Bundle,存入Intent
................-Bundle bundle=new Bundle(this,length);//this是Parcel,创建Bundle
....................-readFromParcelInner(parcelledData,length);
........................-Parcel p=Parcel.obtain();//创建一个Parcel
........................-p.appendFrom(parcel,offset,length);//从传递过来的parcel中获取数据
........................-mParcelledData=p;//在Bundle中保存这个parcel


4:在进程B中获取传递过来的Intent中的Bundle数据
intent.getSerializableExtra("data")
....-mExtras.getSerializable(name);//mExtras是Bundle
........-unparcel();//从mParcelledData这个Parcel中解包,把数据取出存入mMap中
............-mParcelledData.readArrayMapInternal(mMap,N,mClassLoader);
........-Object o = mMap.get(key);//从mMap中获取数据


猜你喜欢

转载自blog.csdn.net/zero9988/article/details/73459022