1、Binder含义
- 直观角度:Android中的一个类,实现了IBinder接口
- IPC角度:Android中一种跨进程通信方式
- 一种虚拟的物理设备,设备驱动是/dev/binder
- Android Framework角度:ServiceManager连接各种Manager(ActivityManager、WindowManager等)和相应ManagerService的桥梁
- 应用层角度:是客户端和服务端进行通信的媒介,当bindService的时候,服务端会翻译一个包含了服务端业务调用的Binder对象,通过这个Bind对象,客户端就可以获取服务端提供的服务或者数据。
2、Binder使用
Binder主要用于Service中,普通Service中的Binder不涉及进程间通信,较为简单,无法触及Binder的核心。因此这里使用AIDL为例,来分析Binder的工作机制。
首先在AS中创建一个工程,并新建以下三个文件:Book.java、Book.aidl、IBookManager.aidl
//Book.java文件
package com.syy.note1;
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(this.bookId);
dest.writeString(this.bookName);
}
protected Book(Parcel in) {
this.bookId= in.readInt();
this.bookName= in.readString();
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel source) {
return new Book(source);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
}
//Book.aidl文件
package com.syy.note1;
parcelable Book;
// IBookManager.aidl文件
package com.syy.note1;
import com.syy.note1.Book;
// Declare any non-default types here with import statements
interface IBookManager {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
List<Book> getBookList();
void addBook(in Book book);
}<