Android Binder过程详细解析及AIDL工具原理分析

本文深入解析Android Binder的工作原理,包括服务端接口、Binder驱动和客户端接口的职责。同时,介绍了AIDL工具如何简化Binder通信,通过示例阐述AIDL自动生成的类结构和调用流程。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值