一、爲何不使用後臺線程而使用Service?android
1)、Service能夠放在獨立的進程中,因此更安全;
2)、使用Service能夠依賴現有的binder機制,不須要在應用層面上處理線程同步的繁雜工做;
3)、系統能夠從新啓動異常死去的Service。安全
二、 Service 與 Activity 的相同點與不一樣點:spa
不一樣點:Activity是與用戶交互的組件,便可以看到UI界面,而Service是在後臺運行、無需界面;
相同點:使用Activity 時咱們須要在配置文件中聲明<activity>標籤,一樣的使用Service 也須要在配置文件中聲明<service>
標籤。
都具備必定的生命週期。線程
啓動service有兩種方法:orm
1)、 Context.startService()
調用者與服務之間沒有關聯,即便調用者退出,服務仍可運行對象
Started Service的生命週期:
onCreate():建立服務
onStartCommand():服務開始運行(在2.0之前版本中,使用onStart()回調方法)
onDestroy() :服務被中止接口
【詳細說明:】生命週期
在程序中調用: context.startService() 會觸發執行Service生命週期中的onCreate()、onStartCommand()回調方法,進程
此時服務就開始正式運行;若是Service尚未運行,則android先調用onCreate()而後調用onStartCommand();同步
若是Service已經運行,則只調用onStartCommand(),因此一個Service的onStartCommand方法可能會重複調用屢次;
若是在程序中調用:context.stopService()會觸發執行Service生命週期中的onDestroy()回調方法,會讓服務中止;
stopService()的時候直接onDestroy,若是是調用者本身直接退出而沒有調用stopService()的話,Service會一直在後臺運行。
該Service的調用者再啓動該Service後能夠經過stopService關閉Service;stopSelf()
因此StartService的生命週期爲:onCreate --> onStartCommand(可屢次調用) --> onDestroy。
=====================
2)、 Context.bindService()
調用者與服務綁定在一塊兒,調用者一旦退出,服務也就終止
Bound Service的生命週期:
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。
===================================
根據啓動方式將本地服務分爲:啓動服務Started Service和綁定服務Bound Service。【重點】
Started Service:被啓動的服務被啓動的服務是由其它組件調用startService()方法而啓動的,
該方法會致使被啓動服務的生命週期方法onStartCommand()被回調。當服務是被啓動狀態後,
其生命週期與啓動它的組件無關,即便啓動服務的組件(Activity,BroadcastReceiver)
已經被銷燬,該服務還能夠在後臺無限期運行。除非調用stopSelf()或stopService()來中止該服務。
Bound Service:被綁定的服務綁定服務是容許其它應用程序綁定而且與之交互的Service的實現類。
爲了提供綁定,必須實現onBind()回調方法。該方法返回IBinder對象,它定義了服務類與Activity交互的程序接口。
Activity經過bindService()方法綁定到服務類,同時Activity必須提供ServiceConnection接口的實現類,
它監視Activity與服務類之間的鏈接。在重寫ServiceConnection接口的onServiceConnected()方法時,
實現了將服務類順利賦值到了Activity中,實現了在Activity中使用該服務類並執行其中的方法。
【 備註: 】
Service是不能本身啓動的,只有經過 Context 對象調用startService() 和bindService() 方法來啓動。
在Service每一次的開啓關閉過程當中,只有onStartCommand()可被屢次調用(經過屢次startService調用),其餘
onCreate()、onBind()、onUnbind()、onDestory()在一個生命週期中只能被調用一次。