2011-06-23 52 views

回答

14
private boolean isServiceRunning(String serviceName){ 
     boolean serviceRunning = false; 
     ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
     List<ActivityManager.RunningServiceInfo> l = am.getRunningServices(50); 
     Iterator<ActivityManager.RunningServiceInfo> i = l.iterator(); 
     while (i.hasNext()) { 
      ActivityManager.RunningServiceInfo runningServiceInfo = i 
        .next(); 

      if(runningServiceInfo.service.getClassName().equals(serviceName)){ 
       serviceRunning = true; 

       if(runningServiceInfo.foreground) 
       { 
        //service run in foreground 
       } 
      } 
     } 
     return serviceRunning; 
    } 

如果你想知道,如果你的服務是在前臺運行只需要打開其他一些脂肪應用程序,然後檢查是否服務仍在運行,或只檢查標誌service.foreground

+5

感謝那些偉大的工作!我只需要添加這一行:serviceInForeground = runningServiceInfo.foreground; – user811985

+0

onDestroy()中的stopForeground(true)怎麼樣?這不會阻止服務在前臺運行嗎? –

+4

@ user811985僅供參考,有關RunningServiceInfo.foreground的文檔聲明:「如果服務*已*要求作爲前臺進程運行,則設置爲true」。也就是說,它不會告訴你android是否真的接受了前臺的服務。 http://developer.android.com/reference/android/app/ActivityManager.RunningServiceInfo.html#foreground – newbyca

12
public static boolean isServiceRunningInForeground(Context context, Class<?> serviceClass) { 
     ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (serviceClass.getName().equals(service.service.getClassName())) { 
      if (service.foreground) { 
       return true; 
      } 

     } 
     } 
     return false; 
    } 
+3

我覺得這個答案中的代碼比整齊接受的答案,即使有超過50個服務正在運行,它也能正常工作,這與公認的答案不同。 – Sam

+1

與接受的相同,但更清晰,更短,更簡單。同時檢查所有服務,不僅有50個。 – Sergio

0

一個答案的更有效的變化:https://stackoverflow.com/a/36127260/1275265

public static boolean isServiceRunningInForeground(Context context, Class<?> serviceClass) { 
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (serviceClass.getName().equals(service.service.getClassName())) { 
     return service.foreground; 
     } 
    } 
    return false; 
} 
相關問題