Service
是一個可以在後臺執行長時間運行操作而不提供用戶界面的應用組件。服務可由其他應用組件啓動,而且即使用戶切換到其他應用,服務仍將在後臺繼續運行。
此外,組件可以綁定到服務,以與之進行交互,甚至是執行進程間通信 (IPC)。 例如,服務可以處理網絡事務、播放音樂,執行文件 I/O 或與內容提供程序交互,而所有這一切均可在後臺進行。一個服務不是一個單獨的進程。服務對象本身並不意味着它是在自己的進程中運行,除非另有規定,否則它與運行程序是同在一個進程中;
一個服務不是一個單獨的線程。Service和其他組件一樣,默認情況下,Service中的所有代碼都是運行在主線程中
Service存在的價值雖然不如Activity那麼清晰。但是一般都讓Service執行耗時較長的操作。例如:播放音樂、下載文件、上傳文件等等。但是因爲Service默認運行在主線程中,因此不能直接用它來做耗時的請求或者動作,最好在Service中啓動新線程來運行耗時的任務;
需要通過某一個Activity或其他Context對象來啓動Service。context.startService() 或 context.bindService();
Service很大程度上充當了應用程序後臺線程管理器的角色。(如果Activity中新開啓一個線程,當該Acitivyt關閉後,該線程依然在工作,但是與開啓它的Activity失去聯繫。也就是說此時的這個線程處於失去管理的狀態。但是使用Service,則可以對後臺運行的線程有效地管理。)
2.按照運行類別分類
使用前臺服務可以避免服務在後臺運行的時候被系統KILL。
無論應用是處於啓動狀態還是綁定狀態,抑或處於啓動並且綁定狀態,任何應用組件均可像使用 Activity 那樣通過調用 Intent 來使用服務(即使此服務來自另一應用)。 不過,可以通過清單文件將服務聲明爲私有服務,並阻止其他應用訪問。
onCreate():創建服務
onStartCommand():服務開始運行(在2.0以前版本中,使用onStart()回調方法)
onDestroy() :服務被停止
在程序中調用:context.startService() 會觸發執行Service生命週期中的onCreate()、onStartCommand()回調方法,此時服務就開始正式運行;
如果Service還沒有運行,則android先調用onCreate()然後調用onStartCommand();如果Service已經運行,則只調用onStartCommand(),所以一個Service的onStartC ommand方法可能會重複調用多次;
如果在程序中調用:context.stopService()會觸發執行Service生命週期中的onDestroy()回調方法,會讓服務停止;
stopService()的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService()的話,Service會一直在後臺運行。該Service的調用者再啓動該Service後可 以通過stopService關閉Service;stopSelf()
所以StartService的生命週期爲:onCreate --> onStartCommand(可多次調用) --> onDestroy。
onCreate():創建服務
onBind():綁定服務,服務開始運行
onUnbind():取消綁定
onDestroy() :服務被停止
【詳細說明:】
在程序中調用:context.bindService()會觸發執行Service生命週期中的onCreate()、onBind()回調方法,此時服務開始運行;
onBind將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態或其他操作。此後調用者(Context,例如Activity)會和Service綁定在一起;
如果調用Service的調用者Context退出了,那麼會依次調用Service生命週期中的onUnbind()、onDestroy()回調方法,會讓服務停止;
所以BindService的生命週期爲:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。