Service有哪些啓動方法?有什麼區別

  • 什麼是Service : 
 
        Service,看名字就知道跟正常理解的“服務”差不多,後臺運行,可交互這樣的一個東西。它跟Activity的級別差不多,但是他 
不能自己運行,需要通過某一個Activity或者其他Context對象來調用, Context.startService() 和 Context.bindService()。 
 
  • 兩種啓動Service的方式有所不同 : 
        如果在Service的onCreate或者onStart做一些很耗時間的事情,最好在 Service裏啓動一個線程來完成,因爲Service是跑在主線程中,會影響到UI操作或者阻塞主線程中的其他事情。 
  
  • 什麼時候需要Service : 
        比如播放多媒體的時候用戶啓動了其他Activity這個時候程序要在後臺繼續播放,比如檢測SD卡上文件的變化,再或者在後臺記錄你地理信息位置的改變等等,總之服務嘛,總是藏在後頭的。 
  

  • Service的調用 :

         1.Context.startService():Service會經歷onCreate -> onStart(如果Service還沒有運行,則android先調用onCreate()然後調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次 );stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後臺運行。該Service的調用者再啓動起來後可以通過stopService關閉Service。 注意,多次調用Context.startservice()不會嵌套(即使會有相應的onStart()方法被調用),所以無論同一個服務被啓動了多少次,一旦調用Context.stopService()或者stopSelf(),他都會被停止。補充說明:傳遞給startService()的Intent對象會傳遞給onStart()方法。調用順序爲:onCreate --> onStart(可多次調用) --> onDestroy。 
 
        2. Context.bindService():Service會經歷onCreate() -> onBind(),onBind將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態或其他操作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind -> onDestroyed相應退出,所謂綁定在一起就共存亡了 。 
 
        補充說明:傳遞給bindService()的Intent對象會傳遞給onBind(),傳遞給unbindService()的Intent對象會傳遞給onUnbind()方法。 調用順序爲:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。 
 
        注意事項:在Service每一次的開啓關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。還有一點,目前我沒有遇到過需要startService和bindService交互使用的情況(我認爲不會有這種需求),所以不必去考慮交互的問題,待遇到時再考慮不遲。 
adcastReceiver只能通過startService啓動Service ,因爲廣播本身生命週期很短,bind的話沒有意義 
 

  • Service的生命週期 :


Service的生命週期方法比Activity少一些,只有onCreate, onStart, onDestroy我們有兩種方式啓動一個Service,他們對Service 生命週期的影響是不一樣的。 
 
1.通過startService 
        Service會經歷 onCreate -> onStart, stopService的時候直接onDestroy 
        如果是調用者(TestServiceHolder)自己直接退出而沒有調用stopService的話,Service會一直在後臺運行。 
        下次TestServiceHolder再起來可以stopService。 
2.通過bindService    
        Service只會運行onCreate, 這個時候 TestServiceHolder 和TestService綁定在一起 
        TestServiceHolder 退出了,Srevice就會調用onUnbind->onDestroyed所謂綁定在一起就共存亡了。
其實還有第三種,就是跨進程通信:AIDL。這也可以啓動服務。





轉載出處:http://blog.csdn.net/u010431640/article/details/50680924
圖出處:https://www.cnblogs.com/mengdd/archive/2013/03/24/2979944.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章