Android – Service 基本觀念

簡單認識 Context


玩到現在, 有一個很重要的東西, 就是 android.app.Context, 就是前面單元曾經提到的 Context.

這是在 Android 的應用程式架構下, 非常重要的一個類別. 只要是 Context 的物件實體, 就可以透過該物件實體的屬性及方法來處理大多數的執行相關的資源及參數. 也就是在一個 Android 應用程式中, 算是關鍵性的角色物件實體. 但是, 不是一個 Android App只有一個 Context, 舉凡是 android.app.Activity 或是前面單元提到的 android.app.Application 都是, 當然, 既然會在此處探討 Context, 想當然的, Service 也是一個 Context 物件實體. 來吧!

Application is-a Context

Activity is-a Context

Service is-a Context

這三樣物件都是 Context, 這是從物件導向的繼承觀念看到的現象, 回到應用程式的架構來看. 一個 Application 中, 可能會由多個 Activity 或是 Service 所構成.

 

認識 Service


Service 是個不具備使用者介面且能長時間在背景執行的應用程式元件,由於執行時處於背景中所以通常使用者無法察覺到 Service,但是也存在能被使用者察覺的 Service,當 Service被啟動後就算使用者離開應用程式,Service 也會繼續在背景中執行,此外應用程式元件也能夠與 Service 繫結,這樣做可以方便與 Service 進行通訊。例如,播放音樂,如開始、暫停與上下一首,這些操作會被扔入背景中執行,這樣的好處在於如果使用者只要無意關閉音樂,就算 Activity 遭到關閉,音樂也能繼續播放。

Service 兩種形式:

  • 啟動:
    代表應用程式元件 Activity 呼叫 startService() 來啟動 Service。 Service 啟動後會在背景中執行,就算啟動 Service 的Activity應用程式元件已經終結了也不受到影響。
  • 繫結:
    代表應用程式元件 Activity 呼叫 bindService() 來繫結 Service。被繫結的 Service 為了讓元件能與 Service 進行互動、傳送要求與取得結果,提供了主從式介面。

 

兩種形式的差異在於,啟動的 Service 被應用程式元件啟動後,Service 不會受到啟動的應用程式元件狀態影響,不管啟動的應用程式元件的狀態變更為 onStop() 或者 onDestroy(),Service 會持續在背景中執行工作,除非呼叫 Service 的 onDestroy()來進行終止;反觀繫結的 Service 繫結至應用程式元件後,如果這個應用程式元件狀態變更為onStop() 或者 onDestroy(),繫結的 Service 也會遭到終止。

 

建立 Service


首先建立一個 Service 的子類別,可以Override這些方法, 但並不是全部都需要:

  • onCreate():Service 初次建立時呼叫,您應在此方法中進行初始化的設定程序,當Service 已經執行此方法不會再被呼叫。
  • onStartCommand():當應用程式元件透過呼叫 startService() 時,系統會呼叫此方法來回應呼叫端,Service 就會啟動然後在背景中執行。當任務完成後您應當呼叫stopSelf() 或 stopService()來終止此服務。
  • onBind():應用程式元件透過呼叫  bindService()) 來與 Service 繫結時,系統會呼叫此方法傳回 IBinde,如果您允許繫結,請提供使用者端能夠與 Service 互動的介面,如果不允許的話請傳回 null即可。
  • onDestroy():當 Service 不在需要且正在終結時,系統會呼叫此方法。

 

生命週期


Service的生命週期分為兩種路徑:

  • 已啟動的 Service:當應用程式元件乎叫 startService() 後,Service 會在背景中無限次數執行,直到透過呼叫 stopService() 來停止Service,Service遭停止後系統會終結此Service。
  • 已繫結的 Service:當應用程式元件乎叫 bindService() 後,應用程式元件則為用戶端,用戶端久可以使用 Service 提供的介面與 Service 進行通訊,多個用戶端可以繫結至同一個 Service 。當用戶端想關閉 Service 只需呼叫 unbindService() 來切斷連線,如果有多個用戶端的話,則需要所有的用戶端都切斷連線 Service才會被系統終止。

 

這兩種生命週期的路徑並非完全獨立的,也就是這兩種路徑會互相影響。例如,有一個啟動的Service 在背景中持續播放音樂,但之後,使用者想透過透過一個介面來取得歌曲資訊或者進行操作,如開始、暫停與上下一首,於是當前的應用程式元件呼叫 bindService() 繫結至Service,這樣的情況下呼叫 stopService() 或 stopSelf() 是不會停止 Service 的,直到所有與Service 繫結的元件切斷連線, Service 才會終止。

 

 

 

 

%d bloggers like this: