服務的生命周期跟Activity的生命周期類似。但是生命周期甚至比你關注服務如何創建和銷毀更重要,因為服務能夠在用戶不知情的情況下在后台運行。
服務的生命周期---從創建到銷毀---可以被分為以下兩個路徑:
1. 啟動類型的服務: onCreate()- >onStartCommand()->Service running--調用context.stopService() ->onDestroy()
2. 綁定類型的服務: onCreate()->onBind()->Service running--調用>onUnbind() -> onDestroy()
其中綁定服務才可以調用服務中的方法
以下是筆者寫的一個demo代碼:
1 @Override 2 public void onCreate() { 3 System.out.println("服務被創建了concreate"); 4 super.onCreate(); 5 } 6 7 @Override 8 public int onStartCommand(Intent intent, int flags, int startId) { 9 System.out.println("開啟服務 onStartCommand "); 10 return super.onStartCommand(intent, flags, startId); 11 } 12 13 @Override 14 public IBinder onBind(Intent intent) { 15 System.out.println("綁定服務調用了 onBind"); 16 return new MyBinder(); 17 } 18 19 @Override 20 public boolean onUnbind(Intent intent) { 21 System.out.println("解綁服務 onUnbind"); 22 return super.onUnbind(intent); 23 } 24 25 26 @Override 27 public void onDestroy() { 28 System.out.println("服務被銷毀了ondestroy"); 29 super.onDestroy(); 30 } 31
其中onCreate方法已經過時,取而代之的是onStartCommand()
1. 啟動類型的服務
(1) 第一次啟動服務時:
執行了onCreate方法和onStartCommand方法
(2) 再次點擊開啟服務:
只會執行onStartCommand方法
(3) 停止服務
執行onDestroy方法
2. 綁定類型的服務
(1) 綁定服務
調用了onCreate方法和onBind方法
(2) 解綁服務
先調用了onUnBind方法再調用onDestroy方法
下圖說明了一個服務的典型回調方法。盡管這個圖把由startService()方法創建的服務與由bindService()方法創建的服務給分開了,
但是請記住,任何服務,不管它是怎樣啟動的,都可能允許客戶綁定它。
因此用onStartCommand()方法(通過一個客戶端調用startService()方法)初始啟動的服務,
依然能夠接收onBind()的調用(在客戶端調用bindService()方法時)。
圖的左邊顯示了用startService()方法創建服務時的生命周期
圖的右邊顯示了用bindService()方法創建服務時的生命周期
注意: 建議啟動服務的順序,這樣不會出現問題:
1. 開啟服務 --- 保證服務一直后台運行
2. 綁定服務 --- 可以調用服務中的方法
3. 調用服務中的方法
4. 解綁服務 --- 這時服務依然后台運行
5. 停止服務