Android Binder过程详细解析及AIDL工具原理分析
Binder的作用
为什么要使用Binder?
因为在整个Android系统中,要完成庞大的工作,不可能仅仅依靠自己,自己能力再强也有有求于人的时候,需要请求别人帮自己完成一些事情,这时候请求帮助的一端称为客户端,完成请求的一端称为服务端,有时候很多人会请求同一个人的帮助,也就是很多客户端要依赖一个服务端,他们要和同一个服务端通信,且客户端和服务端往往不在一个进程中,所以Android提供了一种任何应用程序都可以使用的跨进程通信方法(如果不理解跨进程通信,仅仅理解为获取Binder对象的方法就行了),也就是Binder
Binder分为服务端接口、Binder驱动、客户端接口三个部分:
1)服务端:在Android中,服务端就是一个继承了Binder的类,该类一旦创建,内部就开启一个线程,不断接收Binder驱动发送的消息,收到消息后,会执行onTransact()函数,根据binder驱动传入的代码决定执行服务端哪一个函数,从传入的包中取出函数的参数;同时,任意一个服务端的创建,都会在Binder驱动中创建一个mRemote对象
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code) //根据code判断调用哪个函数
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_dispatchAudioFocusChange:
{
data.enforceInterface(descriptor);
int _arg0;
_arg0 = data.readInt();
java.lang.String _arg1;
_arg1 = data.readString();
this.dispatchAudioFocusChange(_arg0, _arg1);
return true;
}
case TRANSACTION_dispatchFocusResultFromExtPolicy:
{
data.enforceInterface(descriptor);
int _arg0;
_arg0 = data.readInt(); //将函数参数取出
java.lang.String _arg1;
_arg1 = data.readString(); 将函数参数取出
this.dispatchFocusResultFromExtPolicy(_arg0, _arg1);
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
2)客户端:客户端要和服务端通信,首先要获取到服务端在Bind