1. 程式人生 > >簡要分析Android中的Intent,Bundle,Parcel中的資料傳遞

簡要分析Android中的Intent,Bundle,Parcel中的資料傳遞

簡單的概括過程:


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中獲取資料