三、實例:控制音樂播放的Service服務器
1、Service的概念網絡
Service是Android程序中四大基礎組件之一,它和Activity同樣都是Context的子類,只不過它沒有UI界面,是在後臺運行的組件。spa
2、Service的生命週期對象
Service對象不能本身啓動,須要經過某個Activity、Service或者其餘Context對象來啓動。啓動的方法有兩種,Context.startService和Context.bindService()。兩種方式的生命週期是不一樣的,具體以下所示。blog
Context.startService方式的生命週期:
啓動時,startService –> onCreate() –> onStart()
中止時,stopService –> onDestroy()接口
Context.bindService方式的生命週期:
綁定時,bindService -> onCreate() –> onBind()
解綁定時,unbindService –>onUnbind() –> onDestory()生命週期
3、實例:控制音樂播放的Service內存
有了 Service 類咱們如何啓動他呢,有兩種方法:資源
• Context.startService()
• Context.bindService()it
1. 在同一個應用任何地方調用 startService() 方法就能啓動 Service 了,而後系統會回調 Service 類的 onCreate() 以及 onStart() 方法。這樣啓動的 Service 會一直運行在後臺,直到 Context.stopService() 或者 selfStop() 方法被調用。另外若是一個 Service 已經被啓動,其餘代碼再試圖調用 startService() 方法,是不會執行 onCreate() 的,但會從新執行一次 onStart() 。
2. 另一種 bindService() 方法的意思是,把這個 Service 和調用 Service 的客戶類綁起來,若是調用這個客戶類被銷燬,Service 也會被銷燬。用這個方法的一個好處是,bindService() 方法執行後 Service 會回調上邊提到的 onBind() 方發,你能夠從這裏返回一個實現了 IBind 接口的類,在客戶端操做這個類就能和這個服務通訊了,好比獲得 Service 運行的狀態或其餘操做。若是 Service 尚未運行,使用這個方法啓動 Service 就會 onCreate() 方法而不會調用 onStart()。
總結:
1. startService()的目的是回調onStart()方法,onCreate() 方法是在Service不存在的時候調用的,若是Service存在(例如以前調用了bindService,那麼Service的onCreate方法已經調用了)那麼startService()將跳過onCreate() 方法。
2. bindService()目的是回調onBind()方法,它的做用是在Service和調用者之間創建一個橋樑,並不負責更多的工做(例如一個Service須要鏈接服務器的操做),通常使用bindService來綁定到一個現有的Service(即經過StartService啓動的服務)。
因爲Service 的onStart()方法只有在startService()啓動Service的狀況下才調用,故使用onStart()的時候要注意這點。
若是咱們想保持和 Service 的通訊,又不想讓 Service 隨着 Activity 退出而退出呢?你能夠先 startService() 而後再 bindService() 。當你不須要綁定的時候就執行 unbindService() 方法,執行這個方法只會觸發 Service 的 onUnbind() 而不會把這個 Service 銷燬。這樣就能夠既保持和 Service 的通訊,也不會隨着 Activity 銷燬而銷燬了。
Android 系統對於內存管理有本身的一套方法,爲了保障系統有序穩定的運信,系統內部會自動分配,控制程序的內存使用。當系統以爲當前的資源很是有限的時候,爲了保 證一些優先級高的程序能運行,就會殺掉一些他認爲不重要的程序或者服務來釋放內存。這樣就能保證真正對用戶有用的程序仍然再運行。若是你的 Service 碰上了這種狀況,多半會先被殺掉。但若是你增長 Service 的優先級就能讓他多留一會,咱們能夠用 setForeground(true) 來設置 Service 的優先級。
爲何是 foreground ? 默認啓動的 Service 是被標記爲 background,當前運行的 Activity 通常被標記爲 foreground,也就是說你給 Service 設置了 foreground 那麼他就和正在運行的 Activity 相似優先級獲得了必定的提升。當讓這並不能保證你得 Service 永遠不被殺掉,只是提升了他的優先級。
摘自網絡其餘資料:關於Service生命周
Android Service生命週期與Activity生命週期是類似的,可是也存在一些細節上也存在着重要的不一樣:
onCreate和onStart是不一樣的
經過從客戶端調用Context.startService(Intent)方法咱們能夠啓動一個服務。若是這個服務尚未運行,Android將啓動它而且在onCreate方法以後調用它的onStart方法。若是這個服務已經在運行,那麼它的onStart方法將被新的Intent再次調用。因此對於單個運行的Service它的onStart方法被反覆調用是徹底可能的而且是很正常的。
onResume、onPause以及onStop是不須要的
回調一個服務一般是沒有用戶界面的,因此咱們也就不須要onPause、onResume或者onStop方法了。不管什麼時候一個運行中的Service它老是在後臺運行。
onBind
若是一個客戶端須要持久的鏈接到一個服務,那麼他能夠調用Context.bindService方法。若是這個服務沒有運行方法將經過調用onCreate方法去建立這個服務但並不調用onStart方法來啓動它。相反,onBind方法將被客戶端的Intent調用,而且它返回一個IBind對象以便客戶端稍後能夠調用這個服務。同一服務被客戶端同時啓動和綁定是很正常的。
onDestroy
與Activity同樣,當一個服務被結束是onDestroy方法將會被調用。當沒有客戶端啓動或綁定到一個服務時Android將終結這個服務。與不少Activity時的狀況同樣,當內存很低的時候Android也可能會終結一個服務。若是這種狀況發生,Android也可能在內存夠用的時候嘗試啓動被終止的服務,因此你的服務必須爲重啓持久保存信息,而且最好在onStart方法內來作