Service的簡單介紹
來自: http://my.oschina.net/u/2542711/blog/617851
1、為什么不使用后臺線程而使用Service?
1)、Service可以放在獨立的進程中,所以更安全;
2)、使用Service可以依賴現有的binder機制,不需要在應用層面上處理線程同步的繁雜工作;
3)、系統可以重新啟動異常死去的Service。
2、 Service 與 Activity 的相同點與不同點:
不同點:Activity是與用戶交互的組件,即可以看到UI界面,而Service是在后臺運行、無需界面;
相同點:使用Activity 時我們需要在配置文件中聲明<activity>標簽,同樣的使用Service 也需要在配置文件中聲明<service>
標簽。
都具有一定的生命周期。
啟動service有兩種方法:
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()在一個生命周期中只能被調用一次。