天天看點

Android 四大元件之 Service(一)

      Service是Android中四大元件之一,在Android開發中起到非常重要的作用,它運作在背景,不與使用者進行互動。

1、Service的繼承關系:

java.lang.Object → android.content.Context → android.content.ContextWrapper → android.app.Service

2、Sevice定義:

     Service(服務)是一個沒有使用者界面的在背景運作執行耗時操作的應用元件。其他應用元件能夠啟動Service,并且當使用者切換到另外的應用場景,Service将持續在背景運作。另外,一個元件能夠綁定到一個service與之互動(IPC機制),例如,一個service可能會處理網絡操作,播放音樂,操作檔案I/O或者與内容提供者(content provider)互動,所有這些活動都是在背景進行。

3、Service有兩種狀态," 啟動的 " 和 " 綁定 ":

[1]通過startService()啟動的服務處于" 啟動的 "狀态,一旦啟動,service就在背景運作,即使啟動它的應用元件已經被銷毀了。通常started狀态的service執行的任務并且不傳回任何結果給啟動者。比如當下載下傳或上傳一個檔案,當這項操作完成時,service應該停止它本身。

[2]" 綁定 "狀态:通過調用bindService()來啟動,一個綁定的service提供一個允許元件與service互動的接口,可以發送請求、擷取傳回結果,還可以通過誇程序通信來互動(IPC)。綁定的service隻有當應用元件綁定後才能運作,多個元件可以綁定一個service,當調用unbind()方法時,這個service就會被銷毀了。

注意:預設情況下,service與activity一樣都存在與目前程序的主線程中,是以,一些阻塞UI的操作,比如耗時操作不能放在service裡進行,比如另外開啟一個線程來處理諸如網絡請求的耗時操作。如果在service裡進行一些耗CPU和耗時操作,可能會引發ANR警告,這時應用會彈出是強制關閉還是等待的對話框。是以,對service的了解就是和activity平級的,隻不過是看不見的,在背景運作的一個元件,這也是為什麼和activity同被說為Android的基本元件。啟動後的Service具有較高的優先級,一般情況下,系統會保證Service的正常運作,隻有目前台的Activity正常運作的資源被Service占用的情況下,系統才會停止Service;當系統重新獲得資源後,會根據程式的設定來決定是否重新啟動原來的Service。

4、Service的生命周期:

        

Android 四大元件之 Service(一)

 注意:bind service的不同之處在于當綁定的元件銷毀後,對應的service也就被kill了。

service生命周期也涉及一些回調方法,這些方法都不用調用父類方法,具體如下:

5、Service的一個子類:IntentService

      IntentService使用隊列的方式将請求的Intent加入隊列,然後開啟一個worker thread(線程)來處理隊列中的Intent,對于異步的startService請求,IntentService會處理完成一個之後再處理第二個,每一個請求都會在一個單獨的worker thread中處理,不會阻塞應用程式的主線程,是以,這裡提供一個思路,如果有耗時的操作與其在Service裡面開啟新線程還不如使用IntentService來處理耗時操作。而在一般的繼承Service裡面如果要進行耗時操作就必須另開線程,但是使用IntentService就可以直接在裡面進行耗時操作,因為預設實作了一個worker thread。

實作執行個體:

6、停止Service

[1]如果service是非綁定的,最終當任務完成時,為了節省系統資源,一定要停止service,可以通過stopSelf()來停止,也可以在其他元件中通過stopService()來停止;

[2]綁定的service可以通過onUnBind()來停止service。