使用AIDL實現程式間的通訊

發表於2015-04-08

在Android中,如果我們需要在不同程式間實現通訊,就需要用到AIDL技術去完成。

AIDL(Android Interface Definition Language)是一種介面定義語言,編譯器通過*.aidl檔案的描述資訊生成符合通訊協議的Java程式碼,我們無需自己去寫這段繁雜的程式碼,只需要在需要的時候呼叫即可,通過這種方式我們就可以完成程式間的通訊工作。關於AIDL的編寫規則我在這裡就不多介紹了,讀者可以到網上查詢一下相關資料。

接下來,我就演示一個操作AIDL的最基本的流程。

首先,我們需要建立一個服務端的工程,如圖所以:

在IPerson.aidl中我們定義了一個“問候”的方法,程式碼如下:

在Eclipse外掛的幫助下,編譯器會自動在gen目錄中生成對應的IPerson.java檔案,格式化後的程式碼如下:

該檔案的大綱檢視如下:

IPerson介面中的抽象內部類Stub繼承android.os.Binder類並實現IPerson介面,比較重要的方法是asInterface(IBinder)方法,該方法會將IBinder型別的物件轉換成IPerson型別,必要的時候生成一個代理物件返回結果。

接下來就是我們的Service了:

我們實現了IPerson.Stub這個抽象類的greet方法,然後再onBind(Intent)方法中返回我們的stub例項,這樣一來呼叫方獲取的IPerson.Stub就是我們的這個例項,greet方法也會按照我們的期望那樣執行。

當然,要想讓Service生效,我們還需要在AndroidManifest.xml中做一些配置工作:

服務端已經完成了,接下來我們就該完成客戶端的工作了。我已經建好了一個客戶端工程,如圖:

我們只需要把IPerson.aidl檔案拷到相應的目錄中即可,編譯器同樣會生成相對應的IPerson.java檔案,這一部分和服務端沒什麼區別。這樣一來,服務端和客戶端就在通訊協議上達到了統一。我們主要工作在MainActivity中完成。

MainActivity程式碼如下:

從程式碼中可以看到,我們要重寫ServiceConnection中的onServiceConnected方法將IBinder型別的對像轉換成我們的IPerson型別。到現在我們就剩下最後一個步驟了,這個環節也是最為關鍵的,就是繫結我們需要的服務。我們通過服務端Service定義的“android.intent.action.AIDLService”這個識別符號來繫結其服務,這樣客戶端和服務端就實現了通訊的連線,我們就可以呼叫IPerson中的“問候”方法了。

最後,貼幾張客戶端演示過程圖。

按照順序分別是:初始介面;點選bindService後介面;點選greet後介面;點選unbindService後介面。

操作過程中的日誌如下:

相關文章