天天看點

Android四大元件——Service詳解(一)

Android四大元件——Service詳解(一)

1. Service簡介

Service: 是一個可以在背景執行長時間運作操作而不提供使用者界面的應用元件。服務可由其他應用元件啟動,而且即使使用者切換到其他應用,服務仍将在背景繼續運作。 此外,元件可以綁定到服務,以與之進行互動,甚至是執行程序間通信 (IPC)。 例如,服務可以處理網絡事務、播放音樂,執行檔案 I/O 或與内容提供程式互動,而所有這一切均可在背景進行。

2. 服務基本上分為兩種形式:

(1)啟動

當應用元件(如 Activity)通過調用 startService() 啟動服務時,服務即處于“啟動”狀态。一旦啟動,服務即可在背景無限期運作,即使啟動服務的元件已被銷毀也不受影響。 已啟動的服務通常是執行單一操作,而且不會将結果傳回給調用方。例如,它可能通過網絡下載下傳或上傳檔案。 操作完成後,服務會自行停止運作。

(2)綁定

當應用元件通過調用 bindService() 綁定到服務時,服務即處于“綁定”狀态。綁定服務提供了一個用戶端-伺服器接口,允許元件與服務進行互動、發送請求、擷取結果,甚至是利用程序間通信 (IPC) 跨程序執行這些操作。 僅當與另一個應用元件綁定時,綁定服務才會運作。 多個元件可以同時綁定到該服務,但全部取消綁定後,該服務即會被銷毀。

3. 開發Service的步驟

開發Service需要兩個步驟:

1、定義一個繼承Service的子類;

2、在AndroidManifest.xml檔案中配置該Service。

要建立服務,您必須建立 Service 的子類(或使用它的一個現有子類)。在實作中,您需要重寫一些回調方法,以處理服務生命周期的某些關鍵方面并提供一種機制将元件綁定到服務(如适用)。 應重寫的最重要的回調方法包括:

(1)onStartCommand()

當另一個元件(如 Activity)通過調用 startService() 請求啟動服務時,系統将調用此方法。一旦執行此方法,服務即會啟動并可在背景無限期運作。 如果您實作此方法,則在服務工作完成後,需要由您通過調用 stopSelf() 或 stopService() 來停止服務。(如果您隻想提供綁定,則無需實作此方法。)

(2)onBind()

當另一個元件想通過調用 bindService() 與服務綁定(例如執行 RPC)時,系統将調用此方法。在此方法的實作中,您必須通過傳回 IBinder 提供一個接口,供用戶端用來與服務進行通信。請務必實作此方法,但如果您并不希望允許綁定,則應傳回 null。

(3)onCreate()

首次建立服務時,系統将調用此方法來執行一次性設定程式(在調用 onStartCommand() 或 onBind() 之前)。如果服務已在運作,則不會調用此方法。

(4)onDestroy()

當服務不再使用且将被銷毀時,系統将調用此方法。服務應該實作此方法來清理所有資源,如線程、注冊的偵聽器、接收器等。 這是服務接收的最後一個調用。

3. Service的生命周期:

public class ExampleService extends Service {
    int mStartMode;       // indicates how to behave if the service is killed
    IBinder mBinder;      // interface for clients that bind
    boolean mAllowRebind; // indicates whether onRebind should be used

    @Override
    public void onCreate() {
        // The service is being created
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed
    }
}
           
Android四大元件——Service詳解(一)

圖1:服務生命周期。左圖顯示了使用 startService() 所建立的服務的生命周期,右圖顯示了使用 bindService() 所建立的服務的生命周期。

服務的整個生命周期從調用 onCreate() 開始起,到 onDestroy() 傳回時結束。與 Activity 類似,服務也在 onCreate() 中完成初始設定,并在 onDestroy() 中釋放所有剩餘資源。例如,音樂播放服務可以在 onCreate() 中建立用于播放音樂的線程,然後在 onDestroy() 中停止該線程。

無論服務是通過 startService() 還是 bindService() 建立,都會為所有服務調用 onCreate() 和 onDestroy() 方法。

總結:本節課程我們了解了Service的基本知識,下一節我們将用一個例子來讓大家熟悉Service的使用。