天天看點

Service生命周期

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,是以它還存在于背景繼續播放。

繼續閱讀