android service 之一 (start service)
我們有兩種方式(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()");
- }
- }