在Android平臺(tái)裡,上層應(yīng)用程式的service與底層的系統(tǒng)service有很大的區(qū)別,只是許多人都將它們混在一起了。例如,在Android裡著名的MediaPlayer範(fàn)例,許多人都知道其結(jié)構(gòu)為:
圖1 其中有兩個(gè)service: l 應(yīng)用程式開發(fā)者所寫的myPlayerService.java類別。這是屬於一般所稱的SDK service。 l Android已經(jīng)提供的MediaPlayerService.cpp類別。這是屬於一般所稱的系統(tǒng)service。 主要的系統(tǒng)service都是在Android系統(tǒng)啟動(dòng)時(shí),就會(huì)先逐一登記到BD(Binder Driver)裡,隨時(shí)準(zhǔn)備為SDK應(yīng)用程式進(jìn)行服務(wù)。 天字第一號(hào)的系統(tǒng)service就是ServiceManager。當(dāng)Android系統(tǒng)啟動(dòng)時(shí),就會(huì)優(yōu)先將之登記到BD(Binder Driver)裡,如下圖:
圖2
讓其它組件能透過IBinder介面(可轉(zhuǎn)型為IServiceManager介面)而遠(yuǎn)距呼叫ServiceManager的服務(wù)。於是陸續(xù)會(huì)有更多的系統(tǒng)service呼叫ServiceManager的addService()函數(shù)而登記到BD裡成為可遠(yuǎn)距呼叫的系統(tǒng)service。例如,基於上述途徑,ActivityManagerService就會(huì)登記為可遠(yuǎn)距呼叫的系統(tǒng)service。再如,MediaPlayerService也繼續(xù)登記為基本的系統(tǒng)service,於是ActivityManagerService和MediaPlayerService也都具有IBinder介面了,如下圖: 當(dāng)Android系統(tǒng)啟動(dòng)完成之後,就可以執(zhí)行應(yīng)用程式了。 執(zhí)行應(yīng)用程式時(shí),就由ActivityManagerService來將SDK service(如myPlayerService.java類別)登記到Binder Driver裡,於是應(yīng)用程式裡的Activity等類別就能使用bindService()函數(shù)來繫結(jié)(bind)到myPlayerService,然後透過IBinder介面而遠(yuǎn)程呼叫到myPlayerService.java。之後,myPlayerService再透過圖1的結(jié)構(gòu)而呼叫到MediaPlayerService,進(jìn)而呼叫到OpenCode組件,就播放出好聽的MP3音樂了。
~~ END ~~
|
|