2011-06-23 15 views

Odpowiedz

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; 
    } 

Jeśli chcesz wiedzieć, czy usługa jest uruchomiona w planie tylko otworzyć niektóre inne aplikacje tłuszczu, a następnie sprawdzić, czy usługa jest nadal działa lub po prostu sprawdzić flagę service.foreground.

+5

Dzięki który działał świetnie! Właśnie dodałem tę linię: serviceInForeground = runningServiceInfo.foreground; – user811985

+0

Co powiesz na stopForeground (true) w onDestroy()? Czy to nie powstrzymałoby służby przed uruchomieniem na pierwszym planie? –

+4

@ user811985 FYI, dokumentacja dotycząca stanów RunningServiceInfo.foreground: "Ustawiona na true, jeśli usługa * poprosiła *, aby działała jako proces pierwszego planu.". Oznacza to, że nie mówi ci, czy Android rzeczywiście przyjął usługę na pierwszy plan. 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

Znajduję kod w tej odpowiedzi bliżej niż kod w zaakceptowana odpowiedź i działa, nawet jeśli działa więcej niż 50 usług, w przeciwieństwie do zaakceptowanej odpowiedzi. – Sam

+1

To samo, co akceptowane, ale bardziej jasne, krótsze, proste. Sprawdź także wszystkie usługi, nie tylko 50. – Sergio

0

Bardziej wydajny wariant odpowiedzi: 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; 
} 
Powiązane problemy