本文主要是介绍简单说Binder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://www.jianshu.com/p/ebf2387ddfdf
简单说Binder
简单说Binder
Binder算是Android中比较难懂的一部分内容了,但是非常的重要,要想研究Framework层无论如何也绕不开Binder。网上也有很多讲解Binder的文章,有的很深入涉及到底层C层面,理解起来难度较大,要完全理解还需要Linux驱动的知识,看了还也是似懂非懂,我认为也不需要理解那么深入。写这篇博客主要是我从最学习理解Binder的过程的角度出发,也来谈谈Binder。
Binder是什么
Binder是android中用于进程间通信IPC的重要机制,ActivityManagerService、WinderManagerService等系统服务的背后都是Binder。
Binder架构包括服务器接口、Binder驱动、客户端接口三个模块。
Binder服务端:一个Binder服务端实际上就是Binder类的对象,该对象一旦创建,内部则会启动一个隐藏线程,会接收Binder驱动发送的消息,收到消息后,会执行Binder对象中的onTransact()函数,并按照该函数的参数执行不同的服务器端代码。onTransact函数的参数是客户端调用transact函数的输入。
Binder驱动:任意一个服务端Binder对象被创建时,同时会在Binder驱动中创建一个mRemote对象,该对象也是一个Binder类。客户端访问远程服务端都是通过该mRemote对象。
客户端:获取远程服务在Binder驱动中对应的mRemote引用,然后调用它的transact方法即可向服务端发送消息。
这幅图展现了Binder框架的大致构成,至于里面有一些内容需要看完这篇博客才能看懂。
需要注意的一个问题:既然客户端要通过mRemote引用调用它的transact方法向服务端发送消息,那么客户端获取远程服务在Binder中的mRemote引用?
客户端获取远程服务在Binder中的mRemote引用有两种方式:系统服务和自定义的服务端程序不一样,对于系统服务使用Binder就可以实现服务端,而我们自定义的服务必须借助Service来编写。
》》系统服务是在系统启动的时候在SystemServer进程的init2函数中启动ServerThread线程,在这个线程中启动了各种服务,并且通过调用ServerManager.addService(String name, IBinder service)将其加入保存起来。ServerManager就相当于DNS服务器,在查找某个服务时通过调用ServerManager.getService(String name)函数就可以获得远程服务的Binder,至于它的具体细节可以查看Android启动相关的源代码。
》》自定义的服务必须通过Service来实现。
通过bind函数绑定一个远程服务
这篇关于简单说Binder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!