android是基于linux内核的,所以它也是支持linux常用的通信方式。在android中最常用也是android的通信基础采用的是Binder通信机制。当然,在android中还有使用到其他的通信方式,比如socket。

在这里,首先要明确的是一定要binder的通信业务和具体的业务层两者区分开,绝对不能搞混它们。

在android中主要有三个端:client端、Server端和一个全局的ServiceManager端。ServiceManager端是管理系统的各种服务,向这里就是以一个MediaPlayerService为例。当然还有其他的服务。在这里,必须明确的是client端、Server端和一个全局的ServiceManager端这三个分别在3个不同的进程当中。所以说三者之间的通信都是Binder。Server端是许多服务的栖息地,MediaPlayerService只是services之一而已。

Binder通信与C/S架构之间的关系,Binder只是为C/S架构提供了一种通信方式。

MediaServer的入口函数是一个Main_MediaServer.cpp文件中的Main(),这个函数主要是实现了获得ProcessState实例对象,得到一个BpServiceManager和相关服务内容的初始化工作。在这里,ProcessState对象实例中有一个成员变量mDriver,这个驱动对象利用open_driver()打开了Binder设备。 同时,在这个构造函数中得到这个Binder设备之后,对int fd使用了mmap,这样的话binder驱动就会分配一块内存来接收数据。

IServiceManager这个接口是ServiceManager向外界提供的,所有说由IServiceManager可以获得一个BpServiceManager。IServiceManager对应的文件是IServiceManager.cpp,现在主要分析这个接口中。

重要函数一: defaultServiceManager()

这个函数中首先会创建一个mdefaultServiceManager对象。在这里特别要注意的一个android中最常使用的一个格式转换函数。interface_cast< **** >函数,在这里interface_cast<IdefaultServiceManager >(ProcessState::self() -> getContextObject(NULL));这个函数内容很丰富,首先得到一个BpdefaultServiceManager。然后这个参数,最终会调用到getStrongProxyForhandle()在这里new出一个新的BpBinder,这里的这个BpBinder就是未来用来数据通信的。interface_cast<I####>这个内联的类模板会创建出对应的Bp####。

getContextObject(NULL)最后等价于BpBinder(NULL)而这个NULL是handle的值,handle在这里作为一个名词,是处理的索引,类似于windows中的句柄的作用。handle是一个资源项的值,所有的资源项都保存在一个资源数组中。handle == NULL,这个"0"在整个binder系统中的重要含义是:特别注意::0代表ServiceManager所对应的BBinder。

重要函数二: 一个重要的宏

public:

DECLARE_META_INTERFACE(ServiceManager);这个宏是在.h中定义的,当然对应的在.cpp中就会实现它。

IMPLEMENT_META_INTERFACE(ServiceManager);(在.cpp文件中)

通过这个宏的定义和实现完成了Binder通信业务和服务业务的挂钩。DECLARE中声明了一些重要函数和变量,在IMPLEMENT中就会把它们一一实现。

说说这个Binder通信业务和服务业务的挂钩的问题:DECLAREIMPLEMENT是在IInterface中完成的,IServiceManager是继承自IInterface,当然就继承了DECLAREIMPLEMENT这两个东西。asInterface()的内容是interface_cast<I####>,这个就得到了BpServiceManager。然后还有的成员变量像一些描述接口的字符串什么的。

在 IServiceManager.cpp中主要是实现BpServiceManager的定义。

BpServiceManager : public BpInterface<IServiceManager>最终的父类是BpRefBase,

它的构造函数是BpRefBase(const sp<IBinder>& o( == remote,它是一个BpBinder))。

结论:IServiceManager.cpp中利用defaultServiceManager()函数完成创建一个BpBinder对象,用来实现未来数据的传输。又创建了BpServiceManager对象

实现这个通信的Bp业务层。BpServiceManager(remote == BpBinder(NULL))这个参数就可以数据传输了,BnServiceManager,便会是具体的实现。

!!在此,必须特别注意的是:

interface_cast不是指针的转换,是利用BpBinder作为参数新建一个BpServiceManager对象。

更多相关文章

  1. Android(安卓)按键流程(InputManagerService 以及 JNI phoneWindo
  2. Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程
  3. 安卓软硬结合,热点技术实践总结:《Android音频口数据通信开发》 |
  4. Android的消息机制,用Android线程间通信的Message机制,Android中Ha
  5. Android之SurfaceView简介(三)
  6. Android实现CoverFlow效果
  7. android ndk native_activity.h
  8. android service 实例
  9. android之location01

随机推荐

  1. 适合java初级工程师找工作的项目
  2. HelloWorld系列教材 (五)- 在Eclipse中运行
  3. 变量系列教材 (六)- 什么是Java的作用域
  4. 面向对象系列教材 (一)- Java中的类和对象
  5. 通过注解的 springboot+mybatis 多数据
  6. 面向对象系列教材 (二)- Java类的属性
  7. 面向对象系列教材 (三)- Java类的方法
  8. 变量系列教材 (七)- Java 中final修饰变量
  9. 变量系列教材 (一)- Java中 什么是变量
  10. 变量系列教材 (八)- 什么是Java的表达式