轉android-Service和Thread的區別

鴨脖發表於2012-08-18

servie是系統的元件,它由系統程式託管(servicemanager);它們之間的通訊類似於client和server,是一種輕量級的ipc通訊,這種通訊的載體是binder,它是在linux層交換資訊的一種ipc。而thread是由本應用程式託管。

1). Thread:Thread 是程式執行的最小單元,它是分配CPU的基本單位。可以用 Thread 來執行一些非同步的操作。

2). Service:Service 是android的一種機制,當它執行的時候如果是Local Service,那麼對應的 Service是執行在主程式的 main 執行緒上的。如:onCreate,onStart 這些函式在被系統呼叫的時候都是在主程式的main 執行緒上執行的。如果是Remote Service,那麼對應的 Service 則是執行在獨立程式的 main 執行緒上。

既然這樣,那麼我們為什麼要用 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 做不到的。

相關文章