IntentService
是service的子類,他會創(chuàng)建默認(rèn)的工作線程,同時創(chuàng)建工作隊列油宜,逐一完成所有啟動請求掂碱,不必?fù)?dān)心多線程問題,onHandleIntent()處理啟動任務(wù)慎冤。在處理完所有請求后會自動關(guān)閉服務(wù)疼燥。
在8.0已經(jīng)棄用,用WorkManager或JobIntentService蚁堤,它使用作業(yè)而不是服務(wù)醉者。所以Android8.0及以上JobIntentService和JobService做的事情是相同的,都繼承于service披诗,都是等著JobScheduler分配任務(wù)來執(zhí)行撬即。不同點在于,JobService使用的handler使用的是主線程的Looper藤巢,因此需要在onStartJob()中手動創(chuàng)建AsyncTask去執(zhí)行耗時任務(wù)搞莺,而JobIntentService則幫我們處理這一過程,使用它只需要寫需要做的任務(wù)邏輯即可掂咒,不用關(guān)心卡住主線程的問題才沧。
Service
面試語:
service是四大組件之一,通常在后臺運行绍刮,默認(rèn)情況下運行在主線程之中温圆,但是也可以另行指定在其他進程中去運行,他不會自行創(chuàng)建線程孩革,也不會獨立在進程中運行岁歉。
service分為前臺服務(wù)和后臺服務(wù)兩種,后臺服務(wù)是沒有用戶可交互界面的膝蜈。例如網(wǎng)易云音樂在切換至后臺后锅移,通知欄會顯示音樂播放的服務(wù)通知熔掺,這屬于前臺服務(wù),這種服務(wù)及時在內(nèi)存緊張的情況下系統(tǒng)也不會殺死該服務(wù)非剃,優(yōu)先級比較高置逻。但是在9.0及以后的系統(tǒng)中必須申請權(quán)限才可以使用。后臺服務(wù)是沒有可見界面的备绽,在Android8.0及以上應(yīng)用變?yōu)楹笈_為了保證前臺應(yīng)用的正常運行券坞,會對后臺服務(wù)作出限制。在應(yīng)用進入后臺后肺素,會有一個幾分鐘的緩沖時間后臺服務(wù)可以正常工作恨锚,當(dāng)時間結(jié)束后系統(tǒng)會默認(rèn)該應(yīng)用處于空閑狀態(tài)從而停止后臺服務(wù)就像我們自己調(diào)用了stopSlef()。通潮睹遥可以通過JobScheduler(工作計劃來解決這些問題猴伶,但是在Android10.0后也會對此作出限制)來完成,但是他會盡可能的在時間允許范圍內(nèi)做任務(wù)的推遲菌瘫。
service可以通過其他組件啟動蜗顽,比如Activity、廣播雨让。如果服務(wù)將執(zhí)行任何耗時操作雇盖,則應(yīng)通過在服務(wù)內(nèi)創(chuàng)建新線程來完成這項工作。通過使用單獨的線程崔挖,可以降低發(fā)生“應(yīng)用無響應(yīng)”(ANR) 錯誤的風(fēng)險,而應(yīng)用的主線程仍可繼續(xù)專注于運行用戶與 Activity 之間的交互庵寞。
服務(wù)和線程:
服務(wù)用在及時應(yīng)用沒有在前臺與用戶進行交互也要運行的時候狸相,如果僅僅是想在進行交互的時候做一些別的操作應(yīng)該通過線程去實現(xiàn)
Intent:
通過顯式Intent來啟動服務(wù)使,用隱式 Intent 啟動服務(wù)存在安全隱患捐川,因為您無法確定哪些服務(wù)會響應(yīng) Intent脓鹃,而用戶也無法看到哪些服務(wù)已啟動。從 Android 5.0(API 級別 21)開始古沥,如果使用隱式 Intent 調(diào)用瘸右,則系統(tǒng)會拋出異常。
生命周期:
onCreate():
首次創(chuàng)建服務(wù)時岩齿,系統(tǒng)將調(diào)用此方法太颤。如果服務(wù)已在運行,則不會調(diào)用此方法盹沈,該方法只調(diào)用一次,重復(fù)啟動不會調(diào)用龄章。
- 服務(wù)在沒有啟動的情況下直接綁定會運行OnCreate()和OnBind(),之后多次綁定不會再有方法調(diào)用,當(dāng)綁定后再去啟動服務(wù)只會運行onStartCommand()并不會再執(zhí)行onCreate()和OnBind()做裙。
onStartCommand():
代替已經(jīng)過時的onStart()方法岗憋。
當(dāng)另一個組件通過調(diào)用startService()請求啟動服務(wù)時,系統(tǒng)將調(diào)用此方法菇用。在此方法中會接收Intent澜驮。如果服務(wù)沒有實現(xiàn)該方法,只做了綁定惋鸥,服務(wù)只會在被其他組件綁定后運行,當(dāng)所有綁定被取消后系統(tǒng)會將其銷毀悍缠。
onDestroy():
當(dāng)服務(wù)不再使用且將被銷毀時卦绣,系統(tǒng)將調(diào)用此方法,在這個方法中做資源回收飞蚓,如監(jiān)聽器滤港、線程等。
onBind():
當(dāng)另一個組件通過調(diào)用bindService()與服務(wù)綁定時趴拧,系統(tǒng)將調(diào)用此方法溅漾。
onUnbind():
當(dāng)另一個組件通過調(diào)用unbindService()與服務(wù)解綁時,系統(tǒng)將調(diào)用此方法著榴。
onRebind():
當(dāng)舊的組件與服務(wù)解綁后添履,另一個新的組件與服務(wù)綁定,onUnbind()返回true時脑又,系統(tǒng)將調(diào)用此方法暮胧。
在Service的生命周期里,常用的方法有:
手動調(diào)用的方法:
startService() 啟動服務(wù)
stopService() 關(guān)閉服務(wù)
bindService() 綁定服務(wù)
unbindService() 解綁服務(wù)
自動調(diào)用的方法:
onCreat() 創(chuàng)建服務(wù)问麸,只會在第一次啟動時調(diào)用
onStartCommand() 開始服務(wù)往衷,會在此方法中接收Intent
onDestroy() 銷毀服務(wù)
onBind() 綁定服務(wù)
onUnbind() 解綁服務(wù)
- 生命周期調(diào)用
1)啟動Service服務(wù)
單次:startService() —> onCreate() —> onStartCommand()
多次:startService() —> onCreate() —> onStartCommand() —> onStartCommand()
2)停止Service服務(wù)
stopService() —> onDestroy()
3)綁定Service服務(wù)
bindService() —> onCreate() —> onBind()
4)解綁Service服務(wù)
unbindService() —> onUnbind() —> onDestroy()
5)啟動綁定Service服務(wù)
startService() —> onCreate() —> onStartCommand() —> bindService() —> onBind()
6)解綁停止Service服務(wù)
unbindService() —> onUnbind() —> stopService() —> onDestroy()
7)解綁綁定Service服務(wù)
unbindService() —> onUnbind(ture) —> bindService() —> onRebind()
- 服務(wù)可以通過bindService()直接啟動,不需要先啟動再綁定严卖。
- 服務(wù)多次被綁定只會執(zhí)行一次席舍。
- 服務(wù)不能在未綁定的情況下執(zhí)行解綁或者多次解綁,會報IllegalArgumentException異常哮笆。bindService有boolean返回来颤。
- 服務(wù)通過綁定啟動后通過stopService()無法關(guān)閉服務(wù)或者解綁服務(wù),對于綁定過的服務(wù)需要解綁才能關(guān)閉服務(wù)疟呐。