Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 01 Service 介紹

Android 01 Service 介紹

編輯:關於Android編程

 

 

 

概要

若讀者之前沒接觸過service,對下面內容有個大致了解即可。待使用過service之後再來閱讀本章內容,會理解更深刻。

service是Android四大組件之一,其余的是activity、BroadcastReceiver、Content Provider。service是一個能夠在後台執行長時操作的應用程序組件,它不提供用戶界面。應用程序能夠通過service來啟動後台操作,不同應用程序也能夠通過service來實現進程間通信(IPC)。

一個service被啟動後,實際上還是運行在主線程中,即UI線程。若用戶要執行比較耗時的操作,建議新建一個線程來處理;否則可以到UI線程阻塞,影響用戶體驗。


1 service種類和區別

這裡介紹的android服務有4種,下面分別說明。

1.1 Started Service

即,被啟動的服務,它是2種常見服務之一,另一種是Bound Service。它常被用在執行進程的某個後台操作,如通過該服務來實現文件下載等功能。
要提供被啟動的服務:首先,要創建一個繼承於Service的類。然後,其它的應用程序可以通過startService()來啟動該服務;若要停止服務,可以在應用程序中執行stopService(),也可以在服務中執行stopSelf()來停止服務。

當服務一旦啟動,它就能夠無限期的在後台運行,即使啟動它的組件被銷毀。通常,一個被啟動的服務執行一個單一操作,並且不給調用者返回結果。若需要返回結果,可以通過廣播(BroadcastReceiver)來實現。這些在“Android Service -- Started Service”中以詳細示例來說明。
 

1.2 Bound Service

即,被綁定的服務,和Started Service一樣,它也是2種常見服務之一。它也常被用在執行進程的某個後台操作,如通過該服務來實現文件下載等功能。
要提供被綁定的服務:首先,要創建一個繼承於Service的類。然後,其它的應用程序可以通過bindService()來綁定該服務,綁定服務後,就可以調用服務提供的功能;若要解除服務,可以在應用程序中執行unbindService()。

 

“Started Service”和“Bound Service”的主要區別:

(01) 啟動/停止方式不同

  • 若要啟動“Started Service”,需要調用startService();要停止該服務,要調用stopService()或stopSelf()。
  • 若要綁定“Bound Service”,則調用bindService();若要解除綁定,則要調用unbindService()。

    (02) 實現接口不同

    • “Started Service”中,一般要實現service的onStartCommand()接口。因為startService()會調用onStartCommand()接口,我們一般在onStartCommand()中執行一些服務提供的功能,若啟動一個線程用於下載。
    • “Bound Service”中,一般要實現service的onBind()接口。 onBind()函數要返回一個IBinder對象,客戶端調用bindService()綁定該服務時被調用。這個綁定是異步的,bindService()方法會立即返回,並且不給客戶端返回IBinder對象。要接收IBinder對象,客戶端必須創建一個實現ServiceConnection類,並創建ServiceConnection的實例;然後在,bindService()方法中調用ServiceConnection的實例。這裡只需要有個大致概念即可;後面在“Android Service Bound Service”中,我們會詳細介紹各個接口的作用,以及如何實現這些接口。

      (03) 活躍生命周期不同

      這裡“活躍生命周期”(active lifetime)不同於“完整生命周期”(entire lifetime)。它們的完整生命周期都是起始於onCreat(),結束於onDestroy()。但“活躍生命周期”指的是服務仍然是活動狀態。

      • “Started Service”的活躍生命周期開始於startService(),停止於stopService()或stopSelf()。一個“Started Service”可以被多次啟動,每次啟動都會調用service的onStartCommand()接口;但是,一旦stopService()或stopSelf()被調用,它的活躍生命周期即結束!
      • “Bound Service”的活躍生命周期開始於bindService(),停止於最後一個客戶端調用unbindService()。意思是,“Bound Service”可以被多個客戶端綁定,即多個客戶端可以調用bindService()來綁定相同的服務。當第一個綁定服務的客戶端調用bindService()時,“Bound Service”的活躍生命周期即開始了;當所有的客戶端全部解除綁定時,它的活躍生命周期即結束了。

         

        補充:一個service可以同時提供“Started Service”和“Bound Service”。要能提供開始的服務,需實現onStartCommand()接口;要能提供綁定的服務,需實現onBind()。同時實現兩種接口,即能提供兩種服務。

         

        1.3 IntentService

        它的特性是對服務的請求逐個處理,而不能同時處理多個請求。
        要提供IntentService:首先,要創建一個繼承於Service的類。然後,其它的應用程序可以通過startService()來啟動該服務;若要停止服務,可以在應用程序中執行stopService(),也可以在服務中執行stopSelf()來停止服務,另外,IntentService中的請求被處理完畢,它也會自動停止。

        由於“IntentService”和“Started Service”的啟動和停止方式一致,我們這裡介紹一下它們的主要區別:
        (01) 實現原理不同

        • IntentService內部有一個工作隊列,逐個對任務進行處理。因為不必擔心多線程的問題。
        • “Started Service”支持單線程或多線程,但必須我們自己在服務中實現。

          (02) 實現的API不同

          • IntentService必須實現onHandleIntent()接口,在onHandlerIntent()中啟動IntentService的Intent進行處理。
          • “Started Service”要實現onStartCommand()接口,服務所需提供的功能,一般在該接口中處理。

            (03) 生命周期不同。

            • IntentService中所有的啟動請求都被處理之後會自動終止這個服務,因此你不需要自己去調用stopSelf()方法。
            • “Started Service”的生命周期開始於startService(),停止於stopService()或stopSelf()。

               

              1.4 AIDL

              AIDL(Android Interface Definition Language),是用來來完成進程間通信(IPC)。
              一般在服務需要接受不同應用多線程的請求時才需要使用AIDL;如果是同一個應用內的請求使用Binder實現即可;如果只是應用間通信而不是多線程處理的話使用Messenger,當然這兩種情況也可以使用AIDL。本地進程和遠程進程使用AIDL有所不同,本地進程內調用時會都在調用的線程內執行,遠程進程使用是通過Service進程內一個由系統維護的線程池發出調用,所以可能是未知線程同時調用,需要注意線程安全問題。

               

               


              2 服務的API

              無論是“Started Service”還是“Bound Service”,它們都是繼承與Service類。下面對Service類中的主要API進行簡要說明。

              onStartCommand():當其它程序調用startService()時,系統會自動調用該函數。且一旦執行了該函數,服務就被啟動了。此時,啟動的服務是“Started Service”。

              onBind():當其它程序調用bindService()時,系統會自動調用該函數。一旦執行了該函數,服務就被啟動了。此時,啟動的服務是“Bounder Service”。若要提供綁定功能,則必須實現該函數,並且要返回IBinder對象;若不想提供綁定功能,則可以直接返回null。

              onUnbind():當其它程序調用unbindService(),系統會自動調用該函數。

              onCreate():服務被創建時,系統會自動調用該函數。一般在該函數中進行初始化工作,例如:新建線程。

              onDestroy():在服務被銷毀時,系統會自動調用該函數。一般在該函數中進行清除工作,例如,終止並回收線程。

               

               

               


              3 服務聲明方法

              在manifest中,通過以下方法聲明服務

              
               ...
               
                   
                   ...
               
              

              像activity一樣。你即可以在service對應的manifest中注冊intent-filter,讓其它程序通過隱式意圖來調用該服務;也可以不注冊intent-filter,直接通過顯式意圖來調用該服務。若想讓某服務成為某application的私有服務,則可以通過設置android:exported屬性為false。


              4 服務的生命周期

              service 的生命周期時序圖如下:

              \




              1 service種類和區別

              這裡介紹的android服務有4種,下面分別說明。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved