AIDL浅谈
首先,AIDL作為android接口描述語言,全拼為:Android Interface Definition Language,
乍一看很復雜的樣子,其實作為跨進程調(diào)用方法,理解起來也不是那么難。我們都知道,四大組件中的
其他三個,Activity,Broadcast和Content Provider都可以進行跨進程訪問,Service使用了aidl同樣
可以實現(xiàn)這種訪問。
AIDL是一種接口定義語言,用于約束兩個進程間的通訊規(guī)則,供編譯器生成代碼,實現(xiàn)Android設備
上的兩個進程間通信(IPC)。AIDL的IPC 機制和EJB所采用的CORBA很類似,進程之間的通信信息,首先
會被轉換成AIDL協(xié)議消息,然后發(fā)送給對方,對方收到AIDL協(xié)議消息后再轉換成相應 的對象。由于進程
之間的通信信息需要雙向轉換,所以android采用代理類在背后實現(xiàn)了信息的雙向轉換,代理類由android
編譯器生成,對開發(fā)人員來說是透明的。
在哪些場合需要用到兩個需要用到aidl呢,一個典型的例子就是android?的音樂播放器,但是android
的音樂播放器的程序并沒有把兩個應用之 間的通信體現(xiàn)的很明顯,假設我們需要在其他的應用中操作正在
播放的音樂,雖然我們可以用SERVICECMD來給音樂播放器發(fā)送廣播,但是這些命令和音樂 播放器互動的
程度有限,只能播放,停止,上下一曲等,假設我需要在第二個應用中獲取當前的播放進度,歌曲名字等,
該怎么辦呢,這個時候aidl就派上用場 了,下邊通過一個簡單的例子來說明兩個應用之間怎么使用aidl來
通信。
假設A應用需要與B應用進行通信,調(diào)用B應用中方法,B應用以Service方式向A應用提供服務。需要 下面四個步驟: <1> 在B應用中創(chuàng)建*.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支持的類型。如果使用自定義類型作 為參數(shù)或返回值,自定義類型必須實現(xiàn)Parcelable接口。 4.自定義類型和AIDL生成的其它接口類型在aidl描述文件中,應該顯式import,即便在該類和定義的包在同一個包中。 5.在aidl文件中所有非Java基本類型參數(shù)必須加上in、out、inout標記,以指明參數(shù)是輸入?yún)?shù)、輸出參數(shù)還是輸入輸出參數(shù)。 6.Java原始類型默認的標記為in,不能為其它標記。 <2>在B應用中實現(xiàn)aidl文件生成的接口,但并非直接實現(xiàn)接口,而是通過繼承接口的Stub來實現(xiàn) (Stub抽象類內(nèi)部實現(xiàn)了aidl接口),并且實現(xiàn)接口方法的代碼。 ? <3>在B應用中創(chuàng)建一個Service(服務),在服務的onBind(Intent intent)方法中返回實現(xiàn)了aidl 接口的對象; ? <4>把B應用中aidl文件所在package連同aidl文件一起拷貝到客戶端A應用,eclipse會自動在A應用 的gen目錄中為aidl文件同步生成 *.java接口文件,接下來就可以在A應用中實現(xiàn)與B應用通信。 ? 其中,需要注意的一點是,在A中調(diào)用bindService(Intent,conn,flag)方法時,因為此方法中的conn 連接建立需要時間,如果馬上調(diào)用*.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进程调度时机
 - 下一篇: “玉鸾俄铮铮”下一句是什么