Android中Service概述

孫群發表於2015-08-15

Service是Android中一種很重要的元件,一般來說有兩種用途:用Service執行長期執行的操作,並且與使用者沒有UI介面的互動;某個應用程式的Service可以被其他應用程式的元件呼叫以便提供更廣泛的使用。要想使得自己寫的Service能夠正常執行,必須在AndroidManifest.xml中通過標籤註冊Service,類似於通過標籤註冊Activity一樣。有兩種方式使用Service,一種是通過Context類的startService方法啟動Service,另一種是通過Context類的bindService方法啟動Service。

需要注意的是,與其他的應用程式元件一樣,Service預設情況下是執行在其所在宿主程式的主執行緒中的。也就是說如果我們在Service要做一些CPU密集型操作(比如播放MP3)或阻塞式操作(比如網路請求),那麼主執行緒就會卡死,出現ARN(Application Not Responding)程式無響應現象,為了解決這種問題,我們應該在Service中建立一個新執行緒,然後將這些耗時操作放入到該新建立的執行緒中去執行,這樣不會阻塞主執行緒。

為了搞明白Service是什麼,我們首先要知道Service不是什麼:
a. 首先Service不是另一個獨立的程式。 Service不會自己開闢一個新的程式,除非特別指定,預設情況下Service是執行在應用程式所屬的程式中。
b. Service不是另一個新執行緒。Service的操作都是在主執行緒中執行的,為了避免阻塞主執行緒,在Service中應該將耗時操作放入到一個新執行緒中執行。

通過上面的描述我們知道,Service其實很簡單(沒有開創新的程式和新的執行緒),Service提供了以下兩個主要的特性:
a. 作為應用程式的一部分執行在後臺,並且甚至不需要和使用者進行互動。這種情況下,我們一般呼叫Context的startService方法(比如在Activity中呼叫startSerivce方法)啟動service。
b. 作為某個應用程式的元件暴露出去,使得其他的應用程式可以呼叫該Service。這種情況下,我們一般呼叫Context的bindService方法,比如我們有兩個應用App1和App2,在App1中我們有一個Service叫做App1Service,在App2中我們有一個Acitivity叫做App2Activity,即便App1沒有啟動,我們在App2的App2Activity中也可以通過呼叫bindService啟動App1中的App1Service,並且通過呼叫bindService之後,在Service和呼叫者之間會建立連線進行程式間互動。

後續會寫文章分別介紹startService與bindService的使用示例以及生命週期。

相關博文:
Android中startService的使用及Service生命週期
Android通過startService播放背景音樂簡單示例
Android通過startService實現批量下載示例
Android中IntentService的使用及其原始碼解析
Android中bindService的使用及Service生命週期
Android中通過Messenger與Service實現程式間雙向通訊

相關文章