Binder是一种基于Client-Server的方式的Android系统进程通信方式,是各个组件通信的桥梁。
Binder通信特点:
1、安全-Android为每个安装好的应用程序分配了自己的UID并在内核中身份标示和验证
2、传输性能高-数据传输只拷贝1次
Binder设计思想
1、Binder使用了面向对象的思想,它是Server中的对象,Binder提供了对Server的操作方法。
2、Client中的Binder对象只是Server中Binder对象的代理或着理解为引用,引用可以有很多个,真实的对象只有1个存在于Server中
Binder通信模型
Binder通信4个角色:Server、Client、ServerManager、Binder驱动
1、Binder驱动
负责进程间Binder通信的建立、Binder进程间传递、Binder引用计数管理,数据包在进程之间的传递和一系列的底层支持。
2、ServerManager
Server为Binder实体取一个字符并注册到 ServerManager
ServerManager负责将Server中的Binder对象转化成Client中对该Binder的引用Binder是由Binder驱动发送给Server
3、Client
Server向ServerManager注册了Binder后,Client可以通过名字向ServerManager获得Binder引用,如果有多个Client请求ServerManager会创建多个Binder的引用并发送给Client
举个例子
启动1个Activity这个是我们经常会用到,启动Activity过程其实也是通过Binder通信的完成的,我们启动Activity会调用startActivity方法,
跟着这个方法一步一步跟踪,会发现它最后在startActivityForResult里面调用了Instrument对象的execStartActivity方法,接着在这个函数里面调用了ActivityManagerNative类的startActivity方法, ActivityManagerNative实际上就是ActivityManagerService这个Server对象的Binder代理对象;
最后真正完成启动Activity是ActivityManagerService
启动Activity简单过程:
1、Client 调用startActivity方法
2、通过ServerManager获取ActivityManagerService的代理ActivityManagerNative(Binder引用)
3、ActivityManagerNative执行ActivityManagerService启动Activity