servicio running onstartcommand intent implement how detener always android android-intent

running - service android



Qué es START_STICKY, START_NOT_STICKY y START_REDELIVER_INTENT Servicio (3)

No puedo entender

  1. START_STICKY,
  2. START_NOT_STICKY y
  3. START_REDELIVER_INTENT

¿Alguien puede explicarlo claramente con ejemplos?

Revisé this enlace pero no pude entenderlo claramente.


Ambos códigos solo son relevantes cuando el teléfono se queda sin memoria y cancela el servicio antes de que termine de ejecutarse. START_STICKY le dice al sistema operativo que vuelva a crear el servicio después de que tenga suficiente memoria y que vuelva a llamar a OnStartCommand () con un intento nulo. START_NOT_STICKY le dice al sistema operativo que no se moleste en volver a crear el servicio. También hay un tercer código START_REDELIVER_INTENT que le dice al SO que vuelva a crear el servicio Y que vuelva a enviar el mismo intento a onStartCommand ().

Este artículo de Dianne Hackborn explicó los antecedentes de esto mucho mejor que la documentación oficial.

Fuente: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html

La parte clave aquí es un nuevo código de resultado devuelto por la función, que le dice al sistema qué debería hacer con el servicio si el proceso se cancela mientras se está ejecutando:

START_STICKY es básicamente el mismo que el comportamiento anterior, donde el servicio se deja "iniciado" y luego será reiniciado por el sistema. La única diferencia con las versiones anteriores de la plataforma es que si se reinicia porque su proceso se cancela, onStartCommand () se invocará en la siguiente instancia del servicio con un Intento nulo en lugar de no llamarse en absoluto. Los servicios que utilizan este modo siempre deben verificar este caso y tratarlo adecuadamente.

START_NOT_STICKY dice que, después de regresar de onStartCreated (), si el proceso se cancela sin comandos de inicio restantes para entregar, entonces el servicio se detendrá en lugar de reiniciarse. Esto tiene mucho más sentido para los servicios que están destinados a ejecutarse solo mientras se ejecutan los comandos que se les envían. Por ejemplo, un servicio se puede iniciar cada 15 minutos desde una alarma para sondear un poco el estado de la red. Si se mata al hacer ese trabajo, lo mejor sería dejar que se detenga y comenzar la próxima vez que se active la alarma.

START_REDELIVER_INTENT es como START_NOT_STICKY, excepto si el proceso del servicio se cancela antes de llamar a stopSelf () para un intento determinado, ese intento se volverá a entregar hasta que se complete (a menos que después de algunos intentos más todavía no se complete, en ese punto el sistema se da por vencido). Esto es útil para los servicios que reciben comandos de trabajo por hacer, y quiere asegurarse de que eventualmente completen el trabajo para cada comando enviado.


Bien, leo el hilo en su enlace, y lo dice todo.

si su servicio es asesinado por Android debido a la poca memoria, y Android borra algo de memoria, entonces ...

  1. STICKY: ... Android reiniciará tu servicio, porque esa bandera en particular está configurada.
  2. NOT_STICKY: ... a Android no le importará volver a empezar, porque la bandera le dice a Android que no debería molestarse.
  3. REDELIVER_INTENT: ... Android reiniciará el servicio Y onStartCommand() a onStartCommand() el mismo intento a onStartCommand() del servicio, porque, nuevamente, de la bandera.

Estos están relacionados con los servicios. Todos sabemos que los servicios se siguen ejecutando en segundo plano y también consumen algo de memoria para ejecutarse.

Entonces, mientras más aplicaciones se ejecutan en dispositivos Android, la memoria del dispositivo sigue bajando y cuando llega el momento, cuando la memoria del dispositivo se vuelve críticamente baja, el sistema Android comienza a terminar procesos para liberar la memoria ocupada por los procesos. .

Pero podría estar haciendo una tarea importante con los servicios, que también podría terminar cuando el servicio se detenga. entonces estos conceptos son para decirle al sistema android qué acción desea realizar cuando la memoria del dispositivo se estabilice y cuando esté lista para reiniciar los servicios.

La explicación más simple de estos podría ser,

START_STICKY- le dice al sistema que cree una copia nueva del servicio, cuando haya suficiente memoria disponible, después de que se recupere de la poca memoria. Aquí perderá los resultados que pudieron haber calculado antes.

START_NOT_STICKY- le dice al sistema que no se moleste en reiniciar el servicio, incluso cuando tenga suficiente memoria.

START_REDELIVER_INTENT- le dice al sistema que reinicie el servicio después del bloqueo y que START_REDELIVER_INTENT- los intentos que estaban presentes en el momento del bloqueo.