Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android接口定義語言---AIDL(一)

Android接口定義語言---AIDL(一)

編輯:關於Android編程

AIDL(AndroidInterface DefinitionLanguage)跟你使用的其他的IDLs類似。為了進程間能夠互相通信(IPC),它允許你定義客戶端和服務端都認可的編程接口。在Android上,通常一個進程不能訪問另一個進程內存。所以說,它們需要分解成操作系統能夠理解的原始對象,並且把它們編組成跨越邊界的對象。編寫編組代碼是非常麻煩的,因此Android會使用AIDL來處理它。

注意:只有允許不同應用程序的客戶端用IPC方式訪問服務端,並且想要在服務端處理多線程時,才有必要使用AIDL。如果不需要跨越不同的應用程序來執行並發的IPC處理,就應該通過實現一個Binder來創建接口。或者,如果想要執行IPC處理,但不需要處理多線程,可以使用Messenger類來實現接口。因此,在實現AIDL之前,必須確保你理解Android的BoundServices。

在開始設計AIDL接口之前,要注意AIDL接口的調用是直接的函數調用。你不應該假設相關調用所會發生在哪個線程中。尤其是根據調用是來自本地進程線程,還是遠程進程的線程,所發生的處理是不同的:


1.來自本地進程的調用會在與調用者相同的線程中被執行。如果這是主UI線程,那麼線程會在AIDL接口中繼續執行。如果是另外一個線程,那麼調用例程是在服務中要執行代碼之一。因此,只有正在訪問服務的本地線程,才能夠完全控制調用會在哪個線程中執行(但是,這個中情況下,完全不需要使用AIDL,而是應該通過實現Binder來創建接口)。

2.來自遠程進程的調用會被分配到一個由平台維護的進程內部的線程池中。你必須為來自未知的、同時發生的多次調用的線程做好准備。換句話說,AIDL接口的實現必須是線程安全的。

3.oneway關鍵次是用來修飾遠程調用行為的。當使用該關鍵詞時,遠程調用不是阻塞的,它只是發送事物數據並立即返回。接口的實現最終實現是把普通的遠程調用按照Binder線程池的調用規則來接收的。如果oneway是使用在本地調用上,那麼不會有任何影響,並且調用依然是異步的。


定義AIDL接口

必須使用Java編程語言的語法來定義AIDL接口,然後把它保存在持有該服務的應用程序和綁定該服務的應用程序的源代碼中(在src/目錄中)。

在構建每一個包含.aidl文件的應用程序時,AndroidSDK工具會基於.aidl文件生成一個IBinder接口,並把該接口文件保存在gen/目錄中。該服務必須正確的實現IBinder接口。然後客戶端應用程序才能夠綁定該服務,並調用IBinder中的方法來執行進程間通信(IPC)。

按照以下的步驟來創建一個使用AIDL的綁定服務:

1.創建.aidl文件

這個文件定義了帶有方法簽名的編程接口。

2.實現.aidl文件中定義的接口

AndroidSDK工具基於.aidl文件,用Java編程語言生成該接口。這個接口有一個內部名叫Stub的抽象類,它繼承了Binder類,並實現了AIDL接口中定義的方法。必須繼承Stub類並實現這些方法。

3.把接口暴露給客戶端

實現一個Service,並重寫onBind()方法,讓它返回Stub類的實現。

警告:在AIDL接口第一次發布之後的任何接口的改變,都必須保持向後的兼容性,以避免使用該服務的其他應用程序的中斷。因為為了讓其他的應用程序能夠訪問該服務的接口,就必須把.aidl文件復制到使用該服務的應用程序中,所以就必須保持對初始定義的接口的支持。

 

 

 


作者:FireOfStar
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved