我們有兩種方式(start與bind)啟動一個Service,每一種方式啟動的Service生命週期是不一樣的,這篇貼子主要寫的是 start service。
它的生命週期中只有三個階段:onCreate, onStartCommand(取代原來的onStart方法), onDestroy。如下圖:
需要注意的有:
① 如果是 調用者 直接退出而沒有調用 stopService 的話,那麼被啟動的 Service 會一直在後臺運行,直至其stopService 方法被調用,或者它自己調用stopSelf 方法。
② 在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStartCommand()方法。如果調用startService()方法前服務已經被創建,那麼會直接調用onStartCommand()方法。也就是說,多次調用startService()方法並不會導致多次創建服務。另外,不管被 start 多少次,只需一次 stop 便可將相應的service關閉。
③ 具體的操作應該放在 onStartCommand() 裡面
以下通過截圖來看:
上圖的中的四個按鈕均是針對於同一個Service進行的操作,此時去 application ,可以查看到 "Running Service" 的列表如下:
這個,我們去點擊上面的按鈕(分別點擊startservice 1 和 2 各兩次),結果如下:
從圖中,我們可以看出, onCreate() 方法只在第一次創建服務的時候被調用了。
現在,通過“返回鍵”來退回至主界面,然後再去 application 的 running service中去查看,可得下面的截圖:
從此圖中,我們可以看出,雖然Activity被finish掉了,但是由它啟動的service仍然在後臺運行著。
此時,重新打開該應用,然後直接點擊 stop service 1 和 2 按鈕各兩次(不需再新點擊 start service按鈕),可以如下截圖:
從此圖中我們可以看出,只有第一次停止服務的時候,才會調用 onDestroy() 方法。
此時,再去 application 的 running service中去查看,可得下面的截圖,發現服務確實已經被停止了:
下面附上部分源碼(具體地請參見附件):
// 四個按鈕的響應事件private OnClickListener btnListener = new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.startSer1: updateLog("Start Service 1 pressed"); // 啟動服務(如果想傳遞數據,也可以將其封裝進該intent) startService(intent); break; case R.id.startSer2: updateLog("Start Service 2 pressed"); startService(intent); break; case R.id.stopSer1: updateLog("Stop Service 1 pressed"); // 停止服務 stopService(intent); break; case R.id.stopSer2: updateLog("Stop Service 2 pressed"); stopService(intent); break; default: break; } } };
// service 的實現 public class MyService extends Service { private static final String TAG = "MyService";@Override public void onCreate() { super.onCreate(); MyServiceActivity.updateLog(TAG + " ----> onCreate()"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { MyServiceActivity.updateLog(TAG + " ----> onStartCommand()"); return START_STICKY; } @Override public IBinder onBind(Intent intent) { MyServiceActivity.updateLog(TAG + " ----> onBind()"); return null; } @Override public void onDestroy() { super.onDestroy(); MyServiceActivity.updateLog(TAG + " ----> onDestroy()"); }
}