AIDL是Android Interface Definition Language,意思就是Android接口定義語言。首先它是一種語言,它被設計出來的目的就是爲了實現進程間的通訊。 經過使用AIDL,能夠幫咱們生成進程間通訊時須要用到的類和接口方法。 固然,咱們也能夠不借助AIDL,而是本身實現這些類和方法,可是藉助AIDL會讓這個過程變得簡單方便。java
上面提到的AIDL是一種語言,那麼它確定有屬於本身的一套語法: 首先是文件類型,AIDL文件的後綴爲.aidl。 其次是支持的數據類型,AIDL默認支持的一些數據類型,在使用這些數據類型時是不須要導包的(即不須要使用import ***),除了這些默認支持的數據類型外,使用其餘類型則須要導包,即便目標文件與當前正在編寫的 .aidl 文件在同一個包下。 AIDL默認支持的數據類型是:bash
AIDL文件主要分爲兩種類型,一種是定義parcelable對象的,例如:異步
// Book.aidl,這裏是引入了一個序列化對象 Book 供其餘的AIDL文件使用,其中Book.aidl與Book.java的包名應該要是一致的。
package com.example.runningh.mydemo.binder;
import com.example.runningh.mydemo.binder.Book;
//parcelable是小寫
parcelable Book;
複製代碼
上面將Book對象定義成了parcelable對象,這樣才能成爲AIDL文件支持的對象。ui
另外一種是用來定義方法接口的,例如:spa
// BookManager.aidl
package com.example.runningh.mydemo.binder;
//導入所須要使用的非默認支持數據類型的包
import com.example.runningh.mydemo.binder.Book;
interface BookManager {
//注意返回值前是沒有修飾符的
List<Book> getBooks();
Book getBook();
int getBookCount();
void setBookPrice(in Book book , int price)
void setBookName(in Book book , String name)
void addBook(in Book book)
}
複製代碼
默認狀況下AIDL的調用過程是同步仍是異步的? 因爲AIDL是在一個進程裏面發起並調用另一個進程的方法或者數據,而進程間的通訊主要是由transact發起的,Binder的API都是同步的,transact方法會等待服務端進程的onTransact方法返回後才進行返回。因此默認狀況下,AIDL的調用過程就是同步的。所以,若是在主線程中調用遠程服務端的耗時操做方法,則比較容易出現ANR。線程
如何指定AIDL爲異步調用? 要指定AIDL爲異步調用,能夠自行開一個線程或者使用線程池,而後在線程或者線程池中調用遠程服務端的方法。設計