Binder是Android最主要的进程间通信方式,下面简单认识一下它的通信模型,如下图所示
服务管理进程启动时会变成上下文管理者,在驱动层创建一个全局的binder_node对象binder_context_mgr_node记录进程信息,BpServiceManager中BpBinder的句柄为0,直接以binder_context_mgr_node作为目标,这就是一般进程可以直接与服务管理进程通信的原因。
服务进程有一个BnDemoService类型的服务对象,继承于BBinder。为了使得客户进程与服务进程通信,服务进程需要向服务管理进程添加服务,添加的过程中在驱动层创建binder_node对象记录服务对象的信息,同时在服务管理进程创建binder_ref对象与服务进程的binder_node对象关联。最后服务的名称和binder_ref的句柄保存在服务管理进程。
客户进程向服务管理进程查询是否有特定名称的服务,如果查询到服务,在返回结果的过程中,在客户进程也创建binder_ref对象,该对象同样与binder_node对象关联,binder_ref的句柄最终会保存到BpMyService的BpBinder中。
客户进程查询服务后,客户进程的BpMyService与服务进程的BnDemoService建立了联系,客户进程就可以与服务进程通信了。
以上内容参考 《Android图形显示系统》作者 李先儒,,清华大学出版社