第七章 后臺(tái)服務(wù)(Service)

?參考資料:
《Android應(yīng)用程序開(kāi)發(fā)》ISBN 9787302283164
參考軟件:
Android Studio、Eclipse+ADT、Android SDK、JDK
一、Service簡(jiǎn)介
android中服務(wù)是運(yùn)行在后臺(tái)的東西,級(jí)別與activity差不多。既然說(shuō)service是運(yùn)行在后臺(tái)的服務(wù),那么它就是不可見(jiàn)的,沒(méi)有界面的東西。你可以啟動(dòng)一個(gè)服務(wù)Service來(lái)播放音樂(lè),或者記錄你地理信息位置的改變,或者啟動(dòng)一個(gè)服務(wù)來(lái)運(yùn)行并一直監(jiān)聽(tīng)某種動(dòng)作。
? ? ?Service是Android中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案,非常適合用于去執(zhí)行哪些不需要和用戶交互而且還要求長(zhǎng)期運(yùn)行的任務(wù)。不能運(yùn)行在一個(gè)獨(dú)立的進(jìn)程當(dāng)中,而是依賴與創(chuàng)建服務(wù)時(shí)所在的應(yīng)用程序進(jìn)程。只能在后臺(tái)運(yùn)行,并且可以和其他組件進(jìn)行交互。
? ? ? Service可以在很多場(chǎng)合使用,比如播放多媒體的時(shí)候用戶啟動(dòng)了其他Activity,此時(shí)要在后臺(tái)繼續(xù)播放;比如檢測(cè)SD卡上文件的變化;比如在后臺(tái)記錄你的地理信息位置的改變等等,總之服務(wù)是藏在后臺(tái)的。
? ? ? ?服務(wù)不會(huì)自動(dòng)開(kāi)啟線程,我們需要在服務(wù)的內(nèi)部手動(dòng)創(chuàng)建子線程,并在這里執(zhí)行具體的任務(wù)。
Service和其他組件一樣,都是運(yùn)行在主線程中,因此不能用它來(lái)做耗時(shí)的請(qǐng)求或者動(dòng)作。你可以在服務(wù)中開(kāi)一一個(gè)線程,在線程中做耗時(shí)動(dòng)作。
□?Service適用于無(wú)需用戶干預(yù),且規(guī)則或長(zhǎng)期運(yùn)行的后臺(tái)功能
□首先,因?yàn)镾ervice沒(méi)有用戶界面,更加有利于降低系統(tǒng)資源的消耗,而且Service比Activity具有更高的優(yōu)先級(jí),因此在系統(tǒng)資源緊張時(shí),Service不會(huì)被Android系統(tǒng)優(yōu)先終止
□?即使Service被系統(tǒng)終止,在系統(tǒng)資源恢復(fù)后Service也將自動(dòng)恢復(fù)運(yùn)行狀態(tài),因此可以認(rèn)為Service是在系統(tǒng)中永久運(yùn)行的組件
Service除了可以實(shí)現(xiàn)后臺(tái)服務(wù)功能,還可以用于進(jìn)程間通信(Inter Process Communication,IPC),解決不同Android應(yīng)用程序進(jìn)程之間的調(diào)用和通訊問(wèn)題
二、Service的種類

按運(yùn)行地點(diǎn)分類:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

其實(shí)remote服務(wù)還是很少見(jiàn)的,并且一般都是系統(tǒng)服務(wù)。?
?
按運(yùn)行類型分類:

前臺(tái)服務(wù)是在做了上述工作之后需要調(diào)用?startForeground(?android 2.0?及其以后版本?)或?setForeground?(android 2.0?以前的版本)使服務(wù)成為前臺(tái)服務(wù)。這樣做的好處在于,當(dāng)服務(wù)被外部強(qiáng)制終止掉的時(shí)候,ONGOING?的?Notification?任然會(huì)移除掉。
?
按使用方式分類:

以上面三種方式啟動(dòng)的服務(wù)其生命周期也有區(qū)別,將在隨后給出。
三、Service生命周期
?

context.startService() ->onCreate()->onStart()->Service running--調(diào)用context.stopService() ->onDestroy()
context.bindService()->onCreate()->onBind()->Servic?e running--調(diào)用>onUnbind() ->?onDestroy()
1.?生命周期常用方法
在Service的生命周期里,常用的有:
·????????4個(gè)手動(dòng)調(diào)用的方法? ? ? ? ? ? ? ? ? ? ? ? ?
?
手動(dòng)調(diào)用方法
?
?
作用
?
?
startService()
?
?
啟動(dòng)服務(wù)
?
?
stopService()
?
?
關(guān)閉服務(wù)
?
?
bindService()
?
?
綁定服務(wù)
?
?
unbindService()
?
?
解綁服務(wù)
?
·????????5個(gè)內(nèi)部自動(dòng)調(diào)用的方法? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
內(nèi)部自動(dòng)調(diào)用的方法
?
?
作用
?
?
onCreat()
?
?
創(chuàng)建服務(wù)
?
?
onStartCommand()
?
?
開(kāi)始服務(wù)
?
?
onDestroy()
?
?
銷毀服務(wù)
?
?
onBind()
?
?
綁定服務(wù)
?
?
onUnbind()
?
?
解綁服務(wù)
?
2.?生命周期方法具體介紹
主要介紹內(nèi)部調(diào)用方法和外部調(diào)用方法的關(guān)系。
2.1 startService()
·????????作用:?jiǎn)?dòng)Service服務(wù)
·????????手動(dòng)調(diào)用startService()后,自動(dòng)調(diào)用內(nèi)部方法:onCreate()、onStartCommand()
·????????調(diào)用邏輯如下:

調(diào)用邏輯
2.2 stopService()
·????????作用:關(guān)閉Service服務(wù)
·????????手動(dòng)調(diào)用stopService()后,自動(dòng)調(diào)用內(nèi)部方法:onDestory()
·????????調(diào)用的邏輯:
·?????????

調(diào)用邏輯
2.3 bindService()
·????????作用:綁定Service服務(wù)
·????????手動(dòng)調(diào)用bindService()后,自動(dòng)調(diào)用內(nèi)部方法:onCreate()、onBind()
·????????調(diào)用的邏輯:

調(diào)用的邏輯
2.4 unbindService()
·????????作用:解綁Service服務(wù)
·????????手動(dòng)調(diào)用unbindService()后,自動(dòng)調(diào)用內(nèi)部方法:onCreate()、onBind()、onDestory()
·????????調(diào)用的邏輯:
·?????????

調(diào)
調(diào)用的邏輯
3.?常見(jiàn)的生命周期使用
3.1?只使用startService啟動(dòng)服務(wù)的生命周期

startService啟動(dòng)服務(wù)的生命周期
3.2?只使用BindService綁定服務(wù)的生命周期

BindService綁定服務(wù)的生命周期
3.3?同時(shí)使用startService()啟動(dòng)服務(wù)、BindService()綁定服務(wù)的生命周期

Paste_Image.png
3.4?特別注意
·????????startService()和stopService()只能開(kāi)啟和關(guān)閉Service,無(wú)法操作Service;
bindService()和unbindService()可以操作Service
·????????startService開(kāi)啟的Service,調(diào)用者退出后Service仍然存在;
BindService開(kāi)啟的Service,調(diào)用者退出后,Service隨著調(diào)用者銷毀。