service的生命周期service的生命周期方法比activity少一些,隻有oncreate, onstart, ondestroy
我們有兩種方式啟動一個service,他們對service生命周期的影響是不一樣的。
1 通過startservice
service會經曆 oncreate -> onstart
stopservice的時候直接ondestroy
如果是調用者(testserviceholder)自己直接退出而沒有調用stopservice的
話,service會一直在背景運作。
下次testserviceholder再起來可以stopservice。
2 通過bindservice
service隻會運作oncreate, 這個時候 testserviceholder 和testservice綁定在一起
testserviceholder 退出了,srevice就會調用onunbind->ondestroyed
所謂綁定在一起就共存亡了。
那有同學問了,要是這幾個方法交織在一起的話,會出現什麼情況呢?
一個原則是service的oncreate的方法隻會被調用一次,就是你無論多少次的startservice又 bindservice,service隻被建立一次。如果先是bind了,那麼start的時候就直接運作service的onstart方法,如果先 是start,那麼bind的時候就直接運作onbind方法。如果你先bind上了,就stop不掉了,對啊,就是stopservice不好使了,隻 能先unbindservice, 再stopservice,是以是先start還是先bind行為是有差別的。
服務不能自己運作,需要通過調用context.startservice()或context.bindservice()方法啟動服務。這兩個方法都可以啟動service,但是它們的使用場合有所不同。使用startservice()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運作。使用bindservice()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。
如果打算采用context.startservice()方法啟動服務,在服務未被建立時,系統會先調用服務的oncreate()方法,接着調用onstart()方法。如果調用startservice()方法前服務已經被建立,多次調用startservice()方法并不會導緻多次建立服務,但會導緻多次調用onstart()方法。采用startservice()方法啟動的服務,隻能調用context.stopservice()方法結束服務,服務結束時會調用ondestroy()方法。
如果打算采用context.bindservice()方法啟動服務,在服務未被建立時,系統會先調用服務的oncreate()方法,接着調用onbind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onunbind()方法,接着調用ondestroy()方法。如果調用bindservice()方法前服務已經被綁定,多次調用bindservice()方法并不會導緻多次建立服務及綁定(也就是說oncreate()和onbind()方法并不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindservice()方法,調用該方法也會導緻系統調用服務的onunbind()-->ondestroy()方法.
我的補充案例:
為什麼music player每個activity unbindservice後 musicservice仍在背景播放?
具體要看music service中的onbind()的實作,它裡面的onbind()并沒有直接去調用stotself()(它會檢查目前是否有歌曲在播放),是以并不會直接就destroy,是以它還存在于背景繼續播放。