¿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?
Respuesta
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
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
Aunque no está marcada como solución aceptada, esta es la respuesta correcta – scooterman
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. –
@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
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;
}
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
- 1. Evitar que se destruya un servicio de Android después de desvincular
- 2. Android: reinicie la aplicación después de la actualización - ACTION_PACKAGE_REPLACED
- 3. cómo evitar que el servicio se ejecute nuevamente si ya está ejecutando android
- 4. ¿Cómo puedo compartir un servicio entre actividades sin que se reinicie?
- 5. Android: evitar que la pantalla se apague
- 6. onStartCommand después de que se cancele el proceso de servicio cuando se inició con START_STICKY
- 7. El servicio no recibe mensajes después de que se reinició el servicio Message Queue Server
- 8. Cómo crear un servicio que se reinicia en el bloqueo
- 9. cómo evitar que cmd se cierre después de que se ejecutó un lote?
- 10. Evitar que se descarte el teclado suave
- 11. ¿Cómo puedo evitar AppDomainUnloadedException después de que NUnit pruebe el código PLINQ?
- 12. ¿Cómo puedo evitar que mi aplicación/servicio de Android sea "eliminado" de un administrador de tareas?
- 13. Android: ¿Cómo evitar que el encabezado se desplace en listview, Android?
- 14. Android: ¿cómo es posible que un servicio siga funcionando después de que la Actividad se haya cerrado?
- 15. salida try/catch para evitar que el código después de que se ejecuten
- 16. ¿Cómo hacer que un programa se reinicie solo? (Proceso de Linux)
- 17. ¿Cómo puedo agotar el tiempo de espera de un proceso bifurcado que podría bloquearse?
- 18. ¿Cómo evitar que se abra el teclado suave en el lanzamiento de actividad en Android?
- 19. servicio de Android se detiene
- 20. ¿Cómo puedo hacer que Bottle se reinicie al cambiar el archivo?
- 21. ¿Hay alguna manera de reiniciar un servicio después de actualizar la aplicación en Android?
- 22. ¿Por qué debería bloquearse el depurador VS2010?
- 23. Android: Cómo evitar que el botón Atrás cancele un FragmentDialog
- 24. reinicie jquery.fadeOut() mientras se está desvaneciendo
- 25. Evitar el ataque de denegación de servicio
- 26. Servicio Android que controla MediaPlayer
- 27. El servicio no se detuvo por completo después de ServiceController.Stop()
- 28. ¿Por qué el servicio se detiene después de actualizar RPM?
- 29. ¿Cómo evitar que el algoritmo de aleatoriedad se "atasque"?
- 30. Cómo evitar que se abra el menú de selección
Muestra la implementación esquemática del servicio. –
¿Es un servicio regular o un servicio intencionado? –