Android之Service學習筆記
前言
本來想學習學習Binder通信機制,在學習的過程中又接觸AIDL并開始學習,在AIDL學習過程中看到bindService,接著就想回顧一下Service的一些知識。希望溫故可以知新,也算是年末最后一篇筆記,給自己明年有一個好的開頭~!~!
介紹
Service 是一個可以在后臺執行長時間運行操作而不提供用戶界面的應用組件。服務可由其他應用組件啟動,而且即使用戶切換到其他應用,服務仍將在后臺繼續運行。 此外,組件可以綁定到服務,以與之進行交互,甚至是執行進程間通信 (IPC)。 例如,服務可以處理網絡事務、播放音樂,執行文件 I/O 或與內容提供程序交互,而所有這一切均可在后臺進行。
創建Service
Service的創建可以分為兩種分別是:啟動和綁定。
啟動:
當應用組件(如 Activity)通過調用 startService() 啟動服務時,服務即處于“啟動”狀態。一旦啟動,服務即可在后臺無限期運行,即使啟動服務的組件已被銷毀也不受影響。 已啟動的服務通常是執行單一操作,而且不會將結果返回給調用方。例如,它可能通過網絡下載或上傳文件。 操作完成后,服務會自行停止運行。
綁定:
當應用組件通過調用 bindService() 綁定到服務時,服務即處于“綁定”狀態。綁定服務提供了一個客戶端-服務器接口,允許組件與服務進行交互、發送請求、獲取結果,甚至是利用進程間通信 (IPC) 跨進程執行這些操作。 僅當與另一個應用組件綁定時,綁定服務才會運行。 多個組件可以同時綁定到該服務,但全部取消綁定后,該服務即會被銷毀。
同名的Service只能存在一個,但運行方式可以兩種并存。也就是說,它既可以是啟動服務(以無限期運行),也允許綁定。問題只是在于您是否實現了一組回調方法: onStartCommand() (允許組件啟動服務)和 onBind() (允許綁定服務)。
需要注意的是Service它是運行在主線程中的,如果服務執行的CPU密集型或阻塞性質的操作,那么應該在服務內創建新的線程去工作。通過使用單獨的線程,可以降低發生“應用無響應”(ANR) 錯誤的風險,而應用的主線程仍可繼續專注于運行用戶與 Activity 之間的交互。
Service之基礎
下邊主要介紹Service的一些方法以及其生命周期。
-
onCreate()
首次創建服務時,系統將調用此方法來執行一次性設置程序(在調用 onStartCommand() 或 onBind() 之前)。如果服務已在運行,則不會調用此方法。
-
onStartCommand()
當另一個組件(如 Activity)通過調用 startService() 請求啟動服務時,系統將調用此方法。一旦執行此方法,服務即會啟動并可在后臺無限期運行。
關于onStartCommand返回值可以查看 Service之onStartCommand剖析筆記
-
onBind()
當另一個組件想通過調用 bindService() 與服務綁定(例如執行 RPC)時,系統將調用此方法。在此方法的實現中,您必須通過返回 IBinder
提供一個接口,供客戶端用來與服務進行通信。請務必實現此方法,但如果您并不希望允許綁定,則應返回 null。
-
onRebind()
如果之前有斷開連接的時候調用onUnbind方法,并且其返回值為ture。那么在新的客戶端需要進行和服務進行連接的時候會調用該方法。
-
onUnbind()
和onRebind()對應,如果想在新的客戶端連接的時候收到通知那么onUnbind()的返回值設置為ture,但改方法的默認返回值為false。
-
onDestroy()
當服務不再使用且將被銷毀時,系統將調用此方法。服務應該實現此方法來清理所有資源,如線程、注冊的偵聽器、接收器等。 這是服務接收的最后一個調用。
Service的聲明周期
Service生命周期
該圖分別表示了startService和bindService的聲明周期,那么當Service即有startService又有bindService時呢?
Service的生命周期.png
該圖是作者使用同一個Service和多個不同的client去bindService和startService得出的結論。
- Service類似于單例,無論啟動多少次onCreate只執行一次,除非執行了onDestory或者stopSelf;
- 當client進行startService的時候,Service會調用onStartCommand方法。所以我們一般會在這個方法法中處理傳遞事件;
- 當client在進行stopService的時候,如果此時沒有任何其他的client與其綁定(startService | bindService)那么Service才會執行onDestory方法;
- 當client在進行bindService的時候,如果Service沒有被bind過那么Server會調用它的onBind方法。因為當Service的onBind方法被調用過后Ibinder已經被AMS獲取到,那么在client進行bindService的時候會先判斷是否Service的onUnbind方法已經被調用過,如果沒有那么直接返回該Ibinder,否則根據onUnbind的返回值判斷是否調用onRebind方法;
- 當client進行onbindService的時候,如果此時沒有任何client在bind狀態,那么就會調用Service的onUnbind,然后再判斷是否有其他的client與Service綁定(startService),如果沒有的話,那么Service就會調用onDestroy方法;
下邊是源碼的方法執行流程:
startService.png
bindService.png
unbindService.png
stopService&stopSelf.png
上面流程圖只是方法的調用,關于具體方法的實現還沒有進行仔細的研究所以這里就不貼了。
看到這里關于Service的基礎知識應該回顧的差不多,我們一起期待新的一年的開始吧~!~!~!
來自:http://www.jianshu.com/p/2e1639fb14a7