web-dev-qa-db-fra.com

START_STICKY et START_NOT_STICKY

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 des exemples types?

248
prago

Les deux codes ne sont pertinents que lorsque le téléphone manque de mémoire et tue le service avant la fin de son exécution. START_STICKY indique au système d'exploitation de recréer le service lorsqu'il dispose de suffisamment de mémoire et d'appeler à nouveau onStartCommand() avec une intention nulle. START_NOT_STICKY indique au système d'exploitation de ne plus recréer le service. Il existe également un troisième code START_REDELIVER_INTENT qui indique au système d'exploitation de recréer le service et de renvoyer la même intention à onStartCommand().

Cet article de Dianne Hackborn explique le contexte de cette affaire beaucoup 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 du service si son processus est arrêté pendant son exécution:

START_STICKY est fondamentalement identique au comportement précédent, dans lequel le service est laissé "démarré" et sera ensuite redémarré par le système. La seule différence par rapport aux versions précédentes de la plate-forme est que si elle est redémarrée car son processus est tué, onStartCommand () sera appelé sur la prochaine instance du service avec un Intent null, au lieu de ne pas être appelé du tout. Les services qui utilisent ce mode doivent toujours vérifier ce cas et le traiter correctement.

START_NOT_STICKY indique qu'après le retour de onStartCreated (), si le processus est tué sans aucune commande de démarrage à livrer, le service sera arrêté au lieu d'être redémarré. Cela a beaucoup plus de sens pour les services destinés à ne s'exécuter que 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 simplement le laisser s'arrêter et de commencer au prochain déclenchement de l'alarme.

START_REDELIVER_INTENT est semblable à START_NOT_STICKY, sauf si le processus du service est tué avant d'appeler stopSelf () pour une intention donnée, cette intention sera restituée jusqu'à ce qu'il soit terminé (à moins qu'un certain nombre de tentatives supplémentaires ne le termine pas, à quel point le système abandonne). Ceci est utile pour les services qui reçoivent des commandes de travail à faire et veulent s'assurer qu'ils finissent par terminer le travail pour chaque commande envoyée.

349
Frank Leigh

KISS réponse

Différence:

START_STICKY

le système essaiera de recréer votre service après sa destruction

START_NOT_STICKY

le système n'essayera pas de recréer votre service après sa suppression


Exemple standard:

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

La documentation pour START_STICKY et START_NOT_STICKY est assez simple.

START_STICKY:

Si le processus de ce service est tué alors qu'il est démarré (après être revenu de onStartCommand(Intent, int, int)), restez-le à l'état démarré mais ne conservez pas cette intention fournie. Plus tard, le système tentera de recréer le service. est dans l'état démarré, il sera garanti d'appeler onStartCommand(Intent, int, int) après la création de la nouvelle instance de service; s'il n'y a aucune commande de démarrage en attente à remettre au service, il sera appelé avec un objet d'intention nul, de sorte doit prendre soin de vérifier pour cela.

Ce mode a du sens pour les choses qui seront explicitement démarrées et arrêtées pour s'exécuter pendant des périodes de temps arbitraires, telles qu'un service effectuant la lecture de musique de fond.

Exemple: exemple de service local

START_NOT_STICKY:

Si le processus de ce service est tué alors qu'il est démarré (après être revenu de onStartCommand(Intent, int, int)), et qu'il n'y a plus d'intention de nouveau départ à y livrer, supprimez le service de l'état démarré et ne le recréez pas jusqu'à une prochaine explicite appel à Context.startService(Intent). Le service ne recevra pas un appel onStartCommand(Intent, int, int) avec une intention null car il ne sera pas redémarré s'il n'y a pas d'intention en attente à livrer.

Ce mode a du sens pour les choses qui veulent faire du travail après avoir été démarré, mais il peut être arrêté quand la mémoire est insuffisante et explicite de se remettre à zéro plus tard pour faire plus de travail. Un exemple d'un tel service serait celui qui interroge les données d'un serveur: il pourrait programmer une alarme pour interroger toutes les N minutes en faisant en sorte que l'alarme démarre son service. Lorsque sa onStartCommand(Intent, int, int) est appelée à partir de l'alarme, elle planifie une nouvelle alarme pendant N minutes plus tard et génère un thread pour faire sa mise en réseau. Si son processus est tué lors de cette vérification, le service ne sera pas redémarré jusqu'à ce que l'alarme se déclenche.

Exemple: ServiceStartArguments.Java

23
Marvin Pinto