Android系统的Binder机制之四——系统Service
前面我们已经介绍了AndroidBinder机制的ServiceManager,Service对象代理1,Service
对象代理2。本文将介绍一下Android机制的另外一个重要部分——系统Service。
1、系统Service实例——Mediaserver
首先我们先看一下Android一个实例MediaService,代码位于
framework/base/media/mediaserver/main_mediaserver.cpp文件:
1://Systemheadersrequiredforsetgroups,etc.
2:#include<sys/types.h>
3:#include<unistd.h>
4:#include<grp.h>
5:
6:#include<binder/IPCThreadState.h>
7:#include<binder/ProcessState.h>
8:#include<binder/IServiceManager.h>
9:#include<utils/Log.h>
10:
11:#include<AudioFlinger.h>
12:#include<CameraService.h>
我们发现MediaServer是一个进程,并且该程序的实现表面上也挺简单,其实并不简单,让我
们慢慢分析一下MediaServer。
1、第一句创建创建一个ProcessState的引用,但是这个对象后面并没有被调用到,那么为什
么创建呢?请回想一下我在博文《Android系统的Binder机制之二——服务代理对象(1)
》
中介绍ProcessState对象时提到:如果一个进程要使用Binder机制,那么他的进程中必须要创
建一个ProcessState对象来负责管理Service的代理对象。
2、第二句调用defaultServiceManager获得一个ServiceManager代理对象,我在
《Android系统的Binder机制之二——服务代理对象(1)
》已经对此有了详细的介绍这里就
不赘述了。
3、后面几行都是创建具体的Service,我们展开之后发现都是一些调用ServiceManager的
addService进行注册的函数,以AudioFlinger为例,instantiate代码如下:
1:voidAudioFlinger::instantiate(){
2:defaultServiceManager()->addService(
3:String16("media.audio_flinger"),newAudioFlinger());
4:}
4、最后调用ProcessState的startThreadPool方法和IPCThreadState的joinThreadPool使
MediaServer进入等待请求的循环当中。
我们可以看出一个进程中可以有多个Service,MediaServer这个进程中就存在
AudioFlinger,MediaPlayerService,CameraService,AudioPolicyService四个Service。
2、系统Service的基础——BBinder
我们仔细查看一下MediaServer中定义的四个Service我们将会发现他们都是继承自
BBinder,而BBinder又继承自IBinder接口,详细情况请自行查看他们的代码。每个Service都改
写了BBinder的onTransact虚函数,当用户发送请求到达Service时,框架将会调用Service的
onTransact函数,后面我们将会详细的介绍这个机制。
3、Service注册
云中漫步
Simon的心灵驿站
作者:
Simon_fu
目录:Android,技术 评论:0条评论
2011
一月
25
搜索
Go
订阅RSS
关于
一个躬耕于都市的IT民工,整
天为了生活忙忙碌碌,希望在
能找到一片属于自己的天地。
月份分类
2011年三月
(4)
2011年二月
(4)
2011年一月
(11)
2010年十二月
(10)
2010年十一月
(6)
2010年十月
(7)
2010年九月
(11)
2010年八月
(14)
2010年七月
(18)
2010年六月
(13)
2010年五月
(26)
2010年四月
(24)
2010年三月
(20)
标签
主页 技术 生活 娱乐 电子书 关于