#Android學(xué)習(xí)計(jì)劃第二周 清晰地理解Service

1.Service的start和bind狀態(tài)有什么區(qū)別?

  • 調(diào)用startService,service的完整生命周期從 onCreate=>onStartCommand=>onDestroy。多次調(diào)用startService只會(huì)多次調(diào)用onStartCommand,并不會(huì)調(diào)用onCreate。start啟動(dòng)的service與該組件沒(méi)有任何聯(lián)系,即使該組件被銷(xiāo)毀了,service仍然在后臺(tái)運(yùn)行,必須調(diào)用stopService或者stopSelf來(lái)銷(xiāo)毀service。

  • 調(diào)用bindService,service的完整生命周期從onCreate=>onBind=>onUnBind=>onDestroy。如果service在bind方法調(diào)用前已經(jīng)啟動(dòng),那么綁定服務(wù)后只調(diào)用onBind。多次調(diào)用bindService并不會(huì)調(diào)用onCreate和onBind,它們都在服務(wù)被創(chuàng)建時(shí)調(diào)用。bind啟動(dòng)的服務(wù)依賴(lài)這些組件,當(dāng)這些組件被銷(xiāo)毀時(shí),該服務(wù)同樣也會(huì)被銷(xiāo)毀,并且必須調(diào)用unbindService來(lái)銷(xiāo)毀。

2. 同一個(gè)Service,先startService,然后再bindService,如何把它停止掉?

  • 調(diào)用n次startService,只需調(diào)用一次stopService或者stopSelf。
    調(diào)用n次bindService,必須調(diào)用n次unbindService。
    所有只需調(diào)用一次stopService或者stopSelf和n次unbindService,沒(méi)有執(zhí)行順序。

3. 你有注意到Service的onStartCommand方法的返回值嗎?不同返回值有什么區(qū)別?

?3.1 START_STICKY:
系統(tǒng)在調(diào)用完onStartCommand()方法后,如果當(dāng)前服務(wù)被終止了,系統(tǒng)會(huì)使該服務(wù)保持在啟動(dòng)狀態(tài),不過(guò)它不會(huì)保留之前傳遞的Intent對(duì)象。但是由于它保持啟動(dòng)狀態(tài),隨后系統(tǒng)會(huì)嘗試重新創(chuàng)建service,但之前的Intent對(duì)象沒(méi)有被保存。在這個(gè)情況下,如果期間沒(méi)有任何啟動(dòng)命令被傳遞到Service,那么參數(shù)Intent將為null。因此使用START_STICKY作為返回值,適用于不執(zhí)行命令的媒體播放器(或類(lèi)似的服務(wù)),它只是無(wú)限期的運(yùn)行著并等待工作的到來(lái).
?
?3.2 START_NOT_STICKY:
系統(tǒng)在調(diào)用完onStartCommand方法后,如果當(dāng)前服務(wù)被終止了并且在此期間沒(méi)有任何啟動(dòng)命令被傳遞到Service,那么系統(tǒng)將是使當(dāng)前服務(wù)退出啟動(dòng)狀態(tài),并且除非重新調(diào)用Context.startService(Intent),否則不會(huì)重新被創(chuàng)建(即不會(huì)重新調(diào)用onCreate方法)。因?yàn)楫?dāng)前服務(wù)退出了啟動(dòng)狀態(tài),所以除非在此期間啟動(dòng)命令被傳遞到Service,否則也不會(huì)調(diào)用。這是最安全的選項(xiàng),用來(lái)避免在不需要的時(shí)候運(yùn)行你的服務(wù)。onStartCommand方法。
?
?3.3 START_REDELIVER_INTENT:
重傳Intent。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將Intent的值傳入。
?
?3.4 START_STICKY_COMPATIBILITY:
START_STICKY的兼容版本,但不保證服務(wù)被kill后一定能重啟。

4. Service的生命周期方法onCreate、onStart、onBind等運(yùn)行在哪個(gè)線(xiàn)程?

  • Service的所有方法都是默認(rèn)運(yùn)行在主線(xiàn)程。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言:本文所寫(xiě)的是博主的個(gè)人見(jiàn)解,如有錯(cuò)誤或者不恰當(dāng)之處,歡迎私信博主,加以改正!原文鏈接,demo鏈接 Serv...
    PassersHowe閱讀 1,520評(píng)論 0 5
  • 第一種方式:通過(guò)StartService啟動(dòng)Service 通過(guò)startService啟動(dòng)后,service會(huì)一...
    Big不吃魚(yú)閱讀 121,640評(píng)論 8 94
  • 上篇我們講解了Android中的5中等級(jí)的進(jìn)程,分別是:前臺(tái)進(jìn)程、可見(jiàn)進(jìn)程、服務(wù)進(jìn)程、后臺(tái)進(jìn)程、空進(jìn)程。系統(tǒng)會(huì)按照...
    徐愛(ài)卿閱讀 3,985評(píng)論 6 33
  • [文章內(nèi)容來(lái)自Developers] Service是一個(gè)可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而不提供用戶(hù)界面的應(yīng)用組件。...
    岳小川閱讀 942評(píng)論 0 7

友情鏈接更多精彩內(nèi)容