studio startservice startforeground servicio saber onstartcommand notification intent implement how esta detener corriendo como android android-service

android - startservice - START_STICKY y START_NOT_STICKY



startforeground notification android (4)

Respuesta KISS

Diferencia:

START_STICKY

El sistema intentará volver a crear su servicio una vez que se haya eliminado.

START_NOT_STICKY

El sistema no intentará volver a crear su servicio después de que se cancele

Ejemplo estándar:

@Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; }

¿Cuál es la diferencia entre START_STICKY y START_NOT_STICKY al implementar servicios en Android? ¿Alguien podría señalar algunos ejemplos estándar ...?


Ambos códigos solo son relevantes cuando el teléfono se queda sin memoria y mata 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 llame a onStartCommand() nuevamente con una intención nula. START_NOT_STICKY le dice al sistema operativo que no se moleste en volver a START_NOT_STICKY el servicio nuevamente. También hay un tercer código START_REDELIVER_INTENT que le dice al sistema operativo que START_REDELIVER_INTENT a crear el servicio y que onStartCommand() a onStartCommand() la misma intención 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 indica al sistema qué debe hacer con el servicio si su proceso se interrumpe mientras se está ejecutando:

START_STICKY es básicamente el mismo que el comportamiento anterior, donde el servicio se deja "iniciado" y luego el sistema lo reiniciará. La única diferencia con respecto a las versiones anteriores de la plataforma es que si se reinicia debido a que su proceso finaliza, se llamará a OnStartCommand () en la siguiente instancia del servicio con una Intención nula en lugar de no recibir ninguna llamada. 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 detiene sin que queden comandos de inicio restantes para entregar, el servicio se detendrá en lugar de reiniciarse. Esto tiene mucho más sentido para los servicios que están destinados a ejecutarse mientras se ejecutan los comandos que se les envían. Por ejemplo, un servicio puede iniciarse cada 15 minutos desde una alarma para sondear un estado de la red. Si muere al hacer ese trabajo, sería mejor dejar que se detenga y comenzar la próxima vez que se active la alarma.

START_REDELIVER_INTENT es como START_NOT_STICKY, excepto que si el proceso del servicio se interrumpe antes de que se llame a stopSelf () para una intención determinada, esa intención se le volverá a entregar hasta que se complete (a menos que después de un número mayor de intentos aún no se pueda completar, en cuyo punto el sistema se da por vencido). Esto es útil para los servicios que reciben órdenes de trabajo y desean asegurarse de que finalmente completen el trabajo para cada comando enviado.


La documentación para START_STICKY y START_NOT_STICKY es bastante sencilla.

START_STICKY

Si el proceso de este servicio se onStartCommand(Intent, int, int)) mientras se inicia (después de regresar de onStartCommand(Intent, int, int)) , déjelo en el estado iniciado pero no retenga esta intención entregada. Posteriormente el sistema intentará recrear el servicio. Debido a que se encuentra en el estado de inicio, garantizará la onStartCommand(Intent, int, int) después de crear la nueva instancia de servicio; Si no hay comandos de inicio pendientes para ser entregados al servicio, se llamará con un objeto de intención nula, por lo que debe asegurarse de verificar esto.

Este modo tiene sentido para las cosas que se iniciarán y pararán explícitamente para que se ejecuten durante períodos de tiempo arbitrarios, como un servicio que realiza una reproducción de música de fondo.

Ejemplo: Muestra de servicio local

START_NOT_STICKY

Si el proceso de este servicio se onStartCommand(Intent, int, int)) mientras se inicia (después de regresar de onStartCommand(Intent, int, int)) , y no hay nuevas intenciones de inicio que entregar, retire el servicio del estado iniciado y no vuelva a crear hasta una futura llamada explícita a Context.startService(Intent) . El servicio no recibirá una onStartCommand(Intent, int, int) con un Intent null porque no se reiniciará si no hay Intents pendientes para entregar.

Este modo tiene sentido para las cosas que quieren hacer algún trabajo como resultado del inicio, pero se pueden detener cuando están bajo la presión de la memoria y se volverán a iniciar explícitamente más tarde para hacer más trabajo. Un ejemplo de tal servicio sería uno que sondea los datos de un servidor: podría programar una alarma para sondear cada N minutos haciendo que la alarma inicie su servicio. Cuando se onStartCommand(Intent, int, int) desde la alarma, programa una nueva alarma para N minutos más tarde, y genera un hilo para hacer su red. Si se interrumpe su proceso mientras se realiza esa comprobación, el servicio no se reiniciará hasta que suene la alarma.

Ejemplo: ServiceStartArguments.java


START_STICKY se usa para servicios que se inician y detienen explícitamente según sea necesario, mientras que START_NOT_STICKY o START_REDELIVER_INTENT se usan para servicios que solo deben seguir ejecutándose mientras se procesan los comandos que se les envían.