2014-09-02 38 views
0

這些方法在擴展Service的類中實現。每次按下按鈕時都會啓動一項新服務。多線程生命週期中的多服務

如果按下按鈕一次,LogCat會輸出我期望的內容,其中包括「Service onDestroy」的最終輸出。但是,當按鈕被按下兩次時,第一次服務結束之前的第二次「Service onDestroy」。第一項服務完成後僅顯示一次,第二項服務打印出「服務正在運行」日誌的其餘部分,但不打印「Service onDestroy」。

有誰能告訴我爲什麼?謝謝!

public int onStartCommand(Intent intent,int flags, int startId) { 
    Log.i(TAG,"Service onStartCommand " + startId); 

    final int currentId = startId; 

    Runnable r = new Runnable() { 
     public void run() { 
      for (int i = 0; i < 3; i++) { 
       long endTime = System.currentTimeMillis() + 10*1000; 
       while (System.currentTimeMillis() < endTime) { 
        synchronized(this) { 
         try { 
          wait(endTime - System.currentTimeMillis()); 
         }catch (Exception e) { 

         } 
        } 
       } 
       Log.i(TAG,"Service running"); 
      } 
      stopSelf(); 
     } 
    }; 

    Thread t = new Thread(r); 
    t.start(); 


    return Service.START_STICKY; 
} 


@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    Log.i(TAG,"Service onBind"); 

    return null; 
} 



@Override 
public void onDestroy() { 
    Log.i(TAG,"Service onDestroy"); 
} 

回答

0

在服務指南中,他們使用服務時不使用stopSelf(),而是使用stopSelf(startId)。第一個stopSelf()可以停止執行你的服務。

在這裏看到:http://developer.android.com/guide/components/services.html

編輯:也是一種服務只創建和銷燬一次,即使有它的幾個執行運行它仍然是一個單一的服務。在你的情況下(綁定服務),只有在最後一次執行完成時纔會被銷燬。爲了記錄每次執行結束,您可以嘗試覆蓋stopSelf(int startId)方法。