从上面的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