天天看點

Service的startService()和bindService()的差別

服務不能自己運作,需要通過調用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()方法。   服務常用生命周期回調方法如下:

onCreate() //該方法在服務被建立時調用,該方法隻會被調用一次,
     
     
      無論調用多少次startService() 或bindService()方法,服務也隻被建立一次。
onDestroy()//該方法在服務被終止時調用。 
           

與采用Context.startService()方法啟動服務有關的生命周期方法 onStart() 隻有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運作時被調用。多次調用startService()方法盡管不會多次建立服務,但onStart() 方法會被多次調用。  與采用Context.bindService()方法啟動服務有關的生命周期方法 onBind()隻有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法并不會導緻該方法被多次調用。 onUnbind()隻有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用。

繼續閱讀