Binder是Andriod中的一个类,它实现了IBinder的接口,在Android中是一种跨进程的通信方式。充当服务端和客户端的桥梁,当通过bindService和服务端连接的时候,服务端会返回一个Binder对象,通过这个对象就可以获取服务端的数据和服务了。
和Socket相比,Socket实现跨进程通信需要进行两次内存拷贝,而Binder只需要一次,效率要高一点。
基本总结原理
Binder是基于C/S结构的一种面向对象的IPC(跨进程通信)机制。
主要有四个核心元素:Client、Server、Binder驱动和ServiceManager。
对于Client
Binder是Server本地对象的一个引用,这个引用实际上是一个代理对象,Client通过这个代理对象来间接访问Server的本地对象。
对于Server
Binder是提供具体实现的本地对象,需向ServiceManager注册。
对于Binder驱动
它是连接Client来Server的桥梁,负责将代理对象转化为本地对象,并将Server的执行结果返回给Client。
对于ServiceManager
它保存了Server Binder字符名称和Binder引用的映射,Client通过它来找到Server的Binder引用。
实现方式
可以通过AIDL(接口定义语言)实现,通过AIDL跨进程通信内部就是通过Binder来实现的,AIDL可以理解为帮助开发者自动创建了Binder 。
定义一个接口类型的aidl文件,里面定义一些抽象方法,系统会自动生成对应java接口,这个java接口继承了IInterface接口,内部会生成了一个Stub类和一个Stub的代理类Proxy,这个Stub类继承了Binder并且实现了这个java接口。所有通过Binder传输的接口都要实现IInterface接口。如果跨进程通信的话,会走transact过程。这个逻辑是由Stub代理类Proxy来完成的。
关于Binder网上介绍太多,看的也头疼,大部分过于抽象或者过于深入源码细节,真正浅显易懂的文章很少,脑细胞实在不够。%>_<%
详情请看《Android开发艺术探索》第二章IPC机制