1. 程式人生 > >安卓四大元件學習之Service

安卓四大元件學習之Service

Service

按官方原文件所說:Service是一個沒有介面在後臺執行耗時操作的應用元件。其他元件能夠啟動Service,並且當用戶切換到相應的應用場景,Service一樣能在後臺持續執行。另外一個元件還能繫結到Service與之互動(IPC通訊),所有這些活動都是在後臺進行的,Service有兩種狀態“啟動的”和“繫結的”。

Service的生命週期

Service的生命週期有2種:

呼叫StartService():onCreate->onstart->onStartCommand->onDestroy

呼叫BindService():onCreate->onBind->onUnBind->onDestroy

通過startService啟動服務處於“啟動的”狀態,這個時候不管啟動它的元件是否銷燬,Service會一直在後臺執行。通常started狀態的Service執行單任務,並且不回任何結果給啟動者,比如當下載或上傳一個檔案時,當任務完成Service就應該停止。

通過Bind啟動的服務處於“繫結的”狀態,這種方式一般結合AIDL使用(IPC通訊機制)。


AIDL的實現步驟:

(1)在Eclipse Android工程的Java包目錄中建立一個副檔名為aidl的檔案。該檔案的語法類似於Java程式碼,但會稍有不同。 (2)如果aidl檔案的內容是正確的,ADT會自動生成一個Java介面檔案(*.java)。 (3)建立一個服務類(Service的子類)。 (4)實現由aidl檔案生成的Java介面。 (5)在AndroidManifest.xml檔案中配置AIDL服務,尤其要注意的是,<action>標籤中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類的引數值。

特別要注意:如果啟動一個服務並且繫結服務,那麼在結束服務時必須先解綁再停止服務,直接停止服務Service並不會Destroy掉.

Service與Activity一樣都存在當前程序的主執行緒中,所以不能直接在Service裡面進行耗時操作,必須新開子執行緒。只是說在Serivce裡面的執行緒比在Activity中建立的執行緒更好管理。

IntentService

IntentService使用佇列的方式來處理多個Intent請求,對於非同步的Intent請求intentService會開啟一個wordThread執行緒在處理,並且採用佇列的模式處理完第一個再處理第二個。(onHandleIntent)

這裡就給我們提供了一個思路,與其在Service開啟新執行緒進行耗時操作,還不如直接使用IntentService來處理耗時操作。