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 {  
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39507260/article/details/83661723