Android程序開發入門——組件生命週期之Service

 還有論壇的朋友問到過關於service的運行模式問題,接下來我們來看看。

service有2種運行模式:

·      如果沒有程序停止它或者它自己停止,service將一直運行。在這種模式下,service開始於調用Context.startService() ,停止於Context.stopService(). service可以通過調用Service.stopSelf() 或 Service.stopSelfResult()停止自己。不管調用多少次startService() ,只需要調用一次 stopService() 就可以停止service。

·      可以通過接口被外部程序調用。外部程序建立到service的連接,通過連接來操作service。建立連接調開始於Context.bindService(), 結束於Context.unbindService(). 多個客戶端可以綁定到同一個service,如果service沒有啓動, bindService() 可以選擇啓動它。

這2種模式不是完全分離的。你可以可以綁定到一個通過startService()啓動的服務。如一個intent想要播放音樂,通過startService() 方法啓動後臺播放音樂的service。然後,也許用戶想要操作播放器或者獲取當前正在播放的樂曲的信息,一個activity就會通過bindService()建立一個到此service的連接. 這種情況下 stopService() 在全部的連接關閉後纔會真正停止service。

像activity一樣, service也有可以通過監視狀態實現的生命週期。但是比activity要少――只有3個――而且是public的而不是protected的

void onCreate() 
void onStart(Intent intent) 
void onDestroy()

通過實現這3個方法,可以監視service生命週期的2個嵌套循環:

·      整個生命週期 從onCreate() 開始,從onDestroy() 結束,像activity一樣, a service 在 onCreate()中執行初始化操作,在 onDestroy()中釋放所有用到的資源。如:後臺播放音樂的service可能在 onCreate()創建一個播放音樂的線程,在onDestroy()中銷燬這個線程。

·       活動生命週期 開始於 onStart(). 這個方法處理傳入到startService()方法的intent。 音樂服務會打開intent查看要播放哪首歌曲,並開始播放。

 當服務停止的時候,沒有方法檢測到――沒有 onStop() 方法。

onCreate() 和 onDestroy() 用於所有通過Context.startService() or Context.bindService() 啓動的service。onStart() 只用於通過startService()開始的service。

如果一個service是可以從外部綁定的,它就可以觸發以下的方法:

IBinder onBind(Intent intent) 
boolean onUnbind(Intent intent) 
void onRebind(Intent intent)

onBind() 回調被傳遞給調用bindService 的intent, onUnbind() 被unbindService()中的intent處理。如果服務允許被綁定,那麼onBind() 方法返回客戶端和sercie的溝通通道。如果一個新的客戶端連接到服務,onUnbind() 會觸發onRebind() 調用。

下面的圖表說明了sercice的回調方法。下面的圖片將通過 startService 和通過bindService()啓動的service分開了,但是要注意不管他們怎麼啓動的,都有可能被客戶端連接,因此都有可能觸發到onBind() 和 onUnbind() 方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章