Binder
2015-10-18 15:15
267 查看
Binder是一种架构,这种架构提供了服务端接口、Binder驱动、客户端接口三个模块。
首先来看服务端,一个Binder服务端就是一个Binder类的对象,该对象一旦被创建,内部就启动一个隐藏线程。该线程接下来会接收Binder驱动发送的消息,收到消息后,会执行到Binder对象的onTransact()函数,并按照该函数的参数执行不同的服务代码。因此要实现一个Binder服务端,就必须重载onTransact()函数。
其实重载onTransact()函数的目的就是将onTransact()函数的参数转换为服务函数的参数。
而onTransact()函数的参数来源是客户端调用transact()函数时传入的,因此,transact()出入什么参数,onTransact()函数就会接收到什么参数。
下面再看Binder驱动,任意一个服务端Binder对象被创建时,同时会在Binder驱动中创建一个对应的Binder对象,作为Binder驱动的成员mRemote。客户端要访问远程服务时,都是通过mRemote来实现。
最后来看客户端,客户端想要访问远程服务,必须要获取远程服务在Binder驱动中对应的mRemote字段,获得mRemote字段后就可以调用其transact()函数,mRemote也重载了transact()函数,重载内容包括以下几项:
以线程通信的模式,向服务端发送客户端传递过来的参数。
挂起当前线程,当前线程正式客户端线程,并等待服务端线程执行完毕指定的服务函
数后的通知。
接收到服务端线程的通知,然后几项执行客户端线程,并返回到客户端代码区。
从这里可以看出,客户端似乎是直接调用远程服务对应的Binder,而事实上测试通过Binder驱动中的Binder对象进行了中专。即存在两个Binder对象,一个是服务端的Binder对象,另一个是Binder驱动中的Binder驱动,所不同的是Binder驱动中对象不会再额外开一个线程。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories