淺談service ,歡迎補充。 Service《一》
一、簡單介紹
Android 的第三大組件----------服務。
不給用戶提供界面。與activity一樣在main線程中執行。把一些耗時操作放在service中的其他線程執(意在處理耗時操作時,在service開闢其他線程來完成操作)。
<一> 繼承關係:
↳ |
|||
|
↳ |
||
|
|
↳ |
android.app.Service |
<二> 兩種service啓動的生命週期圖:
注:上圖中onStartCommand()方法 即可理解爲onstart()方法。
解釋:
1、onCreate() 該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創建一次。onDestroy()該方法在服務被終止時調用。
2. Context.startService()啓動Service的生命週期:
方法onStart() 只有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法儘管不會多次創建服務,但onStart() 方法會被多次調用。
3. Context.bindService()啓動Service生命週期:
方法onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。onUnbind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用。
二、具體實現:
第一步:自定義一個類繼承自service
第二步:重寫需要重寫的方法
第三步:根據不同的啓動方式,定義不同的參數。
第四步:調用服務
兩種啓動方式Context.startService() and Context.bindService().
<一> startService(intent)
調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。
1、使用context.startService()啓動該服務
服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調onStart()方法。
2、採用Context.stopService()方法或者是Service.stopSelf()結束服務,服務結束時會調用onDestroy()方法
<二> bindservice(intent,serviceconnection,flags);
Serviceconnection關於這個參數,作如下解釋:
顧名思義----服務連接。是在服務與綁定者之間連接作用。是一個接口,內有兩個抽象方法
Summary
Public Methods |
|
abstract void |
onServiceConnected(ComponentName name, IBinder service) Called when a connection to the Service has been established, with the IBinder of the communication channel to the Service. |
abstract void |
onServiceDisconnected(ComponentName name) Called when a connection to the Service has been lost. |
|
|
注:鏈接可以反覆建立,並且永遠是最新的一個連接。就是說可以new好多,但最新的一個起作用。
調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。
1、使用context.bindService()啓動服務
在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一起。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用)。多個客戶端可以綁定至同一個服務。
2、使用unbindService()停止服務或直接退出停止服務。
調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。
注:當activity finish時 ,那麼與他綁定的service會自動onunbind()、 ondestroy()
三、啓動方式的選擇;
沒有嚴格的界限,需要在開發過程中尋找。
附註:需要說明的幾點:
官方文檔告訴我們,一個service可以同時start並且bind,在這樣的情況,系統會一直保持service的運行狀態如果service已經start了或者BIND_AUTO_CREATE標誌被設置。如果沒有一個條件滿足,那麼系統將會調用onDestory方法來終止service.所有的清理工作(終止線程,反註冊接收器)都在onDestory中完成。
擁有service的進程具有較高的優先級
官方文檔告訴我們,Android系統會盡量保持擁有service的進程運行,只要在該service已經被啓動(start)或者客戶端連接(bindService)到它。當內存不足時,需要保持,擁有service的進程具有較高的優先級。
1. 如果service正在調用onCreate,onStartCommand或者onDestory方法,那麼用於
當前service的進程則變爲前臺進程以避免被killed。
2. 如果當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,
但是比那些不可見的進程更重要,這就意味着service一般不會被killed.
3. 如果客戶端已經連接到service (bindService),那麼擁有Service的進程則擁有最高的優先級,
可以認爲service是可見的。
4. 如果service可以使用startForeground(int, Notification)方法來將service設置爲前臺狀態,
那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。
在 AndroidManifest.xml 裏 Service 元素的常見選項
android:name ------------- 服務類名
android:label -------------- 服務的名字,如果此項不設置,那麼默認顯示的服務名則爲類名
android:icon -------------- 服務的圖標
android:permission ------- 申明此服務的權限,這意味着只有提供了該權限的應用才能控制或連接此服務
android:process ---------- 表示該服務是否運行在另外一個進程,如果設置了此項,那麼將會在包名後面加上這段字符串表示另一進程的名字
android:enabled ---------- 如果此項設置爲 true,那麼 Service 將會默認被系統啓動,不設置默認此項爲 false
android:exported --------- 表示該服務是否能夠被其他應用程序所控制或連接,不設置默認此項爲 false