一,Binder框架讲解
Binder是一种框架,这种架构提供了服务端接口,Binder驱动,客户端接口三个模块
服务端 一个Binder服务端实际上就是一个Binder类对象,该对象那个一旦创建,内部就会创建一个隐藏的线程,该线程就会接收Binder驱动发送的消息,收到消息后,会执行Binder中的onTransact()函数,并按照该函数的参数执行不同的服务代码,因此 ,要是先一个onTransact()方法
Binder驱动
Binder驱动,任意一个服务端Binder对象被创建时,同时会在Binder驱动创建一个mRemote对象,该对象的类型也是Binder类.客户端要访问远程服务时,都是通过mRemote对象.
程序客户端
客户端想要访问远程服务,必须要获取服务在Binder对象中对应的mRemote引用,至于如何获取,获得该mRemote对象后,就可以调用其transact()方法,而在Binder驱动中,mRemote对象也重载transact()方法
重载的内容主要包括:
- 以线程间消息通信的模式,向服务端发送客户端传递过来的参数
- 当挂起当前线程,当前线程正是客户端线程,并等待服务端线程执行完指定函数通知(notify).
- 接收到通知线程的通知,然后继续发送客户端线程,并返回到客户端代码区
注意:客户端并不是直接调用了远程服务对应的BInder,而事实上则是通过Binder驱动进行中转.即存在两个Binder对象,一个是服务端的Binder对象,另一个则是Binder驱动中的Binder对象,所不同的是Binder驱动中的对象那个不会额外产生一个线程
二,程序设计的Service端
设计Service端一般都Android已经为你实现了,但是有实力的Android程序员可以按照自己实现一个Service,只要基于Binder类新建一个Service类即可,以下的BaseService代码就是继承了Binder类,并通过start(String filepath)和stop()方法来实现Service类
public class BaseService extends Binder{
@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
// TODO Auto-generated method stub
return super.onTransact(code, data, reply, flags);
}
public void start(String filepath) {
}
public void stop() {
}
}
通过创建BaseService的实例来启动
可以看到DDMS的Threads中多了一个Binder_3线程,定义了服务类之后,就需要重写onTransact()方法,并在data变量中读出客户端传递的参数,start()方法需要变量filepath变量,客户端需要与服务者双方有一个约定.
客户端在传入的包裹data中放入第一个数据就是filepath变量,那么,onTransact()的代码就需要这么设计:
@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code) {
case 1000:
data.enforceInterface("BaseService");
String filepath=data.readString();
start(filepath);
break;
default:
break;
}
return super.onTransact(code, data, reply, flags);
}
AIDL中onTransact()方法实现
@Override public boolean onTransact(int</