进程间通信的介质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 {
}
}
}