Quelle est la différence entre START_STICKY
et START_NOT_STICKY
lors de la mise en œuvre de services dans Android? Quelqu'un pourrait-il indiquer quelques exemples standard ..?
la source
Quelle est la différence entre START_STICKY
et START_NOT_STICKY
lors de la mise en œuvre de services dans Android? Quelqu'un pourrait-il indiquer quelques exemples standard ..?
Les deux codes ne sont pertinents que lorsque le téléphone manque de mémoire et tue le service avant de terminer son exécution. START_STICKY
indique au système d'exploitation de recréer le service une fois qu'il a suffisamment de mémoire et d'appeler à onStartCommand()
nouveau avec une intention nulle. START_NOT_STICKY
indique au système d'exploitation de ne pas se soucier de recréer le service à nouveau. Il existe également un troisième code START_REDELIVER_INTENT
qui indique au système d'exploitation de recréer le service et de livrer à nouveau la même intention onStartCommand()
.
Cet article de Dianne Hackborn en a expliqué le contexte bien mieux que la documentation officielle.
Source: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html
La partie clé ici est un nouveau code de résultat renvoyé par la fonction, indiquant au système ce qu'il doit faire avec le service si son processus est tué pendant son exécution:
START_STICKY est fondamentalement le même que le comportement précédent, où le service est laissé "démarré" et sera ensuite redémarré par le système. La seule différence avec les versions précédentes de la plate-forme est que si elle est redémarrée parce que son processus est tué, onStartCommand () sera appelé sur la prochaine instance du service avec une intention nulle au lieu de ne pas être appelé du tout. Les services qui utilisent ce mode doivent toujours vérifier ce cas et le traiter de manière appropriée.
START_NOT_STICKY indique que, après le retour de onStartCreated (), si le processus est tué sans aucune commande de démarrage restante à livrer, le service sera arrêté au lieu d'être redémarré. Cela a beaucoup plus de sens pour les services qui sont destinés à s'exécuter uniquement lors de l'exécution des commandes qui leur sont envoyées. Par exemple, un service peut être démarré toutes les 15 minutes à partir d'une alarme pour interroger un état du réseau. S'il est tué en faisant ce travail, il serait préférable de le laisser s'arrêter et de démarrer la prochaine fois que l'alarme se déclenche.
START_REDELIVER_INTENT est comme START_NOT_STICKY, sauf si le processus du service est tué avant d'appeler stopSelf () pour une intention donnée, cette intention lui sera restituée jusqu'à ce qu'elle se termine (sauf si après un certain nombre d'essais supplémentaires, elle ne peut toujours pas se terminer, à quel moment le système abandonne). Cela est utile pour les services qui reçoivent des commandes de travail à effectuer et qui souhaitent s'assurer qu'ils finissent par terminer le travail pour chaque commande envoyée.
START_NOT_STICKY
?START_REDELIVER_INTENT
c'est commeSTART_NOT_STICKY
. Au lieu de cela, c'est commeSTART_STICKY
Réponse KISS
Différence:
START_STICKY
le système essaiera de recréer votre service après sa mort
START_NOT_STICKY
le système n'essaiera pas de recréer votre service après sa mort
Exemple standard:
la source
START_REDELIVER_INTENT
. Je viens de testerSTART_STICKY
et de tuer l'application par des applications récentes. Ensuite, il rappelle le service. MaisSTART_REDELIVER_INTENT
jamais rappelé. Pourquoi?La documentation pour
START_STICKY
etSTART_NOT_STICKY
est assez simple.START_STICKY:
Exemple: service local
START_NOT_STICKY:
Exemple: ServiceStartArguments.java
la source