2012-02-13 12 views
6

¿Hay alguna manera de evitar que ActivityManager reinicie automáticamente mi Servicio después de que se "cuelgue"? En algunos casos, elimino forzosamente mi servicio al salir del programa, pero no quiero que Android siga reiniciándolo.Android: ¿Cómo evitar que el servicio se reinicie después de bloquearse?

+1

Muestra la implementación esquemática del servicio. –

+0

¿Es un servicio regular o un servicio intencionado? –

Respuesta

1

Su servicio puede almacenar un valor en SharedPreferences. Por ejemplo, puede almacenar algo como esto cada vez que se inicia su servicio: store ("serviceStarted", 1);

Cuando su servicio finaliza de manera regular (envía un mensaje para que lo haga) anula este valor: store ("serviceStarted", 0);

Cuando la próxima vez que se reinicia el servicio, detecta que el valor serviceStarted es "1", lo que significa que su servicio no se detuvo regularmente y se reinició solo. Cuando detecte esto, su servicio puede llamar: stopSelf(); para cancelarse a sí mismo.

Para más información: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

30

Este comportamiento se define por el valor de retorno de onStartCommand() en su aplicación Service. La constante START_NOT_STICKY le dice a Android que no reinicie el servicio si se está ejecutando mientras el proceso se "mata". En otras palabras:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // We don't want this service to continue running if it is explicitly 
    // stopped, so return not sticky. 
    return START_NOT_STICKY; 
} 

HTH

+3

Aunque no está marcada como solución aceptada, esta es la respuesta correcta – scooterman

+0

No funcionará si hay intenciones sobresalientes. Tengo ese problema y el enfoque anterior no funciona. El siguiente enfoque tal vez sea una mejor alternativa, pero aún no lo he implementado. Han intentado otros enfoques sugeridos en el desbordamiento de pila, pero aún no han tenido éxito. –

+0

@BrianReinhold su problema parece que tiene un giro específico en esta pregunta, ¿ha publicado uno de los suyos explicando su caso de uso y los problemas que ha observado? Me interesaría investigar más. – Devunwired

5

Aquí está la solución que se me ocurrió en el caso de que pudiera ayudar a alguien más. Mi aplicación aún se reinició incluso con START_NOT_STICKY. Entonces, en cambio, verifico si el intento es null, lo que significa que el sistema reinició el servicio.

@Override 
public int onStartCommand(@Nullable Intent intent, int flags, int startId) { 
    // Ideally, this method would simply return START_NOT_STICKY and the service wouldn't be 
    // restarted automatically. Unfortunately, this seems to not be the case as the log is filled 
    // with messages from BluetoothCommunicator and MainService after a crash when this method 
    // returns START_NOT_STICKY. The following does seem to work. 
    Log.v(LOG_TAG, "onStartCommand()"); 
    if (intent == null) { 
     Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. Stopping self now."); 
     stopSelf(); 
    } 
    return START_STICKY; 
} 
+0

Gracias. Tuve la necesidad de buscar actualizaciones de ubicación frecuentes y enviarlo al servidor desde el servicio. Lo implementé a través de servicio de primer plano basado en notificación, pero dejó de recibir actualizaciones de ubicación, cada vez que se cerraba la aplicación. Después de 2 días de lucha, alcancé su respuesta y modifiqué su código. Antes de 'stopSelf()', configuré el reinicio del mismo servicio usando 'AlarmManager' después de un retraso de decir 10 segundos por ahora.Y esto funcionó muy bien, ahora obteniendo actualizaciones de ubicación del servicio continuamente. ¡Muchas gracias! – manoj

Cuestiones relacionadas