2010年10月25日 星期一

Android Component Lifecycles - Service(二)

一.Service可以用以下兩種模式運作
1.被啟動後一直運行,直到被呼叫停止或自行停止
  外部利用呼叫Context.startService()啟動
  呼叫Context.stopService()停止
  Service內部自己執行Service.stopSelf()或
  Service.stopSelfResult()停止
  無論startService()呼叫了幾次,停止都只需要
  呼叫一次stopService()
2.利用與Service物件建立連線,使用連線呼叫使用Service
  Client利用Context.bindService()建立一個連線到Service物件,
  並使用這連線去呼叫Service。
  若要關閉連線則利用Context.unbindService()關閉連線
  多個client是可以綁定相同的service,如果要用的service還沒被
  啟動,在bindService()時會自動啟動它

這兩個模式並非是完全獨立的,你可以透過startService()後再bind Service。例如一個背景音樂播放的service利用傳遞一個包含音樂播放資訊的intent給startService(intent)來啟動,之後使用者要由這歌取得資訊,Activity會透過呼叫bindService()建立與service的連線,在這case裡stopService並不會真的停止service,因為已經被bind
需要unbind後才會完全停止。

二.Service LifeCycle Method
Service的lifeCycle method只有以下三個,你可以overroide來掌握state的變化。
與Activity的差別是,這裡的method是public,而Activity是protected
public void onCreate() 
public void onStart(Intent intent) 
public void onDestroy()

三.Service 的幾個階段
1.entire lifetime
    在onCreate與onDestroy()之間
    利用onCreate()來作初始化,而在onDestroy()釋放所有資源
    例如音樂播放service在onCreate()時產生thread來播放
    而在onDestroy()停止thread

2.active lifetime
    由onStart()開始,這階段會接收到由startService()傳來
    的intent物件。如果是一個音樂播放的Service會在這階段
    利用取得的intent物件,找到要播放的音樂資料做播放 

無論service是用Context.startService()或Context.bindService()啟動,都會觸發 onCreate()與onDestroy(),但onStart只有是在用 startService()啟動才會被觸發。

四.Bind流程會觸發的事件
如果透過Bind來使用Service,以下事件在過程中被觸發,可以透過實作以下method。
IBinder onBind(Intent intent) 
boolean onUnbind(Intent intent) 
void onRebind(Intent intent)

只要service 啟動後允許其他人來bind,那就會有以下事件會被觸發onBind() onUnbind()

在onBind()被傳入一個來自Activity執行bindService的intent物件。onUnBind()被傳入一個來自Activity執行unbindService()的intent物件。無論service是被用哪種方式啟動,都還是可以隨時去bind(),所以service都可以接收onBind()與onUnbind()事件。

沒有留言: