重識Service

重識Service

Service是應用程序組件application component,可以運行在後端執行耗時操作。Service沒有UI,開始後可持續執行一段時間的操作,即使切換到其他APP後也繼續執行。

另外,service運行在主進程之中,它自身不會創建線程或運行在一個獨立的進程中,要想service獨立運行在一個進程中,需要進行配置。

Service類型

Foreground

前臺service是用戶可感知的服務。例如音頻播放器播放音頻。且前臺Service必須顯示Notification(通知)。前臺service即使不與用戶交互的情況下依然會運行。

Background

後臺service是用戶無法直接感知到的服務。例如,對內部存儲進行操作經常回事一個後端service。

Bound

綁定service是其他應用程序組件通過調用bindService()方法與Service綁定在一起。一個bound service提供了C/S方式的結構,允許其他組件與service交互,想service發送請求,接收數據,以及跨進程通訊(IPC)。只要其他組件bind了service,service就會運行。且一個service一次可以綁定多個組件,而一旦解綁所有其他組件之後,service就會被銷燬(destroy)。

Service與線程(Thread)

Service只是運行在background的一個組件,即使用戶不操作情況下,service依然會運行,因此只有在需要時創建並使用service組件。

若程序必須在主線程外執行任務,而用戶又需要與應用交互,此時應該在另一個組件中創建一個新線程(thread)。創建線程可以考慮使用java.util.concurrent包下的類或者使用Kotlin協程,而不要直接使用Thread類進行創建。

基礎

創建Service,必須繼承Service類,並且重寫關鍵的callback方法。

onStartCommand()

其他組件(例如Activity)調用startService()方法調用Service組件運行。一旦onStartCommand()方法運行了,Service會在後臺不停地運行。當Service內任務執行完成之後需要主動調用stopSelf()或stopService()來停止Service組件。如果只是綁定Service(Bound Type Service)就不需要實現這個方法。

onBind()

在另外組件中調用bindService()方法來調用這個回調方法。實現了這個方法,就需要返回一個IBinder對象調用bindService()的組件。反之如果不需要返回IBinder對象,可以返回null。

onCreate()

系統在初始創建Service組件時調用此回調方法。onCreate()回調在onStartCommand()和onBind()方法之前執行。若service正在運行,則此回調方法不會被調用。

onDestroy()

系統會在service不被使用和即將銷燬service前調用此方法。在這個方法中一般執行釋放資源的操作,例如:停止線程,移除監聽器或廣播接收器等。

組件調用startService()啓動Service(onStartCommand()方法被調用),Service會持續運行直到調用stopSelf()或者在其他組件中調用stopService()。

組件調用bindService()來啓動Service(onBind()方法調用,onStartCommand()不調用),只要一旦bind就開始執行。當所有組件解綁後,service會被System銷燬。

Android系統會在low-memory狀態下停止service,並且爲前端的Activity獲取系統資源。如果service綁定到前端Activity,將降低被系統殺死的可能性。若service聲明爲foreground service,基本不會被殺死。

創建Service

一個啓動的Service是另一個組件調用startService()方法運行的。

Service運行後,其生命週期是獨立的,與啓動它的組件無直接關聯。

應用程序組件通過Intent來調用Service,可以通過Intent來傳遞Service需要的參數。

Service類是所有services的基類。service默認運行在應用程序的主線程中,因此在service若處理耗時操作時,應該在service中創建一個新的線程來執行任務,避免影響整個應用程序的性能。

運行前臺服務(Foreground Service)

forground service是用戶可感知且系統在low-memory狀態下不會快速銷燬的服務。同時foreground service必須在狀態欄上顯示通知。即通知只能在service停止或者從foreground移除後才能被關閉。

Service生命週期

服務生命週期。左圖顯示使用 startService() 創建的服務的生命週期,右圖顯示使用 bindService() 創建的服務的生命週期

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章