service生命周期圖
使用Service的方式有兩種:
1.StartService()啟動Service
2.BindService()啟動Service
StartService啟動Service
①首次啟動會創(chuàng)建一個Service實例,依次調(diào)用onCreate()和onStartCommand()方法,此時Service 進入運行狀態(tài),如果再次調(diào)用StartService啟動Service,將不會再創(chuàng)建新的Service對象, 系統(tǒng)會直接復(fù)用前面創(chuàng)建的Service對象,調(diào)用它的onStartCommand()方法审姓!
②但這樣的Service與它的調(diào)用者無必然的聯(lián)系,就是說當(dāng)調(diào)用者結(jié)束了自己的生命周期, 但是只要不調(diào)用stopService,那么Service還是會繼續(xù)運行的!
③無論啟動了多少次Service,只需調(diào)用一次StopService即可停掉Service
BindService啟動Service
①當(dāng)首次使用bindService綁定一個Service時,系統(tǒng)會實例化一個Service實例,并調(diào)用其onCreate()和onBind()方法,然后調(diào)用者就可以通過IBinder和Service進行交互了,此后如果再次使用bindService綁定Service,系統(tǒng)不會創(chuàng)建新的Sevice實例,也不會再調(diào)用onBind()方法,只會直接把IBinder對象傳遞給其他后來增加的客戶端!
②如果我們解除與服務(wù)的綁定,只需調(diào)用unbindService(),此時onUnbind和onDestory方法將會被調(diào)用!這是一個客戶端的情況,假如是多個客戶端綁定同一個Service的話,情況如下 當(dāng)一個客戶完成和service之間的互動后,它調(diào)用 unbindService() 方法來解除綁定祝峻。當(dāng)所有的客戶端都和service解除綁定后魔吐,系統(tǒng)會銷毀service。(除非service也被startService()方法開啟)
③另外,和上面情況不同,bindService模式下的Service是與調(diào)用者相互關(guān)聯(lián)的,在bindService后,一旦調(diào)用者銷毀,那么Service也立即終止!
通過BindService調(diào)用Service時調(diào)用的Context的bindService的解析 bindService(Intent Service,ServiceConnection conn,int flags)
service:通過該intent指定要啟動的Service
conn:ServiceConnection對象,用戶監(jiān)聽訪問者與Service間的連接情況, 連接成功回調(diào)該對象中的onServiceConnected(ComponentName,IBinder)方法; 如果Service所在的宿主由于異常終止或者其他原因終止,導(dǎo)致Service與訪問者間斷開 連接時調(diào)用onServiceDisconnected(CompanentName)方法,主動通過unBindService() 方法斷開并不會調(diào)用上述方法!
flags:指定綁定時是否自動創(chuàng)建Service(如果Service還未創(chuàng)建), 參數(shù)可以是0(不自動創(chuàng)建),BIND_AUTO_CREATE(自動創(chuàng)建)