AIDL浅谈
首先,AIDL作為android接口描述語言,全拼為:Android Interface Definition Language,
乍一看很復雜的樣子,其實作為跨進程調用方法,理解起來也不是那么難。我們都知道,四大組件中的
其他三個,Activity,Broadcast和Content Provider都可以進行跨進程訪問,Service使用了aidl同樣
可以實現這種訪問。
AIDL是一種接口定義語言,用于約束兩個進程間的通訊規則,供編譯器生成代碼,實現Android設備
上的兩個進程間通信(IPC)。AIDL的IPC 機制和EJB所采用的CORBA很類似,進程之間的通信信息,首先
會被轉換成AIDL協議消息,然后發送給對方,對方收到AIDL協議消息后再轉換成相應 的對象。由于進程
之間的通信信息需要雙向轉換,所以android采用代理類在背后實現了信息的雙向轉換,代理類由android
編譯器生成,對開發人員來說是透明的。
在哪些場合需要用到兩個需要用到aidl呢,一個典型的例子就是android?的音樂播放器,但是android
的音樂播放器的程序并沒有把兩個應用之 間的通信體現的很明顯,假設我們需要在其他的應用中操作正在
播放的音樂,雖然我們可以用SERVICECMD來給音樂播放器發送廣播,但是這些命令和音樂 播放器互動的
程度有限,只能播放,停止,上下一曲等,假設我需要在第二個應用中獲取當前的播放進度,歌曲名字等,
該怎么辦呢,這個時候aidl就派上用場 了,下邊通過一個簡單的例子來說明兩個應用之間怎么使用aidl來
通信。
假設A應用需要與B應用進行通信,調用B應用中方法,B應用以Service方式向A應用提供服務。需要 下面四個步驟: <1> 在B應用中創建*.aidl文件,aidl文件的定義和接口的定義很相類; 編寫Aidl文件時,需要注意下面幾點: 1.接口名和aidl文件名相同。 2.接口和方法前不用加訪問權限修飾符public,private,protected等,也不能用final,static。 3.Aidl默認支持的類型包話java基本類型(int、long、boolean等)和(String、List、Map、 CharSequence),使用這些類型時不需要import聲明。對于List和Map中的元素類型必須是Aidl支持的類型。如果使用自定義類型作 為參數或返回值,自定義類型必須實現Parcelable接口。 4.自定義類型和AIDL生成的其它接口類型在aidl描述文件中,應該顯式import,即便在該類和定義的包在同一個包中。 5.在aidl文件中所有非Java基本類型參數必須加上in、out、inout標記,以指明參數是輸入參數、輸出參數還是輸入輸出參數。 6.Java原始類型默認的標記為in,不能為其它標記。 <2>在B應用中實現aidl文件生成的接口,但并非直接實現接口,而是通過繼承接口的Stub來實現 (Stub抽象類內部實現了aidl接口),并且實現接口方法的代碼。 ? <3>在B應用中創建一個Service(服務),在服務的onBind(Intent intent)方法中返回實現了aidl 接口的對象; ? <4>把B應用中aidl文件所在package連同aidl文件一起拷貝到客戶端A應用,eclipse會自動在A應用 的gen目錄中為aidl文件同步生成 *.java接口文件,接下來就可以在A應用中實現與B應用通信。 ? 其中,需要注意的一點是,在A中調用bindService(Intent,conn,flag)方法時,因為此方法中的conn 連接建立需要時間,如果馬上調用*.Stub.anInterface(IBinder)方法返回的對象時,會導致空指針異常。對于AIDL的簡單使用很多博客都有介紹,后期我會添加一個大型項目的aidl服務操作。
以下是簡單例子的友情鏈接:
有圖片的例子:
http://blog.csdn.net/Android_Tutor/article/details/6427680
有代碼的例子:
http://blog.csdn.net/stonecao/article/details/6425019
?
轉載于:https://www.cnblogs.com/endless-android/archive/2012/11/16/2772672.html
總結
- 上一篇: (转)Linux进程调度时机
- 下一篇: 使用CInternetSession和C