- 通過startService創建的service創建後就跟對應的activity沒有關係,當activity銷燬時,Service依然在運行(前提是沒有調用stopService())
- 通過startService()方法啓動的service,會調用onCreate(),onStartCommand()方法,如果Service已經被創建,則不會再調用onCreate()方法,但是依然會調用onStartCommand()方法 適用場景:音樂播放器,上傳下載文件一般都是在onStartCommand()方法中開始執行的
- 通過StartService()方法啓動的service,Service類中的onBind()方法返回null即可
- 無論通過startService()方法開啓多少次service,只要調用一次stopService()方法,這個服務就會停止。(Service只有一個實例,這就是StartService()方法和stopService()方法中的intent可以不是全局變量的原因,即使是從新new出來的service指向的也是正在運行的service)
- StartService()方法和stopService()方法都是異步執行的,並且是串行執行,只有當第一次執行完纔會(onStartCommand()執行完畢)執行第二次的
- startService()開啓服務時service的聲明週期圖如下
- 一個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與之綁定
- 不能多次調用unBindService(),會拋出異常,所以在調用該方法時需要判斷,當bindService的時候將flag的值改變
- 如果service的onBind()方法返回null,service依然會啓動,但是沒有和activity綁定上,但但是此時仍然要用unBindService()方法停止服務
- 通過bindService()方法開啓service時Service的生命週期圖如下: