1. 程式人生 > >Service那些事兒

Service那些事兒

1 什麼是Service

Service是Android中經常使用元件之中的一個,它是Android中實現程式後臺執行的解決方式,它非常適合用於去執行那些不須要和使用者互動且還要長期執行的任務。 這裡的後臺並非子執行緒的意思。Service預設並不會執行在子執行緒中。它也不會執行在一個獨立的程序中,它相同執行在UI執行緒中,因此,不要在Service中執行耗時的操作。假設須要執行耗時的操作,能夠在Service中建立子執行緒來完畢耗時操作。

Service的執行不依賴於不論什麼使用者介面,及時程式被切換到後臺或者使用者打開了另外一個應用程式,Service仍然能夠保持正常執行。這也正式Service的使用場景。

當某個應用程式程序被殺掉時,全部依賴於該程序的Service也會停止執行。

2 Service生命週期

根據service的啟動和終止方式,劃分生命週期如下:

2.1 startService啟動Service

啟動以後會執行如下生命週期:

onCreate->onStartCommand

如果此時在呼叫startService只會執行onStartCommand,Servcie並不會重建。 呼叫stopService停止服務,會執行如下生命週期:

onDestroy

這裡要說的是,不管startService呼叫了幾次,只要呼叫一次stopService,該服務即被銷燬;其實也很容易理解,因為多次啟動service,實際只是一個service,並不會生成多個service。

2.2 bindService啟動Service

啟動以後會執行如下生命週期:

onCreate->onBind

值得注意的是bindService與startService啟動不同,多次啟動,並不會多次呼叫onBind,只會呼叫一次onBind。 呼叫unbindService停止服務,會執行如下生命週期:

onUnbind->onDestroy

這裡要說的是,不管bindService呼叫了幾次,只要呼叫一次unBindService,該服務即被銷燬;其實也很容易理解,因為多次繫結service,onBind只執行了一次,並不會繫結多次;另外在沒有繫結服務的情況下,執行unBindService方法解除繫結,會導致應用崩潰,請自行判斷。

2.3 startService啟動以後,使用bindServcie繫結

startService啟動Service,此時如果在使用bindService進行繫結,執行的生命週期方法如下:

onCreate->onStartCommand->onBind

此時無論呼叫單獨呼叫bindService還是startService都無法銷燬服務,需兩者全部執行,才能銷燬服務,不分先後順序。

2.4 bindService繫結以後,使用startService啟動

bindService繫結Service,此時如果在使用startService啟動,執行的生命週期方法如下:

onCreate->onBind->onStartCommand

此時無論呼叫單獨呼叫bindService還是startService都無法銷燬服務,需兩者全部執行,才能銷燬服務,不分先後順序。

3 什麼情況需要使用Service

簡單來說,如果你覺得開發中的所有功能你都可以實現,那好吧,你的確不需要使用service。然後,開發中總會有一些不使用service無法實現或者實現起來比較困難的需求.比如以下需求:

  • app關閉以後,還要保持下載任務正常進行
  • 音樂app介面退出以後,還需要持續播放音樂

諸如此類需求,你是否還有技術方案予以解決;service可能是最好的解決方案。

4 跨程序使用Service通訊

跨程序使用Service通訊,通常來說有兩種方案:

  • Messenger
  • AIDL

兩種通訊方式的原理是一致的,Messenger是對AIDL的又一次封裝,使用起來更方便。Messenger使用Handler傳送訊息,hanler的訊息處理機制是先來先處理,所以針對多執行緒的通訊,應該使用AIDL完成。