Android IPC程序間通訊(三)Binder
阿新 • • 發佈:2018-11-11
程序間通訊的介質Binder
Binder實現了IBinder介面,是android中跨程序通訊的一種方式。是服務端和客戶端通訊的媒介。
Binder的建立:
1.建立自定義類Book.java實現Parcelable介面,以實現序列化可反序列化。
public class Book implements Parcelable {
private int bookId;
private 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 parcel, int i) {
parcel.writeInt(bookId);
parcel.writeString(bookName);
}
public static final Parcelable. Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
@Override
public Book createFromParcel(Parcel parcel) {
return new Book(parcel);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
private Book(Parcel parcel) {
bookId = parcel.readInt();
bookName = parcel.readString();
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
2.建立Book.aidl,在其中宣告類為parcelable型別。
package com.songfeng.aidlautocreate;
//小寫
parcelable Book;
3.建立一個aild檔案IBookManger.aidl在其中建立介面方法。
package com.songfeng.aidlautocreate;
// Declare any non-default types here with import statements
import com.songfeng.aidlautocreate.Book;
import com.songfeng.aidlautocreate.IOnNewBookArriveListener;
//介面方法,可在Binder中被實現,並傳給客戶端,以此被呼叫
interface IBookManager {
List<Book> getBookList();
void addBook(in Book book);
}
4.重新make project就會自動生成IBookManger.java類其實還是一個介面,此類路徑為
\app\build\generated\source\aidl\debug\包名\IBookManager.java
說說幾個重要的方法:
public interface IBookManager extends android.os.IInterface {
//抽象類Stub繼承Binder實現IBookManger介面,所以說Stub就是一個Binder
public static abstract class Stub extends android.os.Binder implements com.songfeng.aidlautocreate.IBookManager {
//此Binder的唯一標示
private static final java.lang.String DESCRIPTOR = "com.songfeng.aidlautocreate.IBookManager";
//此方法傳入一個Ibinder引數,返回IBookManger介面
public static com.songfeng.aidlautocreate.IBookManager asInterface(android.os.IBinder obj) {
}
//將Binder轉換成IBinder物件,同進程返回Stub本身,不同程序返回代理類 Proxy()
@Override
public android.os.IBinder asBinder() {
return this;
}
//運行於Binder執行緒池,當客戶端發起跨程序請求是,會通過系統底層封裝後交由此類來處理
@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
}
//運行於客戶端
private static class Proxy implements com.songfeng.aidlautocreate.IBookManager {
}
}
}