1. 程式人生 > >Service 詳解(一) --- 簡介

Service 詳解(一) --- 簡介

什麼是服務

Service 是一個可以在後臺執行長時間執行操作而不提供使用者介面的應用元件。
服務可由其他應用元件啟動,而且即使使用者切換到其他應用,服務仍將在後臺繼續執行。
此外,元件可以繫結到服務,以與之進行互動,甚至是執行程序間通訊 (IPC)。
例如,服務可以處理網路事務、播放音樂,執行檔案 I/O 或與內容提供程式互動,而所有這一切均可在後臺進行。

服務的兩種形式:

  • 啟動服務

    當應用元件(如 Activity)通過呼叫 startService() 啟動服務時,服務即處於“啟動”狀態。一旦啟動,服務即可在後臺無限期執行,即使啟動服務的元件已被銷燬也不受影響。 已啟動的服務通常是執行單一操作,而且不會將結果返回給呼叫方。例如,它可能通過網路下載或上傳檔案。 操作完成後,服務會自行停止執行。

  • 繫結服務

    當應用元件通過呼叫 bindService() 繫結到服務時,服務即處於“繫結”狀態。繫結服務提供了一個客戶端-伺服器介面,允許元件與服務進行互動、傳送請求、獲取結果,甚至是利用程序間通訊 (IPC) 跨程序執行這些操作。 僅當與另一個應用元件繫結時,繫結服務才會執行。 多個元件可以同時繫結到該服務,但全部取消繫結後,該服務即會被銷燬。

注意點:

  • 雖然本文件是分開概括討論這兩種服務,但是您的服務可以同時以這兩種方式執行,也就是說,它既可以是啟動服務(以無限期執行),也允許繫結。問題只是在於您是否實現了一組回撥方法:onStartCommand()(允許元件啟動服務)和 onBind()

    (允許繫結服務)。

  • 無論應用是處於啟動狀態還是繫結狀態,抑或處於啟動並且繫結狀態,任何應用元件均可像使用 Activity 那樣通過呼叫 Intent 來使用服務(即使此服務來自另一應用)。 不過,您可以通過清單檔案將服務宣告為私有服務,並阻止其他應用訪問。

  • 服務在其託管程序的主執行緒中執行,它既不建立自己的執行緒,也不在單獨的程序中執行(除非另行指定)。 這意味著,如果服務將執行任何 CPU 密集型工作或阻止性操作(例如 MP3 播放或聯網),則應在服務內建立新執行緒來完成這項工作。通過使用單獨的執行緒,可以降低發生“應用無響應”(ANR) 錯誤的風險,而應用的主執行緒仍可繼續專注於執行使用者與 Activity 之間的互動。

2、 使用服務還是執行緒

簡單地說,服務是一種即使使用者未與應用互動也可在後臺執行的元件。 因此,您應僅在必要時才建立服務。

如需在主執行緒外部執行工作,不過只是在使用者正在與應用互動時才有此需要,則應建立新執行緒而非服務。 例如,如果您只是想在 Activity 執行的同時播放一些音樂,則可在 onCreate() 中建立執行緒,在 onStart() 中啟動執行緒,然後在 onStop() 中停止執行緒。您還可以考慮使用 AsyncTaskHandlerThread,而非傳統的 Thread 類。

請記住,如果您確實要使用服務,則預設情況下,它仍會在應用的主執行緒中執行,因此,如果服務執行的是密集型或阻止性操作,則您仍應在服務內建立新執行緒。