天天看點

Android中的Service 與 Thread 的差別[轉]

很多時候,你可能會問,為什麼要用 service,而不用 thread 呢,因為用 thread 是很友善的,比起 service 也友善多了,下面我詳細的來解釋一下。

1). thread:thread 是程式執行的最小單元,它是配置設定cpu的基本機關。可以用 thread 來執行一些異步的操作。

2). service:service 是android的一種機制,當它運作的時候如果是local service,那麼對應的 service 是運作在主程序的 main 線程上的。如:oncreate,onstart 這些函數在被系統調用的時候都是在主程序的 main 線程上運作的。如果是remote service,那麼對應的 service 則是運作在獨立程序的 main 線程上。是以請不要把 service 了解成線程,它跟線程半毛錢的關系都沒有!

既然這樣,那麼我們為什麼要用 service 呢?其實這跟 android 的系統機制有關,我們先拿 thread 來說。thread 的運作是獨立于 activity 的,也就是說當一個 activity 被 finish 之後,如果你沒有主動停止 thread 或者 thread 裡的 run 方法沒有執行完畢的話,thread 也會一直執行。是以這裡會出現一個問題:當 activity 被 finish 之後,你不再持有該 thread 的引用。另一方面,你沒有辦法在不同的 activity 中對同一 thread 進行控制。

舉個例子:如果你的 thread 需要不停地隔一段時間就要連接配接伺服器做某種同步的話,該 thread 需要在 activity 沒有start的時候也在運作。這個時候當你 start 一個 activity 就沒有辦法在該 activity 裡面控制之前建立的 thread。是以你便需要建立并啟動一個 service ,在 service 裡面建立、運作并控制該 thread,這樣便解決了該問題(因為任何 activity 都可以控制同一 service,而系統也隻會建立一個對應 service 的執行個體)。

是以你可以把 service 想象成一種消息服務,而你可以在任何有 context 的地方調用 context.startservice、context.stopservice、context.bindservice,context.unbindservice,來控制它,你也可以在 service 裡注冊 broadcastreceiver,在其他地方通過發送 broadcast 來控制它,當然這些都是 thread 做不到的。

3、service的生命周期

oncreate  onstart  ondestroy  onbind 

1). 被啟動的服務的生命周期:如果一個service被某個activity 調用 context.startservice 方法啟動,那麼不管是否有activity使用bindservice綁定或unbindservice解除綁定到該service,該service都在背景運作。如果一個service被startservice 方法多次啟動,那麼oncreate方法隻會調用一次,onstart将會被調用多次(對應調用startservice的次數),并且系統隻會建立service的一個執行個體(是以你應該知道隻需要一次stopservice調用)。該service将會一直在背景運作,而不管對應程式的activity是否在運作,直到被調用stopservice,或自身的stopself方法。當然如果系統資源不足,android系統也可能結束服務。

2). 被綁定的服務的生命周期:如果一個service被某個activity 調用 context.bindservice 方法綁定啟動,不管調用 bindservice 調用幾次,oncreate方法都隻會調用一次,同時onstart方法始終不會被調用。當連接配接建立之後,service将會一直運作,除非調用context.unbindservice 斷開連接配接或者之前調用bindservice 的 context 不存在了(如activity被finish的時候),系統将會自動停止service,對應ondestroy将被調用。

3). 被啟動又被綁定的服務的生命周期:如果一個service又被啟動又被綁定,則該service将會一直在背景運作。并且不管如何調用,oncreate始終隻會調用一次,對應startservice調用多少次,service的onstart便會調用多少次。調用unbindservice将不會停止service,而必須調用 stopservice 或 service的 stopself 來停止服務。

4). 當服務被停止時清除服務:當一個service被終止(1、調用stopservice;2、調用stopself;3、不再有綁定的連接配接(沒有被啟動))時,ondestroy方法将會被調用,在這裡你應當做一些清除工作,如停止在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、當在旋轉手機螢幕的時候,當手機螢幕在“橫”“豎”變換時,此時如果你的 activity 如果會自動旋轉的話,旋轉其實是 activity 的重新建立,是以旋轉之前的使用 bindservice 建立的連接配接便會斷開(context 不存在了),對應服務的生命周期與上述相同。

5、在 sdk 2.0 及其以後的版本中,對應的 onstart 已經被否決變為了 onstartcommand,不過之前的 onstart 任然有效。這意味着,如果你開發的應用程式用的 sdk 為 2.0 及其以後的版本,那麼你應當使用 onstartcommand 而不是 onstart。

6、service 是android的一種機制,當它運作的時候如果是local service,那麼對應的 service 是運作在主程序的 main 線程上的。如果是remote service,那麼對應的 service 則是運作在獨立程序的 main 線程上,service和調用者之間的通訊都是同步的(不論是遠端service還是本地service),它跟線程一點關系都沒有!

7、thread 的運作是獨立于 activity 的,也就是說當一個 activity 被 finish 之後,如果你沒有主動停止 thread 或者 thread 裡的 run 方法沒有執行完畢的話,thread 也會一直執行。是以這裡會出現一個問題:當 activity 被 finish 之後,你不再持有該 thread 的引用,也就是你下次啟動的時候,無法控制之前建立的線程,而service則可以。另一方面,你沒有辦法在不同的 activity 中對同一 thread 進行控制。

8、你也可以在 service 裡注冊 broadcastreceiver,在其他地方通過發送 broadcast 來控制它,這些是 thread 做不到的。

from:http://blog.csdn.net/jiangwei0910410003/article/details/17008687

歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/p/4795111.html

繼續閱讀