Android中Service和Thread區別

在工作中,有時會被人問到,Android中的Service和Thread有什麼區別,爲什麼有時放着方便的Thread不用,而去使用Service呢?
首先,要說明的是,進程是系統中最小的資源分配單位,而線程是最小的執行單位,線程需要的資源通過它所在的進程獲取。
區別:
Thread:Thread是程序執行的最小單元,可以用Thread來執行一些異步的操作。
Service:是Android的四大組件之一,被用來執行長時間的後臺任務。這裏的後臺指的是,它的運行是完全不依賴UI的。但是還是運行在主進程的main線程上的。也就是說如果你在Service裏執行了非常耗時的代碼,程序同樣會出現ANR的。總之,Service和Thread之間沒有任何關係!

Thread的運行是獨立的,也就是說當一個Activity被finish之後,如果沒有主動停止Thread或者Thread裏面的run方法沒有執行完畢的話,Thread會一直執行。因此會出現一個問題:當Activity被finish之後,不再持有該Thread的引用,也就是不能在控制該thread,另外,我們無法在不同的Activity中對同一個Thread進行控制。
這時,如果創建並啓動一個 Service ,在 Service 裏面創建、運行並控制該 Thread,這樣便解決了該問題(因爲任何 Activity 都可以控制同一個Service,而系統也只會創建一個對應 Service 的實例)。
因此可以把 Service 想象成一種消息服務,可以在任何有 Context 的地方調用 Context.startService、Context.stopService、Context.bindService、Context.unbindService來控制它,也可以在 Service 裏註冊 BroadcastReceiver,通過發送 broadcast 來達到控制的目的,這些都是 Thread 做不到的。

所以,其實我們不要把後臺和子線程聯繫在一起,這是兩個完全不同的概念。Android的後臺就是指,它的運行是完全不依賴UI的。即使Activity被銷燬,或者程序被關閉,只要程序進程還在,Service就可以繼續運行。你可能又會問,前面不是說過Service是運行在主線程裏的麼?在這裏一直執行着耗時連接,難道就不會阻塞主線程的運行嗎?當然會,但是我們可以在Service中再創建一個子線程,然後在這裏去處理耗時邏輯就沒問題了。

如果在Service裏創建一個子線程,那爲什麼不直接在Activity裏創建呢?這是因爲Activity很難對Thread進行控制,當Activity被銷燬之後,就沒有任何其它的辦法可以再重新獲取到之前創建的子線程的實例。而且在一個Activity中創建的子線程,另一個Activity無法對其進行操作。但是Service就不同了,所有的Activity都可以與Service進行關聯,然後可以很方便地操作其中的方法,即使Activity被銷燬了,之後只要重新與Service建立關聯,就又能夠獲取到原有的Service中Binder的實例。因此,使用Service來處理後臺任務,Activity就可以放心地finish,完全不需要擔心無法對後臺任務進行控制的情況。

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