資源簡介
這兩天在學(xué)習(xí)aidl跨進(jìn)程調(diào)用,研究了一天終于寫出了個(gè)helloword。。做下記錄吧。
根據(jù)官方提供的指南,開發(fā)aidl跨進(jìn)程調(diào)用,主要分以下步驟:
1. 創(chuàng)建.aidl文件-該文件(YourInterface.aidl)定義了客戶端可用的方法和數(shù)據(jù)的接口。
2. 在makefile文件中加入.aidl文件-(Eclipse中的ADT插件提供管理功能)Android包括名為AIDL的編譯器,位于tools/文件夾。
3. 實(shí)現(xiàn)接口-AIDL編譯器從AIDL接口文件中利用Java語言創(chuàng)建接口,該接口有一個(gè)繼承的命名為Stub的內(nèi)部抽象類(并且實(shí)現(xiàn)了一些IPC調(diào)用的附加方法),要做的就是創(chuàng)建一個(gè)繼承YourInterface.Stub的類并且實(shí)現(xiàn)在.aidl文件中聲明的方法。
4. 向客戶端公開接口-如果是編寫服務(wù),應(yīng)該繼承Service并且重載Service.onBind(Intent) 以返回實(shí)現(xiàn)了接口的對(duì)象實(shí)例
上面的東西真的很官方。。下面結(jié)合我的例子做一下學(xué)習(xí)總結(jié):
先開發(fā)服務(wù)器端
1.創(chuàng)建一個(gè)aidl文件,可以看提供的源碼。創(chuàng)建完成后,eclipse插件自動(dòng)在gen目錄下生成同名字的java文件。里面包含一個(gè)Stub抽象類,這個(gè)類繼承自android.os.Binder,這個(gè)類是實(shí)現(xiàn)整個(gè)遠(yuǎn)程調(diào)用的核心。
2.然后創(chuàng)建一個(gè)類來繼承上面說到的那個(gè)Stub抽象類,實(shí)現(xiàn)里面的抽象方法。(這些抽象方法是根據(jù)aidl文件自動(dòng)生成的)。
3.創(chuàng)建一個(gè)自定義Service繼承自Service,實(shí)現(xiàn)其onBind方法,注意此onBind方法必須返回第二步創(chuàng)建的那個(gè)Stub類的子類。然后在xml中聲明此service,注意此service的聲明必須包含一個(gè)action,此action也用于客戶端的調(diào)用使用。(在下面的客戶端開發(fā)中會(huì)有介紹)。
4.創(chuàng)建一個(gè)activity,此activity只要實(shí)現(xiàn)把service啟動(dòng)了即可。
這樣服務(wù)器端就開發(fā)完畢,運(yùn)行后啟動(dòng)了一個(gè)可供遠(yuǎn)程調(diào)用的service。關(guān)鍵還是通過onBind暴露一個(gè)Binder給客戶端。Binder哪來呢?就是通過aidl文件adt會(huì)自動(dòng)生成一個(gè)抽象類Stub繼承自Binder,只需要?jiǎng)?chuàng)建一個(gè)類實(shí)現(xiàn)這個(gè)Stub的抽象方法即可。
然后開發(fā)客戶端:
1.客戶端也需要一個(gè)aidl文件,注意客戶端的aidl文件的包名必須和服務(wù)器端的aidl包名一致,名字也相同。創(chuàng)建完后同樣會(huì)在gen下生成一個(gè)接口。
2.創(chuàng)建一個(gè)Activity,包含變量ServiceConnection con,實(shí)現(xiàn)其onServiceConnected和onServiceDisconnected方法,onServiceConnected方法生成第一步那個(gè)接口的實(shí)現(xiàn)類的對(duì)象。con對(duì)象用于在onCreate中綁定service,這個(gè)service的action必須為服務(wù)器端聲明的那個(gè)service的配置action。綁定中用到con會(huì)執(zhí)行onServiceConnected方法生成aidl對(duì)象iPerson。然后就可以通過iPerson來調(diào)用aidl里的任意方法返回服務(wù)器的東西。
客戶端開發(fā)完畢。關(guān)鍵點(diǎn)是創(chuàng)建aidl文件自動(dòng)生成了一個(gè)接口,在activity中必須綁定服務(wù)程序開啟的service,在綁定過程中初始化aidl對(duì)象。然后就可用aidl對(duì)象調(diào)用任意方法了。
OK,可以運(yùn)行看效果了。過程真的很繁瑣。。但是好像也只能這樣了。最主要的還是服務(wù)端onBind暴露,然后客戶端bindService得到aidl對(duì)象。
代碼片段和文件信息
-----------?---------??----------?-----??----
?????文件???????2425??2012-07-04?15:20??aidl跨進(jìn)程調(diào)用\aidl跨進(jìn)程調(diào)用.txt
?????文件?????128808??2012-07-04?15:20??aidl跨進(jìn)程調(diào)用\remote.zip
?????目錄??????????0??2012-07-04?15:21??aidl跨進(jìn)程調(diào)用
-----------?---------??----------?-----??----
???????????????131233????????????????????3
評(píng)論
共有 條評(píng)論