应用层的AIDL用法(原)
一、什么是AIDL服務
一般創建的服務并不能被其他的應用程序訪問。為了使其他的應用程序也可以訪問本應用程序提供的服務,Android系統采用了遠程過程調用(Remote Procedure Call,RPC)方式來實現。與很多其他的基于RPC的解決方案一樣,Android使用一種接口定義語言(Interface Definition Language,IDL)來公開服務的接口。因此,可以將這種可以跨進程訪問的服務稱為AIDL(Android Interface Definition Language)服務。
二、AIDL基本語法
AIDL使用簡單的語法來聲明接口,描述其方法以及方法的參數和返回值。這些參數和返回值可以是任何類型,甚至是其他AIDL生成的接口。
其中對于Java編程語言的基本數據類型 (int, long, char, boolean,String,CharSequence)集合接口類型List和Map,不需要import 語句。
而如果需要在AIDL中使用其他AIDL接口類型,需要import,即使是在相同包結構下。AIDL允許傳遞實現Parcelable接口的類,需要import
需要特別注意的是,對于非基本數據類型,也不是String和CharSequence類型的,需要有方向指示,包括in、out和inout,in表示由客戶端設置,out表示由服務端設置,inout是兩者均可設置。
AIDL只支持接口方法,不能公開static變量。
三、遠程服務端的創建過程
3.1、簡要步驟
1、在Eclipse Android工程的Java包目錄中建立一個擴展名為A.aidl的文件,并寫下需要的接口。如果aidl文件的內容是正確的,ADT會在gen目錄下自動生成一個A.Java接口文件。2、建立一個服務類(Service的子類)。并在創建的服務類中創建一個內部類,實現由aidl文件生成的Java接口。
3、在服務類的onBind方法返回時,將實現aidl接口的內部類對象返回出去。
4、在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標簽中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類的參數值。
3.2、具體操作
3.2.1、創建文件IMyService.aidl:
? ? ? ??
文件內容:
3.2.2、創建服務類及實現內部類
[java]?view plaincopy3.2.3、在AndroidManifest.xml文件中配置MyService類
[html]?view plaincopy上面的"du.pack.IMyService"是客戶端用于訪問AIDL服務的ID。
四、本地客戶端的使用方法
4.1、新建一個Eclipse Android工程,并將剛才遠程服務端自動生成的gen目錄下面的IMyService.java文件連同包目錄一起復制到客戶端工程的src目錄中。
? ? ? ??4.2、調用AIDL服務首先要綁定服務,然后才能獲得服務對象。
[java]?view plaincopy五、用法小結
根據上面的操作我們先來回顧一下整個調用的過程:
服務端方面:將需要開放的接口抽象到aidl文件中,然后在自己的內部類中對接口進行實現,并在自己被綁定的時候把內部類對象返回給客戶端。
客戶端方面:當我們需要遠程某個Service時,就像在綁定本地的Service一樣去bindService,然后在綁定成功的回調函數中(也就是onServiceConnected方法)得到一個Ibinder對象(比如Service),這時調用IMyService.Stub.asInterface(service)這樣的語句,就可以得到服務端開放的interface接口對象,此時客戶端可以直接調用這個對象的方法,猶如直接調用遠程的Service對象一般。
原文地址:http://blog.csdn.net/u010961631/article/details/9284765
總結
以上是生活随笔為你收集整理的应用层的AIDL用法(原)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Binder机制(150
- 下一篇: Framework中的AIDL(原)