AIDL全稱為Android Interface Definition Language,它可以使你的程序實現進程間通信(IPC),並且在實現IPC的基礎上允許多線程訪問。
首先,我們要創建一個自己的.aidl文件(見Demo中的IRemoteService.aidl)。
定義AIDL文件與java中創建接口非常的類似。一般來說,aidl支持的數據類型有五種:java基本數據類型;String;CharSequence;List;Map。其中List和Map較為特殊(http://developer.android.com/guide/components/aidl.html#Create)。如果你使用的數據類型不是AIDL的基本數據類型,你必須要使用import語句將其導入,即使他們是在同一個package下。聲明方法時,方法的參數可以零到多個,返回值可以是void;所有的非基本數據類型都需要指定是傳入還是傳出值(基本數據類型都是傳入值;在AIDL文件中不能聲明靜態字段)
其次,我們要實現我們上面剛剛創建的接口(見Demo中StudentService中的mBinder)。
假設我們有一個AIDL文件叫IRemoteService.aidl,當我們編譯我們的項目的時候,android的ant能將我們的AIDL文件生成為java文件(放在gen/下面)。這個java文件中有一個抽象內部類Stub(繼承了Binder類)實現了我們的接口,並提供了一個asInterface方法將IBinder對象轉化為我們的接口類型。因為實現我們的接口就轉化為實現其抽象內部類Stub(Service端的業務函數全部在這里實現)。
再次,將我們的接口暴露給客戶端(注意Demo在Server端AndroidManifest.xml中對StudentService的聲明)
將我們的接口暴露給客戶端實際上就是:在Service的onBind函數中將我們的Stub類的實例反出去。
這樣,Service端的工作就完成了!
那么,怎樣通過IPC傳遞對象呢(見Demo中的Student.java和Student.aidl)?
如果你想在進程間傳遞對象,那么對象就必須實現Parcelable接口。而實現這個接口需要我們完成以下幾步:
1、在聲明對象的時候實現Parcelable接口
2、實現writeToPacel方法
3、添加一個叫做CREATOR的靜態變量(這個變量要實現Parcelable.Creator接口)
4、創建一個AIDL文件來聲明這個實現了Parcelable接口的類
這樣我們就可以在AIDL中使用對象了。
客戶端怎么對Service端的方法進行調用呢?
其實很簡單,只需要一下幾步就可以了(見Demo中的Client中的代碼)。
1、將Server端使用的.aidl文件拷貝到client程序中,如果你的aidl文件僅僅是對實現了Parcelable接口的類的說明,那么,對應的java文件也要拷貝過去。(注意包名,具體可參考Demo的client端對Sever端AIDL文件的導入)
2、編譯client程序,將在gen/目錄下生成AIDL對應的的類文件
3、實現ServiceConnection接口。在onServiceConnected方法中,使用AIDL生成的Java文件的函數(內部類Stub的asInterface)將onServiceConnected函數的中IBinder參數轉化為AIDL生成的接口對象。
4、根據第3步得到的對象來調用AIDL中的函數。
5、調用bindService函數執行綁定操作(解綁使用unbindService函數)
到這里,AIDL的使用講解就結束了。推薦你結合本文的Demo來讀這篇文章,相信會讓你受益匪淺的。
Demo鏈接:http://pan.baidu.com/share/link?shareid=587849&uk=2953765628