從上面的Binder定義中能夠知道,Binder是客戶端和服務端進行通訊的媒介。所以Binder的使用過程應該從客戶端和服務端這兩方面進行入手。java
package com.example.runningh.myapplication.aidl;
import com.example.runningh.myapplication.aidl.Book;
import com.example.runningh.myapplication.aidl.IOnNewBookArrivedListener;
interface IBookManager {
List<Book> getBookList();
void addBook(in Book book);
}
複製代碼
因爲接口中有使用到了自定義的Book類,因此必須有一個Book.java類,表示圖書信息,它實現了Parcelable接口。 以下所示:android
package com.example.runningh.myapplication.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable {
public int bookId;
public String bookName;
public Book(int bookId, String bookName) {
this.bookId = bookId;
this.bookName = bookName;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(bookId);
dest.writeString(bookName);
}
public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
@Override
public Book createFromParcel(Parcel source) {
return new Book(source);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
private Book(Parcel in) {
bookId = in.readInt();
bookName = in.readString();
}
}
複製代碼
同時,因爲Book類在AIDL中使用了,因此必需要有一個同名的Book.aidl類,其做用是將Book類在AIDL中進行聲明。bash
package com.example.runningh.myapplication.aidl;
parcelable Book;
複製代碼
編譯上述的代碼,IDE自動給咱們生成了IBookManager.java類,該類繼承了IInterface這個接口,同時它也是個接口,全部能夠在Binder中傳輸的接口都須要繼承IInterface接口,它聲明瞭兩個方法getBookList和addBook,這兩個方法是咱們自定義的,同時還聲明瞭兩個整型的id分別用於標識這兩個方法,這兩個id用於標識在transact過程當中客戶端所請求的究竟是哪一個方法。接着,它聲明瞭一個內部類Stub,Stub是一個Binder類,當客戶端和服務端都位於同一個進程時,方法調用不會走跨進程的transact過程,而當二者位於不一樣進程時,方法調用須要走transact過程,這個邏輯由Stub的內部代理類Proxy來完成。app
在Android中,Binder主要運行在Service進程間的通訊中。例如AIDL和Messenger都運用到了Binder。ide