1选侨、什么是Binder
- 從Android代碼的角度看,Binder是Android中的一個(gè)類,它實(shí)現(xiàn)了IBinder接口吕漂。
- 從IPC的角度看,Binder是Android中的一種跨進(jìn)程通信方式尘应,Binder還是一種虛擬的物理設(shè)備,它的設(shè)備驅(qū)動(dòng)是/dev/binder吼虎。
- 從Android Framework的角度看犬钢,Binder是ServiceManager連接各種Manager(ActivityManager、WindowManager思灰,等等玷犹,這些可看成是客戶端)和相應(yīng)的ManagerService(這可看成是服務(wù)端)的橋梁。
- 從Android應(yīng)用層的角度看洒疚,Binder是客戶端和服務(wù)端進(jìn)行通信的媒介歹颓,當(dāng)bindService的時(shí)候,服務(wù)端會(huì)返回一個(gè)包含了服務(wù)端業(yè)務(wù)調(diào)用的Binder對(duì)象油湖,通過這個(gè)Binder對(duì)象巍扛,客戶端就可以獲取服務(wù)端提供的服務(wù)或數(shù)據(jù),這里的服務(wù)包括普通服務(wù)和基于AIDL的服務(wù)乏德。
2撤奸、Binder的使用過程
從上面的Binder定義中可以知道,Binder是客戶端和服務(wù)端進(jìn)行通信的媒介喊括。因此Binder的使用過程應(yīng)該從客戶端和服務(wù)端這兩方面進(jìn)行入手胧瓜。
- 客戶端
1、定義一個(gè)aidl文件郑什,在里面我們定義一個(gè)接口府喳,接口里面自定義了不同的方法,這些方法就是和服務(wù)端要進(jìn)行的操作蘑拯。
如下編寫了一個(gè)IBookManager.aidl文件钝满,里面有一個(gè)接口肉津,并且有兩個(gè)方法:getBookList和addBook和服務(wù)端進(jìn)行交互。
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類舱沧,所以必須有一個(gè)Book.java類妹沙,表示圖書信息,它實(shí)現(xiàn)了Parcelable接口熟吏。
如下所示:
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();
}
}
同時(shí)伟恶,由于Book類在AIDL中使用了盼铁,所以必須要有一個(gè)同名的Book.aidl類,其作用是將Book類在AIDL中進(jìn)行聲明。
package com.example.runningh.myapplication.aidl;
parcelable Book;
編譯上述的代碼曙蒸,IDE自動(dòng)給我們生成了IBookManager.java類,該類繼承了IInterface這個(gè)接口盟猖,同時(shí)它也是個(gè)接口绣夺,所有可以在Binder中傳輸?shù)慕涌诙夹枰^承IInterface接口,它聲明了兩個(gè)方法getBookList和addBook黎休,這兩個(gè)方法是我們自定義的浓领,同時(shí)還聲明了兩個(gè)整型的id分別用于標(biāo)識(shí)這兩個(gè)方法,這兩個(gè)id用于標(biāo)識(shí)在transact過程中客戶端所請(qǐng)求的到底是哪個(gè)方法势腮。接著联贩,它聲明了一個(gè)內(nèi)部類Stub,Stub是一個(gè)Binder類捎拯,當(dāng)客戶端和服務(wù)端都位于同一個(gè)進(jìn)程時(shí)泪幌,方法調(diào)用不會(huì)走跨進(jìn)程的transact過程,而當(dāng)兩者位于不同進(jìn)程時(shí)署照,方法調(diào)用需要走transact過程祸泪,這個(gè)邏輯由Stub的內(nèi)部代理類Proxy來完成。
3建芙、Binder的工作場(chǎng)景
在Android中没隘,Binder主要運(yùn)行在Service進(jìn)程間的通信中。例如AIDL和Messenger都運(yùn)用到了Binder岁钓。