2012-05-24 22 views
30

Al hacer clic en un botón quiero iniciar el servicio utilizando el método startService(new Intent(currentActivity.this,MyService.class)) pero si el servicio se está ejecutando no quiero llamar a este método para evitar ejecutar el servicio que ya se está ejecutando. Cómo es posible. Estoy usando Servicio de intento y Servicio en el mismo proyecto y deseo aplicar la misma condición para ambos.cómo evitar que el servicio se ejecute nuevamente si ya está ejecutando android

+1

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

Respuesta

67

Un servicio solo se ejecutará una vez, por lo que puede llamar al startService(Intent) varias veces.

Recibirá un onStartCommand() en el servicio. Así que tenlo en mente.

Fuente: Tenga en cuenta que varias llamadas a Context.startService() no anidan (a pesar de que dan lugar a múltiples llamadas correspondientes a onStartCommand()), así que no importa cuántas veces se pone en marcha un servicio se detendrá una vez Context.stopService() o stopSelf() se llama; sin embargo, los servicios pueden usar su método stopSelf(int) para asegurar que el servicio no se detenga hasta que los intentos iniciales hayan sido procesados.

A: http://developer.android.com/reference/android/app/Service.html en el tema: Servicio del ciclo de vida

+0

Gracias por su rápida respuesta.Su comentario me ayudará mucho pero no desea volver a llamar a estos métodos si el servicio se está ejecutando. ¿Alguna otra idea? –

+9

@AtulBhardwaj: llamadas a 'startService()' * always * trigger 'onStartComand()'. Período. Por lo tanto, no llame a 'startService()', o tenga un 'onStartCommand()' más inteligente que pueda tratar de ser llamado varias veces. – CommonsWare

+0

@CommonsWare Entender :) –

7

vincular a su servicio; cuando se inicia la llamada:

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

A continuación, para comprobar si el servicio está funcionando, utilice un método como:

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

¿Funciona este código solo en caso de que vincule el servicio a la actividad? Creo que el servicio vinculante a una actividad se ejecutará hasta que la aplicación se ejecute. Por favor comente –

+1

Esto no funcionará siempre. No se tiene en cuenta el "Servicio que se detiene". Y es principalmente para mostrar la IU de Running Services. Lo he usado y no funcionará en KitKat siempre. Por el contrario, puede utilizar startService ALWAYS y hacer uso del servicio onCreate y onStartCommand para realizar sus tareas. Es la manera correcta. –

+1

¿Por qué es necesario un ** Bound Service ** aquí? ¿No podemos simplemente usar un ** Servicio iniciado **? –

15

Uso startService(). Start Service llamará al onStartCommand() Si el servicio aún no se inicia llamará al onCreate(). Inicialice sus variables y/o inicie un subproceso en onCreate().

+0

esta es la respuesta correcta. onCreate() se pasa por alto. – likejiujitsu

1

Cada vez que iniciamos un servicio desde cualquier actividad, el sistema Android llama al método onStartCommand() del servicio Y si el servicio no se está ejecutando, el sistema llama primero a Crear(), y luego llama a StartThat().

Lo que quiero decir es que el inicio del servicio de Android es único una vez en su ciclo de vida y lo mantiene funcionando hasta que se detenga. Si cualquier otro cliente desea reiniciarlo, solo se invocará el método onStartCommand() todo el tiempo.

Cuestiones relacionadas