Android中的四大組件之-Service

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

兩種創建服務的方式:

  • 繼承Service:是所有服務的基類,當繼承一個這個類時,處理耗時操作需要爲服務創建新的線程。因爲這些服務被默認用的是主線程。

  • 繼承IntentService:IntentService是繼承於Service並處理異步請求的一個類,在IntentService內有一個工作線程來處理耗時操作,啓動IntentService的方式和啓動傳統Service一樣,同時,當任務執行完後,IntentService會自動停止,而不需要我們去手動控制。另外,可以啓動IntentService多次,而每一個耗時操作會以工作隊列的方式在IntentService的onHandleIntent回調方法中執行,並且,每次只會執行一個工作線程,執行完第一個再執行第二個,以此類推。

服務的啓動:

  • 啓動(Started)服務:將一個服務通過Intent傳給四大組件的startService()。android系統將能調用Service對象的onStartCommand()方法。
    例如:
    Intent intent =newIntent(this,HelloService.class);
    startService(intent);
    startService()方法啓動服務時Android系統將會立即做出反應,它會調用服務的onstartCommand(),如果服務沒有在運行它會先調用oncreate(),再調用onstartCommand()
    如果你的服務沒有提供binding,通過startService()傳遞的Intent是應用組件和服務之間的唯一通訊方式。如果你想服務能返回結果,客戶端可以爲一個廣播創建一個PendingIntent,並將它傳遞到開始服務的Intent對象中,服務也能通過廣播傳遞結果。當多個請求者啓動同一個時,將會導致多次調用服務的onStartCommand()方法,但是當有一個請求者停止(stopSelf()或stopService())服務時,服務將會被停止。

  • 綁定(Bound)服務:一個綁定服務繼承Service類,允許組件去綁定它,能向服務發送請求、服務能作出回覆、並實現進程間的通信。你必須實現onbind()方法,這個方法返回一個IBinder對象,能與客戶端進行通信。客戶端能通過bindService來綁定服務,但是它必須提供一個ServiceConnection的實現類,來連接一個服務。bindService()不會立即返回值,但是系統會在服務和客戶之間創建一個連接,系統會調用ServiceConnection對象的onServiceConnected()方法返回一個IBinder對象。當多個客戶綁定同一個服務時,系統會將第一個返回的IBinder對象傳遞給多個客戶端。當最後一個客戶解綁服務時,系統會自動地銷燬服務。

服務的停止:

    一個啓動的服務必須能管理自己的生命週期,這樣,系統不需要停止或銷燬服務,除非它是必須繼續運行在onStartCommand()返回後,要恢復系統的記憶。所以一個服務必須通過stopSelf()停止自己,或是其他的控件通過stopService()停止服務。一旦一個服務被stopSelf()或stopService(),系統馬上就會銷燬服務。

服務的生命週期:

下圖爲官方文檔中的服務生命週期變化圖:


這裏寫圖片描述

  1. 被啓動的服務的生命週期:如果一個Service被某個Activity 調用 Context.startService 方法啓動,那麼不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都在後臺運行。如果一個Service被startService 方法多次啓動,那麼onCreate方法只會調用一次,onStart將會被調用多次(對應調用startService的次數),並且系統只會創建Service的一個實例(因此你應該知道只需要一次stopService調用)。該Service將會一直在後臺運行,而不管對應程序的Activity是否在運行,直到被調用stopService,或自身的stopSelf方法。當然如果系統資源不足,android系統也可能結束服務。
  2. 被綁定的服務的生命週期:如果一個Service被某個Activity 調用 Context.bindService 方法綁定啓動,不管調用 bindService 調用幾次,onCreate方法都只會調用一次,同時onStart方法始終不會被調用。當連接建立之後,Service將會一直運行,除非調用Context.unbindService 斷開連接或者之前調用bindService 的 Context 不存在了(如Activity被finish的時候),系統將會自動停止Service,對應onDestroy將被調用。
  3. 被啓動又被綁定的服務的生命週期:如果一個Service又被啓動又被綁定,則該Service將會一直在後臺運行。並且不管如何調用,onCreate始終只會調用一次,對應startService調用多少次,Service的onStart便會調用多少次。調用unbindService將不會停止Service,而必須調用 stopService 或 Service的 stopSelf 來停止服務。
  4. 當服務被停止時清除服務:當一個Service被終止(1、調用stopService;2、調用stopSelf;3、不再有綁定的連接(沒有被啓動))時,onDestroy方法將會被調用,在這裏你應當做一些清除工作,如停止在Service中創建並運行的線程。

Service 與 Thread 的區別

  • Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位。可以用 Thread 來執行一些異步的操作。

  • Service:Service 是android的一種機制,當它運行的時候如果是Local Service,那麼對應的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。如果是Remote Service,那麼對應的 Service 則是運行在獨立進程的 main 線程上。

  • Service和Thread 可以說都是在後臺,但是Service優先級高於Thread ,當系統的內存不足時,Thread 很容易被殺死。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章