2012-05-24 49 views
30

單擊按鈕我想使用方法startService(new Intent(currentActivity.this,MyService.class))啓動服務,但是如果服務正在運行,我不想調用此方法來避免運行已在運行的服務。這是如何實現的。我在同一個項目中同時使用意向服務服務,並且希望對兩者都應用相同的條件。如何防止服務再次運行,如果已經運行android

+1

相關http://stackoverflow.com/questions/8019899/starting-a-service-multiple-times –

回答

67

服務將只運行一次,因此您可以多次撥打startService(Intent)

您將在服務中收到onStartCommand()。所以記住這一點。

來源: 注意,要Context.startService()多次調用不嵌套(儘管也導致他們在多個相應的調用onStartCommand()),所以無論多少次啓動的服務將被停止一次Context.stopService()stopSelf()被調用;但是,服務可以使用它們的stopSelf(int)方法來確保服務不會停止,直到處理完啓動的意向。

在:http://developer.android.com/reference/android/app/Service.html在題目:服務生命週期

+0

感謝您的快速回復。您的評論將幫助我很多,但不想再次調用這些方法if服務正在運行。任何其他想法? –

+9

@AtulBhardwaj:調用'startService()'*總是*觸發'onStartComand()'。期。所以,要麼不要調用'startService()',要麼有一個更聰明的'onStartCommand()'來處理多次調用。 – CommonsWare

+0

@CommonsWare得到你的觀點:) –

7

綁定您服務;開始呼叫時:

Intent bindIntent = new Intent(this,ServiceTask.class); 
    startService(bindIntent); 
    bindService(bindIntent,mConnection,0); 

那就要檢查一下,如果你的服務工作,請使用類似的方法:

public static boolean isServiceRunning(String serviceClassName){ 
      final ActivityManager activityManager = (ActivityManager)Application.getContext().getSystemService(Context.ACTIVITY_SERVICE);  
      final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);  
      for (RunningServiceInfo runningServiceInfo : services) {   
      if (runningServiceInfo.service.getClassName().equals(serviceClassName)){    
       return true;   
      }  
      }  
     return false; 
     } 
+0

只有當我將服務綁定到活動時,這個代碼才能工作嗎???我認爲綁定服務到活動將運行直到應用程序正在運行。請註釋 –

+1

這不會始終工作。它不考慮「服務被停止」。它主要用於顯示Running Services UI。我已經使用過它,它永遠不會在KitKat中工作。相反,您可以使用startService ALWAYS並使用onCreate和onStartCommand服務來完成您的任務。這是正確的方法。 –

+1

爲什麼在這裏需要**綁定服務**?我們不能只使用** Started Service **嗎? –

15

使用startService()。 開始服務將致電onStartCommand()如果服務尚未啓動,它將致電onCreate()。初始化你的變量和/或在onCreate()開始一個線程。

+0

這是正確的答案。 onCreate()被忽略。 – likejiujitsu

1

每當我們從任何活動開始任何服務時,Android系統調用服務的onStartCommand()方法。如果服務尚未運行,系統首先調用onCreate(),然後調用onStartCommand()。

所以有意思的是,android服務在其生命週期中只有一次啓動,並保持運行直到停止。如果其他客戶端想要再次啓動它,那麼只有onStartCommand()方法會一直調用。

相關問題