在Android平台里,上层应用程式的service与底层的系统service有很大的区别,只是许多人都将它们混在一起了。例如,在Android里著名的MediaPlayer范例,许多人都知道其结构为:
图1
其中有两个service:
l 应用程式开发者所写的myPlayerService.java类别。这是属于一般所称的SDK service。
l Android已经提供的MediaPlayerService.cpp类别。这是属于一般所称的系统service。
主要的系统service都是在Android系统启动时,就会先逐一登记到BD(Binder Driver)里,随时准备为SDK应用程式进行服务。
天字第一号的系统service就是ServiceManager。当Android系统启动时,就会优先将之登记到BD(Binder Driver)里,如下图:
图2
让其它组件能透过IBinder介面(可转型为IServiceManager介面)而远距呼叫ServiceManager的服务。于是陆续会有更多的系统service呼叫ServiceManager的addService()函数而登记到BD里成为可远距呼叫的系统service。例如,基于上述途径,ActivityManagerService就会登记为可远距呼叫的系统service。再如,MediaPlayerService也继续登记为基本的系统service,于是ActivityManagerService和MediaPlayerService也都具有IBinder介面了,如下图:
图3
当Android系统启动完成之后,就可以执行应用程式了。
执行应用程式时,就由ActivityManagerService来将SDK service(如myPlayerService.java类别)登记到Binder Driver里,于是应用程式里的Activity等类别就能使用bindService()函数来系结(bind)到myPlayerService,然后透过IBinder介面而远程呼叫到myPlayerService.java。之后,myPlayerService再透过图1的结构而呼叫到MediaPlayerService,进而呼叫到OpenCode组件,就播放出好听的MP3音乐了。