Binder概述與使用場景

一、什麼是Binder

  • 從Android代碼的角度看,Binder是Android中的一個類,它實現了IBinder接口。
  • 從IPC的角度看,Binder是Android中的一種跨進程通訊方式,Binder仍是一種虛擬的物理設備,它的設備驅動是/dev/binder。
  • 從Android Framework的角度看,Binder是ServiceManager鏈接各類Manager(ActivityManager、WindowManager,等等,這些可當作是客戶端)和相應的ManagerService(這可當作是服務端)的橋樑。
  • 從Android應用層的角度看,Binder是客戶端和服務端進行通訊的媒介,當bindService的時候,服務端會返回一個包含了服務端業務調用的Binder對象,經過這個Binder對象,客戶端就能夠獲取服務端提供的服務或數據,這裏的服務包括普通服務和基於AIDL的服務。

二、Binder的使用過程

從上面的Binder定義中能夠知道,Binder是客戶端和服務端進行通訊的媒介。所以Binder的使用過程應該從客戶端和服務端這兩方面進行入手。java

  • 客戶端 一、定義一個aidl文件,在裏面咱們定義一個接口,接口裏面自定義了不一樣的方法,這些方法就是和服務端要進行的操做。 以下編寫了一個IBookManager.aidl文件,裏面有一個接口,而且有兩個方法:getBookList和addBook和服務端進行交互。
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

三、Binder的工做場景

在Android中,Binder主要運行在Service進程間的通訊中。例如AIDL和Messenger都運用到了Binder。ide

相關文章
相關標籤/搜索