Service的兩種啓動方式

Service的兩種啓動方式
  1. 通過startService創建的service創建後就跟對應的activity沒有關係,當activity銷燬時,Service依然在運行(前提是沒有調用stopService())
  2. 通過startService()方法啓動的service,會調用onCreate(),onStartCommand()方法,如果Service已經被創建,則不會再調用onCreate()方法,但是依然會調用onStartCommand()方法  適用場景:音樂播放器,上傳下載文件一般都是在onStartCommand()方法中開始執行的
  3. 通過StartService()方法啓動的service,Service類中的onBind()方法返回null即可
  4. 無論通過startService()方法開啓多少次service,只要調用一次stopService()方法,這個服務就會停止。(Service只有一個實例,這就是StartService()方法和stopService()方法中的intent可以不是全局變量的原因,即使是從新new出來的service指向的也是正在運行的service)
  5. StartService()方法和stopService()方法都是異步執行的,並且是串行執行,只有當第一次執行完纔會(onStartCommand()執行完畢)執行第二次的
  6. startService()開啓服務時service的聲明週期圖如下


  1. 一個activity通過bindService()綁定服務後會調用Service的onCreate()和onBind()方法,onBind()方法會返回一個IBander對象的實例給activity,ServiceConnection的onServiceConnected()方法中,標誌着ActivityA與TestService建立了綁定連接,此時當客戶端任意一個ActivityB想要在次bindservice的時候,service不會再走onCreate()和onBind()方法,而是直接拿到IBinder的實例(這個實例是APP中所有Activity共享的),所以在ActivityB的ServiceConnection的onServiceConnected()方法中會直接獲得IBinder的實例 ,此時如果在ActivityB中解綁Service,不會觸發Service的unBindService()和onDestory()方法,這兩個方法是當Service沒有任何activity與之綁定的時候纔會調用,此時還有ActivityA與之綁定
  2. 不能多次調用unBindService(),會拋出異常,所以在調用該方法時需要判斷,當bindService的時候將flag的值改變
  3. 如果service的onBind()方法返回null,service依然會啓動,但是沒有和activity綁定上,但但是此時仍然要用unBindService()方法停止服務
  4. 通過bindService()方法開啓service時Service的生命週期圖如下:


發佈了40 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章