AIDL的做用與調用過程

一、AIDL的做用

AIDL是Android Interface Definition Language,意思就是Android接口定義語言。首先它是一種語言,它被設計出來的目的就是爲了實現進程間的通訊。 經過使用AIDL,能夠幫咱們生成進程間通訊時須要用到的類和接口方法。 固然,咱們也能夠不借助AIDL,而是本身實現這些類和方法,可是藉助AIDL會讓這個過程變得簡單方便。java

二、AIDL支持的參數類型

上面提到的AIDL是一種語言,那麼它確定有屬於本身的一套語法: 首先是文件類型,AIDL文件的後綴爲.aidl。 其次是支持的數據類型,AIDL默認支持的一些數據類型,在使用這些數據類型時是不須要導包的(即不須要使用import ***),除了這些默認支持的數據類型外,使用其餘類型則須要導包,即便目標文件與當前正在編寫的 .aidl 文件在同一個包下。 AIDL默認支持的數據類型是:bash

  • Java中8中基本數據類型 byte,short,int,long,float,double,boolean,char。
  • String類型。
  • CharSequence類型。
  • List類型,List中的元素必須是AIDL支持的數據類型,或者是其餘AIDL生成的一個接口,或者是定義的parcelable對象。
  • Map類型,Map中的元素必須是AIDL支持的數據類型,或者是其餘AIDL生成的一個接口,或者是定義的parcelable對象。

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的調用過程是同步仍是異步的? 因爲AIDL是在一個進程裏面發起並調用另一個進程的方法或者數據,而進程間的通訊主要是由transact發起的,Binder的API都是同步的,transact方法會等待服務端進程的onTransact方法返回後才進行返回。因此默認狀況下,AIDL的調用過程就是同步的。所以,若是在主線程中調用遠程服務端的耗時操做方法,則比較容易出現ANR。線程

  • 如何指定AIDL爲異步調用? 要指定AIDL爲異步調用,能夠自行開一個線程或者使用線程池,而後在線程或者線程池中調用遠程服務端的方法。設計

相關文章
相關標籤/搜索