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. C语言函数以及函数的使用
  2. 安卓软硬结合,热点技术实践总结:《Android音频口数据通信开发》 |
  3. IPC进程间通信
  4. [置顶] Android进程间通信AIDL的使用分析
  5. android udp通信
  6. Android高手进阶教程(十七)之---Android中Intent传递对象的两种
  7. Android中将资源文件转为Bitmap对象
  8. 面向UDP的Android——PC双向通信(三):在Android客户端和PC服务器端

随机推荐

  1. Android(安卓)Schema的妙用
  2. [转] Android(安卓)TextView处理HTML标签
  3. 如何使Android应用程序获得root权限
  4. Android签名漏洞分析
  5. Android(安卓)应用程序之间数据共享 - Co
  6. Android平台上的11个感应器你都知道吗
  7. Android热补丁技术—dexposed原理简析(手
  8. 一些关于 Activity 的技巧
  9. GalHttprequest类库简介——android平台
  10. One省电卫士 - Android内核级省电App