Service基礎(chǔ)

Service基礎(chǔ)用法

服務(wù)(service)是一種可在后臺(tái)執(zhí)行長(zhǎng)時(shí)間操作而不提供界面的應(yīng)用組件,由應(yīng)用的組件啟動(dòng)捺宗,而且即使用戶(hù)切換到其他應(yīng)用柱蟀,服務(wù)仍將在后臺(tái)繼續(xù)運(yùn)行。服務(wù)默認(rèn)運(yùn)行在其托管進(jìn)程的主線(xiàn)程中蚜厉,因此如果需要在服務(wù)中執(zhí)行耗時(shí)或者阻斷性操作长已,需要使用單獨(dú)的線(xiàn)程或者使用系統(tǒng)提供的IntentService。一般情況下,如果需要執(zhí)行的任務(wù)只有在用戶(hù)與應(yīng)用交互時(shí)才需要執(zhí)行术瓮,則首先應(yīng)考慮使用線(xiàn)程康聂,而不是服務(wù)。

服務(wù)的類(lèi)型
  1. 前臺(tái)服務(wù)胞四,前臺(tái)服務(wù)可以用來(lái)執(zhí)行一些用戶(hù)能注意到的操作恬汁,例如播放音樂(lè),前臺(tái)服務(wù)必須顯示通知辜伟,即使用戶(hù)停止與應(yīng)用的交互氓侧,前臺(tái)服務(wù)仍會(huì)繼續(xù)運(yùn)行。
  2. 后臺(tái)服務(wù)导狡,用來(lái)執(zhí)行用戶(hù)不會(huì)直接注意到的操作约巷,例如壓縮清理應(yīng)用緩存。
  3. 綁定服務(wù)旱捧,當(dāng)應(yīng)用組件通過(guò)bindService綁定到服務(wù)時(shí)独郎,服務(wù)即處于綁定狀態(tài),綁定服務(wù)會(huì)提供C/S接口與應(yīng)用組件進(jìn)行通信廊佩,一個(gè)服務(wù)可以同時(shí)被多個(gè)組件綁定囚聚,當(dāng)全部取消綁定后,服務(wù)才會(huì)被銷(xiāo)毀标锄。
創(chuàng)建并使用服務(wù)

可以通過(guò)創(chuàng)建 Service的子類(lèi)來(lái)使用服務(wù),在子類(lèi)中需要實(shí)現(xiàn)一些方法來(lái)處理服務(wù)的生命周期茁计,一般情況下需要重寫(xiě)以下方法:

方法名 描述
onCreate 首次創(chuàng)建服務(wù)時(shí)料皇,系統(tǒng)會(huì)(在調(diào)用 onStartCommand() 或 onBind() 之前)調(diào)用此方法來(lái)執(zhí)行一次性設(shè)置程序。如果服務(wù)已在運(yùn)行星压,則不會(huì)調(diào)用此方法践剂。
onBind 當(dāng)另一個(gè)組件想要與服務(wù)綁定(例如執(zhí)行 RPC)時(shí),系統(tǒng)會(huì)通過(guò)調(diào)用 bindService() 來(lái)調(diào)用此方法娜膘。在此方法的實(shí)現(xiàn)中逊脯,必須通過(guò)返回 IBinder 提供一個(gè)接口,以供客戶(hù)端用來(lái)與服務(wù)進(jìn)行通信竣贪。如果并不希望服務(wù)被綁定军洼,可以直接返回 null。
onUnbind 所有與當(dāng)前服務(wù)綁定的客戶(hù)端調(diào)用了解綁方法后調(diào)用
onStartCommand 當(dāng)另一個(gè)組件(如 Activity)請(qǐng)求啟動(dòng)服務(wù)時(shí)演怎,系統(tǒng)會(huì)通過(guò)調(diào)用 startService() 來(lái)調(diào)用此方法匕争。執(zhí)行此方法時(shí),服務(wù)即會(huì)啟動(dòng)并可在后臺(tái)無(wú)限期運(yùn)行爷耀。如果實(shí)現(xiàn)了此方法甘桑,則在服務(wù)工作完成后,需通過(guò)調(diào)用 stopSelf() 或 stopService() 來(lái)停止服務(wù)。(如果只想提供綁定跑杭,則無(wú)需實(shí)現(xiàn)此方法铆帽。)
onDestory 當(dāng)不再使用服務(wù)且準(zhǔn)備將其銷(xiāo)毀時(shí),系統(tǒng)會(huì)調(diào)用此方法德谅。服務(wù)應(yīng)通過(guò)實(shí)現(xiàn)此方法來(lái)清理任何資源锄贼,如線(xiàn)程、注冊(cè)的偵聽(tīng)器女阀、接收器等宅荤。這是服務(wù)接收的最后一個(gè)調(diào)用。

通辰撸可以擴(kuò)展以下兩個(gè)類(lèi)來(lái)創(chuàng)建啟動(dòng)服務(wù)

  • Service冯键,這是所有服務(wù)的基類(lèi),默認(rèn)運(yùn)行在應(yīng)用的主線(xiàn)程中庸汗,需要自己創(chuàng)建并維護(hù)工作線(xiàn)程惫确。
class CustomService:Service() {
    private val TAG = "CustomService"
    
    override fun onCreate() {
        Log.d(TAG, "onCreate")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d(TAG, "onStartCommand")
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onBind(intent: Intent?): IBinder? {
        Log.d(TAG, "onBind")
        return null
    }

    override fun onDestroy() {
        Log.d(TAG, "onBind")
        super.onDestroy()
    }
}
  • IntentService,這是Service的子類(lèi)蚯舱,內(nèi)部維護(hù)了一個(gè)工作線(xiàn)程(HandlerThread)通過(guò)隊(duì)列的方式串行的處理所有啟動(dòng)請(qǐng)求(onStartCommand方法)改化,將其轉(zhuǎn)發(fā)到onHandleIntent方法,提供了onBind的默認(rèn)實(shí)現(xiàn)返回null枉昏,一般情況下更推薦使用此類(lèi)來(lái)使用服務(wù)陈肛。例如:
class CustomIntentService(private val name: String) : IntentService(name) {
    private val TAG = "CustomIntentService"
    override fun onHandleIntent(intent: Intent?) {
        Log.d(TAG, "onHandleIntent")
    }
}
服務(wù)的生命周期
service_lifecycle.png

由上圖可見(jiàn),服務(wù)的生命周期兄裂,主要有兩種情況:

  • 啟動(dòng)服務(wù)句旱,由其他組件調(diào)用startService創(chuàng)建,然后無(wú)限期運(yùn)行晰奖,可以通過(guò)服務(wù)自己調(diào)用stopSelf()或者其他組件通過(guò)調(diào)用stopService來(lái)停止服務(wù)谈撒,服務(wù)停止后,系統(tǒng)會(huì)將其銷(xiāo)毀匾南。

    image.png

  • 綁定服務(wù)啃匿,有其他組件(客戶(hù)端)調(diào)用bindService創(chuàng)建,客戶(hù)端可通過(guò)IBinder接口與服務(wù)進(jìn)行通信蛆楞,通過(guò)調(diào)用unbindService關(guān)閉連接溯乒,多個(gè)客戶(hù)端可綁定相同的服務(wù),在所有客戶(hù)端解綁之前臊岸,調(diào)用stopSelf()stopService實(shí)際不會(huì)停止服務(wù)橙数。

    image.png

  • 啟動(dòng)&綁定 混合使用,當(dāng)一個(gè)服務(wù)同時(shí)被啟動(dòng)和綁定時(shí)帅戒,單獨(dú)的停止服務(wù)和解綁操作都不會(huì)使服務(wù)停止灯帮,必須所有客戶(hù)端解綁和停止服務(wù)的方法被調(diào)用兩個(gè)條件都滿(mǎn)足服務(wù)才會(huì)停止崖技。


    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者钟哥。
  • 序言:七十年代末迎献,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腻贰,更是在濱河造成了極大的恐慌吁恍,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件播演,死亡現(xiàn)場(chǎng)離奇詭異冀瓦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)写烤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)翼闽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洲炊,你說(shuō)我怎么就攤上這事感局。” “怎么了暂衡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵询微,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狂巢,道長(zhǎng)撑毛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任隧膘,我火速辦了婚禮代态,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疹吃。我一直安慰自己,他們只是感情好西雀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布萨驶。 她就那樣靜靜地躺著,像睡著了一般艇肴。 火紅的嫁衣襯著肌膚如雪腔呜。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天再悼,我揣著相機(jī)與錄音核畴,去河邊找鬼。 笑死冲九,一個(gè)胖子當(dāng)著我的面吹牛谤草,可吹牛的內(nèi)容都是我干的跟束。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丑孩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冀宴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起温学,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤略贮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仗岖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逃延,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年轧拄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揽祥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紧帕,死狀恐怖盔然,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情是嗜,我是刑警寧澤愈案,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站鹅搪,受9級(jí)特大地震影響站绪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丽柿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一恢准、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甫题,春花似錦馁筐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至炎码,卻和暖如春盟迟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潦闲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工攒菠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歉闰。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓辖众,卻偏偏與公主長(zhǎng)得像卓起,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赵辕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Service基礎(chǔ)使用 之前的文章一直介紹Activity的使用既绩,很多知識(shí)和用法單一的配合Activity使用,這...
    byhieg閱讀 1,137評(píng)論 0 48
  • 一还惠、Service的簡(jiǎn)介 Service為Android四大組件之一饲握,和Activity一樣,都是Context的...
    星泉毅閱讀 912評(píng)論 0 0
  • 《Android Service基礎(chǔ)》[http://www.reibang.com/p/9f6b18e9f3e...
    ITRenj閱讀 871評(píng)論 0 3
  • 引言 文檔內(nèi)容主要翻譯自google文檔蚕键,也有個(gè)人補(bǔ)充救欧。 Service A Service is an appl...
    伍零一閱讀 492評(píng)論 0 4
  • 這篇旨在復(fù)習(xí)service的基礎(chǔ)知識(shí),就是把之前在知乎上寫(xiě)的筆記差不多復(fù)習(xí)了一下锣光,把文章搬運(yùn)了過(guò)來(lái)要點(diǎn)提煉一個(gè)類(lèi) ...
    啦啦哇哈哈閱讀 338評(píng)論 0 0