1. 程式人生 > >service和thread的區別,何時用service,何時用thread?

service和thread的區別,何時用service,何時用thread?

出自:http://www.maiziedu.com/group/article/9550/

按服務性質分local service和remote service

當它執行的時候如果是Local Service,那麼對應的 Service是執行在主程序的 main 執行緒上的。如:onCreate,onStart 這些函式在被系統呼叫的時候都是在主程序的 main 執行緒上執行的,如果此時你在Service裡編寫了非常耗時的程式碼,程式必定會出現ANR的!

當它執行的時候如果是Remote Service,那麼對應的 Service 則是執行在獨立程序的 main 執行緒上。

按啟動方式分bindService和startedService 

其中bindService更類似於客戶端和服務端,是一種輕量級的ipc通訊,這種通訊的載體是binder,它是在linux層交換資訊。

那麼Service和Thread到底什麼聯絡,為什麼很多人都容易混淆二者?

之所以有不少人會把它們聯絡起來,主要就是因為Service的後臺概念。Thread我們大家都知道,是用於開啟一個子執行緒,在這裡去執行一些耗時操作就不會阻塞主執行緒的執行。而Service我們最初理解的時候,總會覺得它是用來處理一些後臺任務的,一些比較耗時的操作也可以放在這裡執行,這就會讓人產生混淆了。

其實Service和Thread根本就不是一個級別的東西,Service是系統的四大元件之一,Thread只是一個用來執行後臺任務的工具類,由當前程式託管,而service託管於系統的servicemanager。這樣做的目的是因為Thread獨立於activity,一旦activity結束,該執行緒也不一定會執行完成,而此時你不再持有該thread的引用,你無法在控制他了。而且我們有的時候也需要多個不同的activity控制一個服務。這些thread都不能實現,所以我們引進service。 

總結:

       Service是系統的四大元件之一,Thread只是一個用來執行後臺任務的工具類

  1. Service可以設定獨立的程序;Thread不可以,只能存在於程序中。

  2. Service有自己的生命週期。如果是以bind的方式啟動,生命週期跟activity相同。如果是以start方式啟動,不呼叫stop會一直執行在後臺;Thread執行完了就結束了,啟動後跟activity沒有關係了,哪怕activity結束了,thread也會在後臺執行。

  3. 不同的Activity可以呼叫同一個Service;不同的Activity不能呼叫同一個Thread。

  4. Service如果是執行在後臺的,可以註冊接收系統或自定義廣播;Thread不能接收廣播

  5. 不同的應用程式可以共享同一Service,但不能共享同一Thread。

  6. service中可以建立thread,避免ANR。

  7. Thread在後臺執行(Activty stop)的優先順序低於後臺執行的Service,如果執行系統資源緊張,會優先殺死前一種,後臺執行的Service一般情況下不會被殺死,如果被殺死,系統空閒時會重新啟動service.

什麼時候用Service,什麼時候用多執行緒?

從邏輯上你認為需要一個後臺操作,但跟我們現在主執行緒操作通訊頻繁,邏輯關係緊密,就用多執行緒(直接用)

比如你要下載圖片,然後在當前activity上顯示,那就用多執行緒

能夠從邏輯上區分開來,又或者耗時較長,就用後臺服務

比如下載電影就用service,這樣即使來電話了,也不影響下載