android:四大組件之一service小結

來源:互聯網
上載者:User

  Service是一段不定的時間運行在後台、不和使用者互動的應用組件,每個Service必須在manifest中通過<service>來聲明,通過contect.startservice和contect.bindservice來啟動。

    生命週期:Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate(),onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先後調用onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,需要注意的是,如果Service已經啟動了,當我們再次啟動service時,不會再執行onCreate()方法,而是直接執行onStart()方法。

   Service和其他的應用組件一樣,運行在進程的主線程中,這就是說如果service需要很多耗時或者阻塞的操作,需要在其子線程中實現,但是Service不能自己運行,需要通過其他方法來啟動服務,service有兩種啟動模式(startService()/bindService()不是完全分離的):
   1、本地服務Local Service用於應用程式內部。它可以啟動運行,直至人為停止它或者它自己停止,在這種方式下,它以調用Context.startService()或Service.stopSelfResult()來自己停止,不論調用了多少次startService()方法,你只需要調用一次stopService()來停止服務。它可以用於實現應用程式自己的一些耗時任務,比如查詢升級資訊,並不佔用應用程式比如Activity所屬線程,而是單開線程後台執行,這樣使用者體驗比較好。
       函數原型:
      
[java] 
public abstract ComponentName startService(Intent service) 

       通過函數的原型我們可以看出是一個Component去調用,參數就是一個intent,在該intent中去指定一些規則和訊息來啟動合格Service。當client端發出去Intent去啟動Service端時,component調用startService(Intent intent)啟動Service,Service端通過onstartCommand(Intent,int,int)函數來做出相應,下面對onstartCommand(Intent,int,int)進行詳細說明:
        函數原型: www.2cto.com
[java] 
public int onStartCommand(Intent intent,int flags,int startId) 

       Android開發的過程中,每次調用startService(Intent)的時候,都會調用該Service對象的onStartCommand(Intent,int,int)方法,然後在onStartCommand方法中做一些處理。然後我們注意到這個函數有一個int的傳回值,從Android官方文檔中,說明了onStartCommand有4種傳回值:

START_STICKY:如果service進程被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent對象。隨後系統會嘗試重新建立service,由於服務狀態為開始狀態,所以建立服務後一定會調用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那麼參數Intent將為null。

START_NOT_STICKY:“非粘性的”。使用這個傳回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統不會自動重啟該服務。

START_REDELIVER_INTENT:重傳Intent。使用這個傳回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統會自動重啟該服務,並將Intent的值傳入。

START_STICKY_COMPATIBILITY:START_STICKY的相容版本,但不保證服務被kill後一定能重啟。
     
       該函數不能人為的去直接調用,而是由Android system在Service的main thread中由系統去調用,所以一般情況下繼承Service的子類都要重寫Service類的:onCreate();onStartCommand(),onBinder(),onStart(),onDestroy(),onRebind(),onUnbind()方法,然後再在函數中編寫其他自己想要實現的功能,
所以通過context.startService(Intent intent)來啟動Service時的過程為: startService()-->onCreate()-->onStart();
當關閉服務的時候Service端處理過程為:  destroystopService()-->onDestroy()-->Service stop

    2、遠程服務Remote Service用於android系統內部的應用程式之間。它可以通過自己定義並暴漏出來的介面進行程式操作。用戶端建立一個到服務物件的串連,並通過那個串連來調整服務。串連以調用Context.bindService()方法建立,以調用Context.unbindService()關閉,多個用戶端可以綁定至同一個服務,如果服務此時還沒有載入,bindService()會先載入它。可被其他應用程式複用,比如天氣預報服務,其他應用程式不需要再寫這樣的服務,調用已有的即可。
        函數原型;   
[java] 
public boolean bindService(Intent service,ServiceConnection conn,int flags) 
        參數說明:intent是client端定義的參數,和startService中的intent作用一樣;
                          conn是一個ServiceConnection執行個體,ServiceConnection是一個public interface,一個用於監視app service狀態的Interface,必須去實現ServiceConnention的兩個抽象函數,我們可以通過onServiceConnected(ComponentName name,IBinder service)和onServiceDisconnected(ComponentName name)這兩個函數來決定串連或者斷開Service;
                           flags:綁定操作選項;
           傳回值:綁定成功返回true,失敗返回false
        綁定一個啟動並執行Service。可以建立一個即使啟動並執行又是綁定的Service,也就是通過startService()來讓這個Service運行,然後client端通過bindService()來綁定到Service,那麼當Service啟動後系統不會為所有用戶端解除綁定unBindService()後銷毀service,而是,你必須通過調用stopSelf()或stopService()顯示地停止這個Service,多個client可以同時串連到一個service,當第一個Client綁定到Service的時候Service的onBinder()方法才接受到IBinder,之後Service將把同一個IBinder傳遞給其他的client,之後其他Client的串連service就不再會調用自身的onBind()方法了,當最後一個client取消綁定到Service時,系統就會銷毀這個Service。
        這個模式開啟service過程為:bindService-->onCreate()-->onBind()-->Service running;
                        關閉service過程為:onUnBind()-->onDestroy()-->Service stop
        該模式下在Service每一次開啟關閉過程中,只有onStart()可被多次調用(通過多次startService調用),其他onCreate(),onBind(),onUnbind(),onDestroy()在一個生命週期中只能被調用一次。


                                                                                  
                                                                                                          Android API資料對Service兩種模式流程說明圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.