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