Android開發(fā)者指南 - Bound服務(wù)

Android開發(fā)者指南 - Bound服務(wù)

ID:42561698

大?。?14.56 KB

頁數(shù):13頁

時間:2019-09-17

Android開發(fā)者指南 - Bound服務(wù)_第1頁
Android開發(fā)者指南 - Bound服務(wù)_第2頁
Android開發(fā)者指南 - Bound服務(wù)_第3頁
Android開發(fā)者指南 - Bound服務(wù)_第4頁
Android開發(fā)者指南 - Bound服務(wù)_第5頁
資源描述:

《Android開發(fā)者指南 - Bound服務(wù)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、AndroidBound服務(wù)bound服務(wù)是客戶端-服務(wù)器模式的服務(wù)。bound服務(wù)允許組件(比如activity)對其進(jìn)行綁定、發(fā)送請求、接收響應(yīng)、甚至進(jìn)行進(jìn)程間通信(IPC)。bound服務(wù)一般只在為其它應(yīng)用程序組件服務(wù)期間才是存活的,而不會一直在后臺保持運(yùn)行。本文展示了如何創(chuàng)建一個bound服務(wù),包括如何從其它應(yīng)用程序組件綁定到該服務(wù)。不過,通常你還應(yīng)該參考Services文檔以獲取關(guān)于服務(wù)的更多信息,比如如何從服務(wù)中發(fā)送通知、如何將服務(wù)設(shè)置為前臺運(yùn)行等等。簡介綁定到一個started服務(wù)正如Services一文中所述,你可以創(chuàng)建一個同時支持started和bound的服務(wù)。

2、也就是說,服務(wù)可以通過調(diào)用startService()來啟動,這使它一直保持運(yùn)行,同時它也允許客戶端通過調(diào)用bindService()來與之綁定。如果你的服務(wù)確實(shí)可以是started和bound的,那么服務(wù)啟動后,系統(tǒng)將不會在所有客戶端解除綁定時銷毀它。取而代之的是,你必須通過調(diào)用stopSelf()或stopService()顯式終止此服務(wù)。雖然你通常應(yīng)該要實(shí)現(xiàn)onBind()或onStartCommand()中的一個,但有時需要同時實(shí)現(xiàn)兩者。比如,音樂播放器的服務(wù)也許就需要同時實(shí)現(xiàn)后臺運(yùn)行和支持綁定。這樣,activity就可以啟動服務(wù)來播放音樂,并且音樂會一直播放下去,即使用

3、戶離開該應(yīng)用程序也沒關(guān)系,這個activity可以綁定播放服務(wù)來重新獲得播放控制權(quán)。請確保已經(jīng)閱讀了管理Bound服務(wù)的生命周期章節(jié),以獲取更多向started服務(wù)添加綁定時的服務(wù)生命周期的有關(guān)信息。bound服務(wù)是Service類的一種實(shí)現(xiàn),它允許其它應(yīng)用程序與其綁定并交互。為了讓服務(wù)支持綁定,你必須實(shí)現(xiàn)onBind()回調(diào)方法。這個方法返回一個IBinder對象,此對象定義了客戶端與服務(wù)進(jìn)行交互時所需的編程接口??蛻舳丝梢酝ㄟ^調(diào)用bindService()方法來綁定服務(wù)。在調(diào)用時,必須提供一個ServiceConnection的實(shí)現(xiàn)代碼,用于監(jiān)控與服務(wù)的聯(lián)接。bindServi

4、ce()將會立即返回,沒有返回值。但是Android系統(tǒng)在創(chuàng)建客戶端與服務(wù)之間的聯(lián)接時,會調(diào)用ServiceConnection中的onServiceConnected()方法,傳遞一個IBinder,客戶端將用它與服務(wù)進(jìn)行通信。多個客戶端可以同時聯(lián)接到一個服務(wù)上。不過,只有在第一個客戶端綁定時,系統(tǒng)才會調(diào)用服務(wù)的onBind()方法來獲取IBinder。然后,系統(tǒng)會向后續(xù)請求綁定的客戶端傳送這同一個IBinder,而不再調(diào)用onBind()。當(dāng)最后一個客戶端解除綁定后,系統(tǒng)會銷毀服務(wù)(除非服務(wù)同時是通過startService()啟動的)。當(dāng)你實(shí)現(xiàn)自己的bound服務(wù)時,最重要的

5、工作就是定義onBind()回調(diào)方法所返回的接口。定義服務(wù)IBinder接口的方式有好幾種,后續(xù)章節(jié)將會對每種技術(shù)進(jìn)行創(chuàng)建一個支持綁定的服務(wù)時,你必須提供一個IBinder,用作客戶端和服務(wù)間進(jìn)行通信的編程接口。定義這類接口的方式有三種:1、擴(kuò)展Binder類如果服務(wù)是你的應(yīng)用程序所私有的,并且與客戶端運(yùn)行于同一個進(jìn)程中(通常都是如此),你應(yīng)該通過擴(kuò)展Binder類來創(chuàng)建你的接口,并從onBind()返回一個它的實(shí)例??蛻舳私邮赵揃inder對象并用它來直接訪問Binder甚至Service中可用的公共(public)方法。如果你的服務(wù)只是為你自己的應(yīng)用程序執(zhí)行一些后臺工作,那這就

6、是首選的技術(shù)方案。不用這種方式來創(chuàng)建接口的理由只有一個,就是服務(wù)要被其它應(yīng)用程序使用或者要跨多個進(jìn)程使用。2、使用Messenger如果你需要接口跨越多個進(jìn)程進(jìn)行工作,可以通過Messenger來為服務(wù)創(chuàng)建接口。在這種方式下,服務(wù)定義一個響應(yīng)各類消息對象Message的Handler。此Handler是Messenger與客戶端共享同一個IBinder的基礎(chǔ),它使得客戶端可以用消息對象Message向服務(wù)發(fā)送指令。此外,客戶端還可以定義自己的Message,以便服務(wù)能夠往回發(fā)送消息。這是執(zhí)行進(jìn)程間通信(IPC)最為簡便的方式,因?yàn)镸essenger會把所有的請求放入一個獨(dú)立進(jìn)程中的

7、隊(duì)列,這樣你就不一定非要把服務(wù)設(shè)計為線程安全的模式了。3、使用AIDLAndroid接口定義語言AIDL(AndroidInterfaceDefinitionLanguage)完成以下的所有工作:將對象解析為操作系統(tǒng)可識別的原始形態(tài),并將它們跨進(jìn)程序列化(marshal)以完成IPC。前一個使用Messenger的方式,實(shí)際上也是基于AIDL的,它用AIDL作為底層結(jié)構(gòu)。如上所述,Messenger將在一個單獨(dú)的進(jìn)程中創(chuàng)建一個包含了所有客戶端請求的隊(duì)列,這樣服務(wù)每次就

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。