1. 程式人生 > >Android IPC程序間通訊(三)Binder

Android IPC程序間通訊(三)Binder

程序間通訊的介質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 {  
        }
    }
}