Pro,Android學(xué)習筆記(八一)服務(wù)(6)復(fù)雜數(shù)據(jù)Parcelx_第1頁
Pro,Android學(xué)習筆記(八一)服務(wù)(6)復(fù)雜數(shù)據(jù)Parcelx_第2頁
Pro,Android學(xué)習筆記(八一)服務(wù)(6)復(fù)雜數(shù)據(jù)Parcelx_第3頁
Pro,Android學(xué)習筆記(八一)服務(wù)(6)復(fù)雜數(shù)據(jù)Parcelx_第4頁
Pro,Android學(xué)習筆記(八一)服務(wù)(6)復(fù)雜數(shù)據(jù)Parcelx_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——Pro,Android學(xué)習筆記(八一)服務(wù)(6)復(fù)雜數(shù)據(jù)ParcelxProAndroid學(xué)習筆記(八一):服務(wù)(6):繁雜數(shù)據(jù)Parcel文章轉(zhuǎn)載只能用于非商業(yè)性質(zhì),且不能帶有虛擬貨幣、積分、注冊等附加條件。轉(zhuǎn)載須注明出處:/flowingflying/在之前的StockQuote遠程服務(wù)的接口中的方法為doublegetQuote(Stringticker);。在遠程服務(wù)中的方法的數(shù)據(jù)類型支持原始類型(primitive),如int這類的;支持String、CharSequence;繁雜是類型支持List、Map,但在使用中有一些限制;假設(shè)我們夢想使用自定義的類作為類型,需要使用Parcelable。本筆記將學(xué)習如何通過Parcelable封裝在遠程服務(wù)中的方法調(diào)用中舉行繁雜的數(shù)據(jù)傳遞。

遠程服務(wù)實際是進程間通信,因此在接口的連接中,并不是傳遞對象,而是向原始類型那樣,復(fù)制數(shù)據(jù)。Java的對象實際是C中的指針,Java并非沒有指針,而是除了primitive類型外,全部是指針,當都是指針時,開發(fā)者感覺不到指針和非指針的差異,有時會有錯誤的感覺,以為Java無指針。由于不同進程有各自的內(nèi)存空間,另一個進程不能操控其他進程的內(nèi)存空間,也就是不能操控其他進程內(nèi)存空間的對象。client和遠程服務(wù)建立了AIDL接口的連接,在操作時,將數(shù)據(jù)的內(nèi)容整份舉行傳遞,類似我們在socket中傳遞數(shù)據(jù),我們傳遞數(shù)據(jù)的地址(指針/對象)是毫無意義的,我們務(wù)必傳遞數(shù)據(jù)的內(nèi)容。

自定義的Parcelable類Parcel是消息(數(shù)據(jù)和對象)的容器,可以在IBinder(即遠程服務(wù)的連接)中傳遞。Parcel是Android中設(shè)計用于高性能的IPC傳輸,因此我們不要將Parcel數(shù)據(jù)直接寫到物理存貯中,由于Parcel中某個數(shù)據(jù)的變更,會使得其他數(shù)據(jù)變得不成讀。Parcelable那么是接口,我們自定義的數(shù)據(jù)類型,需要實現(xiàn)該接口,才能作為Parcel在IBinder中傳遞。

下面的例子很簡樸,我們自定義的數(shù)據(jù)類型Person含有兩個數(shù)據(jù),一是intage,一是Stringname。

publicclassPersonimplementsParcelable{

//自定義的類型概括包含的數(shù)據(jù),本例為age和和name。

。

intage=0;

privateStringname=null;

@Override

publicintdescribeContents(){

return0;

}

/*要實現(xiàn)Parcelable接口,需要實現(xiàn)writeToParcel()和readFromParcel()入,實現(xiàn)將對象(數(shù)據(jù))寫入Parcel從,和從Parcel中讀出對象。

為需要留神,寫的依次和讀的依次務(wù)必一致,由于Parcel類是快速serialization和deserialization機制,和bundle不同,沒有索引機制,是線性的數(shù)據(jù)存貯和讀取。

取。

*留神其中readFromParcel()并不是overrider,而是我們自己供給的方法,假設(shè)我們不供給,就要在假設(shè)我們不供給,就要在

privatePerson(Parcelin){

age=in.readInt();

name=in.readString();

*}

*鑒于實際的數(shù)據(jù)類型會比小例子繁雜,以及便于代碼閱讀,我們仿照writeToParcel()的命名,給出的命名,給出readFromParcel()*/

@Override

publicvoidwriteToParcel(Parcelout,intflag){

Int(age);

//先寫入age

out.writeString(name);

//其次寫如name

}

publicvoidreadFromParcel(Parcelin){

age=in.readInt();

//先讀出age,保持與寫同依次

name=in.readString();

//其次讀出name,保持與寫同依次

}

/*:供給構(gòu)造函數(shù),用于從Parcel中創(chuàng)造對象,也即是讀的過程。

這里為設(shè)置為private,遏止外部調(diào)用,遏止外部調(diào)用*/

privatePerson(Parcelin){

readFromParcel(in);

}

//這個構(gòu)造函數(shù),是便當我們在client中創(chuàng)新相關(guān)對象,并將之作為接口連接中調(diào)用方法的的參數(shù)

publicPerson(){

}

/*下面是我們在自定義類中的自定義方法,本例簡樸供給age和name的讀寫*/

publicintgetAge(){

returnage;

}

publicStringgetName(){

returnname;

}

publicvoidsetAge(intage){

this.age=age;

}

publicvoidsetName(Stringname){

=name;

}

/*

實現(xiàn)Parcelable接口的類必個必須有一個staticfield稱為CREATOR,現(xiàn)用于實現(xiàn)Parcelable.Creator接口的對象。在AIDL文件自動生成的Java接口中,IBinder將調(diào)用Parcelable.Creator來獲得傳遞對象來獲得傳遞對象:_arg1=androidservice.Person.CREATOR.createFromParcel(data);

*/

publicstaticfinalParcelable.CreatorPersonCREATOR=newParcelable.CreatorPerson(){

@Override

publicPersoncreateFromParcel(Parcelsource){

returnnewPerson(source);

//見

}

@Override

publicPerson[]newArray(intsize){

returnnewPerson[size];

}

};

}AIDL文件我們定義Person.aidl對Parcelable舉行說明,由于我們已經(jīng)有一個Person.java,所以系統(tǒng)不會再自動生成相關(guān)的java代碼。

ackageandroidservice;parcelablePerson;當定義了Person.aidl中,我們可以在接口定義中使用該類型。在非原語類型,非String類型,其他的類型在接口中作為參數(shù)需要描述傳遞的方向in、out或者inout。

packageandroidservice;importandroidservice.Person;

interfaceIStockQuoteService2{

StringgetQuote(inStringticker,inPersonrequester);}

服務(wù)的實現(xiàn)服務(wù)的實現(xiàn)和之前的遠程服務(wù)沒有什么識別,只是方法中數(shù)據(jù)類型的不同,下面是StockQuoteRemoteService2.java的片段,為了更好地和用戶互動,Service會在通知欄上展現(xiàn),細致可以下載我們的源代碼舉行查看。此外我們需要在AndroidManifest.xml中對service舉行定義。

publicclassStockQuoteRemoteService2extendsService{

publicclassStockQuoteServiceImplextendsIStockQuoteService2.Stub{

privateintcount=0;

@Override

publicStringgetQuote(Stringticker,Personrequester)throwsRemoteException{

returnHello+requester.getName()+!Quotefor+ticker+is+(20.0+(count++));

}

}

......

@Override

publicIBinderonBind(Intentarg0){

returnnewStockQuoteServiceImpl();

}}Client的實現(xiàn)我們新建一個project來作為client。這個client同樣需要了解接口,了解接口中所涉及的parcelablePerson的定義,因此我們需要將service中的IStockQuoteService2.aidl,Person.aidl以及Person.java拷貝過來。

和之前的client只是連接接口后,調(diào)用方法的參數(shù)不同,相關(guān)代碼如下:

publicclassMainActivityextendsActivity{

privateIStockQuoteService2stockService2=null;

privateServiceConnectionservConn=newServiceConnection(){

@Override

publicvoidonServiceDisconnected(ComponentNamename){

stockService2=null;

}

@Override

publicvoidonServiceConnected(ComponentNamename,IBinderservice){

stockService2=IStockQuoteService2.Stub.asInterface(service);

}

};

privatevoidcallService(){

try{

Pperson=newPerson();

Age(25);

person.setName(Flowingflying);

Stringresponse=stockService2.getQuote(WEI,person);

Toast.makeText(this,response,Toast.LENGTH_LONG).show();

}catch(RemoteExceptione){

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論