天天看點

Android中的四大元件之-Service兩種建立服務的方式:服務的啟動:服務的停止:服務的生命周期:Service 與 Thread 的差別

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(),系統馬上就會銷毀服務。

服務的生命周期:

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

![這裡寫圖檔描述](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwNzEwMTY1MjAwMjkz)

  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 很容易被殺死。

繼續閱讀