們有兩種方式(start與bind)啟動一個Service,每一種方式啟動的Service生命週期是不一樣的,這篇貼子主要寫的是 start service。

它的生命週期中只有三個階段:onCreate, onStartCommand(取代原來的onStart方法), onDestroy。如下圖:



 

需要注意的有:

1 如果是 調用者 直接退出而沒有調用 stopService 的話,那麼被啟動的 Service 會一直在後台運行,直至其stopService 方法被調用,或者它自己調用stopSelf 方法。

2 在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStartCommand()方法。如果調用startService()方法前服務已經被創建,那麼會直接調用onStartCommand()方法。也就是說,多次調用startService()方法並不會導致多次創建服務。另外,不管被 start 多少次,只需一次 stop 便可將相應的service關閉。
3 具體的操作應該放在 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中去查看,可得下面的截圖,發現服務確實已經被停止了:



 

下面附上部分源碼(具體地請參見附件):

Java代碼  收藏代码
  1. // 四個按鈕的響應事件  
  2.   
  3. private OnClickListener btnListener = new OnClickListener() {  
  4.         @Override  
  5.         public void onClick(View v) {  
  6.             switch (v.getId()) {  
  7.                 case R.id.startSer1:  
  8.                     updateLog("Start Service 1 pressed");  
  9.                      // 啟動服務(如果想傳遞數據,也可以將其封裝進該intent)  
  10.                     startService(intent);  
  11.                     break;  
  12.                 case R.id.startSer2:  
  13.                     updateLog("Start Service 2 pressed");  
  14.                     startService(intent);  
  15.                     break;  
  16.                 case R.id.stopSer1:  
  17.                     updateLog("Stop Service 1 pressed");  
  18.                     // 停止服務  
  19.                     stopService(intent);  
  20.                     break;  
  21.                 case R.id.stopSer2:  
  22.                     updateLog("Stop Service 2 pressed");  
  23.                     stopService(intent);  
  24.                     break;  
  25.                 default:  
  26.                     break;  
  27.             }  
  28.         }  
  29.     };  

 

Java代碼  收藏代码
  1. // service 的實現  
  2. public class MyService extends Service {  
  3.     private static final String TAG = "MyService";  
  4.   
  5.     @Override  
  6.     public void onCreate() {  
  7.         super.onCreate();  
  8.         MyServiceActivity.updateLog(TAG + " ----> onCreate()");  
  9.     }  
  10.   
  11.     @Override  
  12.     public int onStartCommand(Intent intent, int flags, int startId) {  
  13.         MyServiceActivity.updateLog(TAG + " ----> onStartCommand()");  
  14.         return START_STICKY;  
  15.     }  
  16.   
  17.     @Override  
  18.     public IBinder onBind(Intent intent) {  
  19.         MyServiceActivity.updateLog(TAG + " ----> onBind()");  
  20.         return null;  
  21.     }  
  22.   
  23.     @Override  
  24.     public void onDestroy() {  
  25.         super.onDestroy();  
  26.         MyServiceActivity.updateLog(TAG + " ----> onDestroy()");  
  27.     }  
  28. }  

   

創作者介紹

Felix's Second Life 電腦數碼世界

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()