Service生命週期詳解

鴨脖發表於2012-08-24

服務不能自己執行,需要通過呼叫Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務,訪問者與服務之間沒有關連,即使訪問者退出了,服務仍然執行。使用bindService()方法啟用服務,訪問者與服務繫結在了一起,訪問者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。


這裡我主要講一講bindService過程中的細節。

如果直接在activity中通過bindservice方法來繫結服務,那麼首先得把service建立出來啊,所以是onCreate,然後是onBind,然後是ServiceConnection的onConnected。

如果先通過start方式啟動了服務,再通過bindService繫結了服務,那麼是onCreate()-->onStart()-->onBind()-->onUnbind()

多個activity繫結同一個service,採用Context.bindService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,接著呼叫onBind()方法,這個時候訪問者和服務繫結在一起。 如果訪問者要與服務進行通訊,那麼,onBind()方法必須返回Ibinder物件。如果訪問者退出了,(這裡是所有的訪問者都退出了,只是其中一個的話並不會做任何事情)系統就會先呼叫服務的onUnbind()方法,接著呼叫onDestroy()方法。如果呼叫bindService()方法前服務已經被繫結,多次呼叫bindService()方法並不會導致多次建立服務及繫結(也就是說onCreate()和onBind()方法並不會被多次呼叫)。如果訪問者希望與正在繫結的服務解除繫結,可以呼叫unbindService()方法,呼叫該方法也會導致系統呼叫服務的onUnbind()-->onDestroy()方法。要注意的是,如果在沒有bindservice的情況下呼叫activity的unbindservice方法,那麼會丟擲service not registered異常,從而導致程式中斷,所以在unbind之前要看是否已經bind了。第二個訪問者在繫結的時候,會直接呼叫ServiceConnection的方法,而不會在進入service中的方法。

相關文章