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