一.service是什么?
service是一個服務,是一種可以在后臺執(zhí)行長時間運行操作而沒有用戶界面的應用組件,可以用activity和broadcast啟動,service只要啟動就會在后臺一直運行,哪怕啟動他的activity已經(jīng)被銷毀也不會受影響,當然也可以綁定activity可以與ACitivy進行通訊,service是運行在主線程中,不能做耗時操作
二.service的應用場景,以及 和Thread區(qū)別
service的定義:看第一條
thread的定義:Thread 是程序執(zhí)行的最小單元,它是分配CPU的基本單位捷绒∩兀可以用 Thread 來執(zhí)行一些異步的操作。而Thread分為main線程和子線程倦始。我們通常做的費時操作都會放到子線程中,而和UI刷新的功能都放到了main線程中。
使用場景:
由以上定義可見意狠,兩者并沒有什么關系悲酷。先說一下為什么會有Service這個組件套菜,為什么會有它和Thread自身缺點有關系,因為只使用Thread無法解決問題设易。我們知道他們兩個都是在后臺執(zhí)行任務逗柴,都沒有界面。
我們在使用Thread啟動一個子線程來干一些費時的操作時顿肺,這個子線程一般是由Activity來啟動執(zhí)行的(假如說沒有Service組件)戏溺,而Thread子線程 的運行是獨立于 Activity 的,那么當一個 Activity 被 finish 之后屠尊,如果你沒有主動停止 Thread 或者 Thread 里的 run 方法沒有執(zhí)行完畢的話旷祸,Thread 并不會結束,它會一直執(zhí)行下去讼昆。因此這里會出現(xiàn)一個問題:當 Activity 被 finish 之后托享,你不再持有該 Thread 的引用,你就無法對其進行控制浸赫。
另一方面闰围,你也沒有辦法在不同的 Activity 中對同一Thread 進行控制。
舉個例子:如果你的 Thread 需要不停地過一段時間就要連接服務器一次做某種同步既峡,該 Thread 需要在 Activity 退出后也在運行羡榴。這個時候你就沒有辦法在您啟動的 Activity 里面控制之前Activity創(chuàng)建的 Thread,這樣這個子線程就相當于一個“野線程”了运敢,你無法對其進行狀態(tài)監(jiān)聽和控制校仑。
那這個時候Service的價值和意義就體現(xiàn)出來了忠售,你可以創(chuàng)建并啟動一個 Service ,在 Service 里面就可以一直創(chuàng)建迄沫,運行并控制該 Thread了稻扬,不用擔心Service退出之后無法再控制Thread,因為Service會一直運行在后臺邢滑,它沒有Activity的界面腐螟,不會“顯式”的退出。這樣便解決了上面使用Thread存在的問題困后。
由以上說明乐纸,你應該清楚了他們的各自職責,以及使用場景了摇予。
注意事項:
在使用Service時也有很多坑需要我們留意汽绢。
(1)、在調用 bindService 綁定到Service的時候侧戴,應當保證退出時調用 unbindService 解除綁定宁昭,這是一個好的習慣,有始有終酗宋。盡管 Activity 被 finish 的時候綁定會自動解除积仗,并且Service會自動停止;
(2)蜕猫、應當注意使用 startService 啟動服務之后寂曹,一定要使用 stopService停止服務,不管你是否使用bindService回右;
(3)隆圆、同時使用 startService 與 bindService 要注意到,Service 的終止翔烁,需要unbindService與stopService同時調用渺氧,才能終止 Service,不管 startService 與 bindService 的調用順序蹬屹,如果先調用 unbindService 此時服務不會自動終止侣背,再調用 stopService 之后服務才會停止,如果先調用 stopService 此時服務也不會終止慨默,而再調用 unbindService 或者之前調用 bindService 的 Context 不存在(如Activity 被 finish 的時候)后服務才會自動停止秃踩;
(4)、在 sdk 2.0 及其以后的版本中业筏,對應的 onStart 已經(jīng)被升級成了 onStartCommand,不過之前的 onStart 任然有效鸟赫。這意味著蒜胖,如果你開發(fā)的應用程序用的 sdk 為 2.0 及其以后的版本消别,那么你應當使用 onStartCommand 而不是onStart。
(5)台谢、你也可以在 Service 里注冊 BroadcastReceiver寻狂,在其他地方通過發(fā)送 broadcast 來控制它,這些是 Thread 做不到的朋沮。
三.開啟service的兩種方式
它的生命周期包含如下方法蛇券,
● onCreate
創(chuàng)建服務
● onStart(或onStartCommand)
開始服務
● onDestroy
銷毀服務
● onBind
綁定服務
● onUnbind
解綁服務
啟動或者綁定服務對應的方法有,
● startService()
啟動服務
使用startService方式啟動服務樊拓。
如果一個Service被某個Activity 使用 startService 方法啟動纠亚,那么不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都在后臺運行筋夏,但它依舊運行于main線程蒂胞。如果這個Service被startService方法多次啟動,那么onCreate方法只會調用一次条篷,onStart將會被調用多次(對應調用startService的次數(shù))骗随,并且系統(tǒng)只會創(chuàng)建Service的一個實例。該Service將會一直在后臺運行赴叹,即使啟動它的Activity已經(jīng)退出鸿染,它直到某個activity調用stopService,或自身調用的stopSelf方法才會結束服務乞巧。當然如果系統(tǒng)資源不足涨椒,android系統(tǒng)也可能結束服務。
● bindService()
綁定服務
使用bindService方式啟動服務摊欠。
如果一個Service被某個Activity 調用 bindService 方法綁定啟動丢烘,不管調用 bindService 調用幾次,onCreate方法都只會調用一次些椒,同時onStart方法不會被調用播瞳。當連接建立之后,Service將會一直運行免糕,除非調用unbindService 方法斷開連接或者之前調用bindService 的 Context 不存在了(如Activity被finish的時候)赢乓,系統(tǒng)才會自動停止Service,對應onDestroy將被調用石窑。
還有一中復雜用法牌芋,就是同時使用startService和bindService方式啟動服務战授。如果一個Service又被啟動又被綁定扁凛,則該Service將會一直在后臺運行。并且不管如何調用蹈集,onCreate始終只會調用一次经宏,對應startService調用多少次犀暑,Service的onStart便會調用多少次驯击。調用unbindService將不會停止Service,而必須由外界的activity調用 stopService 或 Service自身調用stopSelf 來停止服務耐亏。
另外徊都,還有停止服務和解除綁定服務的方法,
● stopService()
關閉服務
● unbindService()
解綁服務