2011-06-23 13 views

Respuesta

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

Si desea saber si su servicio se está ejecutando en primer plano acaba de abrir algunas otras aplicaciones de grasa y luego verificar si el servicio aún está en marcha o simplemente comprobar bandera service.foreground.

+5

Gracias que funcionaron muy bien! Solo necesitaba agregar esta línea: serviceInForeground = runningServiceInfo.foreground; – user811985

+0

¿Qué pasa con stopForeground (true) en onDestroy()? ¿Eso no evitaría que el servicio se ejecutara en primer plano? –

+4

@ user811985 FYI, la documentación en RunningServiceInfo.foreground indica: "Establezca en verdadero si el servicio * ha pedido * que se ejecute como un proceso en primer plano.". Es decir, no te dice si Android realmente ha aceptado un servicio en primer plano. 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

Encuentro el código en esta respuesta más nítido que el código en la respuesta aceptada, y funciona incluso si hay más de 50 servicios en ejecución, a diferencia de la respuesta aceptada. – Sam

+1

Lo mismo que aceptado, pero más claro, más corto, simple. También verifique todos los servicios, no solo 50. – Sergio

0

Una variante más eficiente de la respuesta: 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; 
} 
Cuestiones relacionadas