摘 要:進程間通信是操作系統中非常重要基礎功能,實現進程通信有多種技術,比如管道通信流,IPC機制等,本文針對Android平臺中進程通信技術AIDL 進行較為深入的分析探討,并給出實例加以論述。
關鍵詞:Android;AIDL;進程通訊
操作系統中,多個進程間進行通訊、共享資源實現系統功能平臺,是非常基礎和重要的功能應用;同時,進程通訊也是操作系統內核的重要功能部分。Linux操縱系統中,進程通訊一般使用傳統的IPC(Inter-Process Communication,IPC)模式,且IPC模式實現了共享內存、管道、消息隊列和socket等等,雖然IPC模式廣泛使用,但IPC模式中UID/PID數據是由應用程序填入,存在著可靠性差,容易被篡改,難于維護等問題。
AIDL(Android Interface Definition Language)是Android系統自定義的接口描述語言,是Android平臺中實現進程間通訊方式一種,屬輕量級通訊機制,有著實現簡單、效率較高等優(yōu)點。
1 AIDL實現原理及過程
AIDL語言屬于系統級原語,但語法結構和Java語言非常相似,AIDL中主要用于定義訪問接口,無實現過程。與Java不同的是,AIDL允許定義函數參數傳遞的方向,AIDL中支持三種方向:in,out,inout。
標識為in的參數將從調用者傳遞到遠程服務中;
標識為out的參數將從遠程服務傳遞到調用者中;
標識為inout的參數將先從調用者傳遞到遠程服務中,再從遠程服務返回給調用者。
ADIL實現過程一般按以下步驟:(1)創(chuàng)建AIDL接口描述文件;(2)通過繼承android.os.Iinterface接口實現遠程服務AIDL接口的Java接口;(3)綁定和使用遠程服務;(4)客戶端調用。
AIDL通訊案例中,服務端一般由一個AIDL文件和一個IService實現接口及Service實現類組成,其中IService接口用于實現AIDL所定義的訪問方法,且IService必須是android.os.Iinterface子接口,Service實現類則是AIDL接口具體的實現類。
1)定義如下AIDL文件如下:
interface IService {
int getAccountBalance();
int getCustomerList(in String branch, out String[] customerList);
}
2)Iservice接口的實現
在實現AIDL接口的Service接口其內部結構由三部分組成,1)內部靜態(tài)抽象類Stub,Stub類及其子類在整個AIDL通訊中非常重要,是用于實現AIDL接口的實現類,Stub必須是Android.os.Binder的子類及IService的實現類。2)內部靜態(tài)類Proxy,Proxy類屬于是向遠程服務提供調用接口類。3)是IService中實現的AIDL訪問接口方法。Iservice接口部分代碼如下所示:
public interface IService extends android.os.IInterface
{
public static abstract class Stub extends android.os.Binder {//Stub 內部靜態(tài)抽象類…..
private static class Proxy implements com.lifeblood.ITestService
/內部靜態(tài)類Proxy /………..
public int getAccountBalance();
public int getCustomerList(in String branch, out String[] customerList);
//現的AIDL訪問接口方法
3)TestService類的實現
TestService實現類,是Android中普通Service類Android.os.Service子類,是實現AIDL描述接口的重要實現類,但其實現過程有點特殊,是通過定義ItestService.Stub類型成員變量,實現Iservice接口中調用方法,也就是AIDL中定義的描述接口方法。
4)Activity類中啟動Service服務
本案例中Service只是提供遠程服務,無需在本地Activity中進行訪問,所以使用Intent類啟動Service即可,代碼結構如下: Intent service = new Intent(this, TestService.class);
startService(service);
5) AndroidManifest.XML中的配置
AndroidManifest.XML文件的配置非常重要,遠程服務時其他進程訪問定位到服務,就是通過AndroidManifest文件的配置名稱進行定位,其Service段配置如下:
6)客戶端進程調用
客戶進程調用時與JNDI方式相似,通過實現ServiceConnection接口綁定遠程服務,獲取Service對象,從而實現調用,在客戶端實例中也需拷貝AIDL接口文件。
2 測試運行
程序運行步驟如下:首先運行TestService服務端;再運行AIDLClient客戶端;點擊綁定連接AIDL獲取Service服務,并顯示調用信息。效果如圖1所示。
3 結束語
本文對AIDL接口描述語言的語法結構及實現原理方式,以及在遠程調用過程中AIDL的實現過程,及相關的配置方法進行了分析與探討。AIDL是按面向對象的設計思想實現進程通訊,且AIDL語言符合Android平臺中系統原語規(guī)則,為Android系統級開發(fā)過程中,進程間通訊提供了較為便利和簡單訪問模型。