一個啟動類型的服務是另一個組件通過調用startService()方法,產生一個調用服務的onStartCommand()方法而啟動的服務。
當一個服務被啟動時,它有一個獨立與啟動它的組件的生命週期,並且這個服務能夠無限期的在後台運行,即使啟動它的組件被銷毀了。因此這個服務應該在工作結束時通過調用stopSelf()方法來終止自己,或者另一個組件通過調用stopService()方法也能終止這個服務。
像Activity這樣的應用程式組件能夠通過調用startService()方法來啟動服務,並且給指定的服務傳遞一個Intent對象,同時包含一些服務所使用的資料。服務在onStartCommand()方法中接受這個Intent對象。
例如,假設一個Activity需要把一些資料儲存到線上資料庫中。這個Activity就能啟動一個服務,並且把要儲存的資料通過一個Intent對象傳遞給startService()方法。這個服務在onStartCommand()方法中接受這個Intent對象,串連到互連網,並且執行資料庫事務。當事務結束,這個服務就自己終止並銷毀。
警告:服務運行在與聲明它的應用程式相同的進程中,並且是在應用程式的主線程中。預設情況下,如果你的服務要執行密集或阻塞操作,而使用者又要跟同一個應用程式的一個Activity進行互動,那麼這個服務就會降低Activity的效能。要避免影響應用程式的效能,你應該在服務的內部啟動一個新的線程。
通常,你能夠繼承兩個類來建立被啟動類型的服務:
Service
這是所有服務的基類。當你繼承這個類時,重要的是你要給所有的服務工作建立一個新的線程,因為服務要使用你的應用程式的主線程,預設情況可能降低應用程式正在啟動並執行Activity的效能。
IntentService
這是一個Service類的子類,它使用背景工作執行緒來依次處理所有的啟動請求,如果你不想要服務同時處理多個請求,那麼這是最好的選擇。需要你做的所有工作就是實現onHandleIntent()方法,它接受每個啟動請求的Intent對象,以便完成後台工作。