service Android startService () et bindService ()

Je voudrais savoir s’il est possible d’avoir un service qui est démarré avec startService et ensuite être capable de se connecter à ce service et de faire des appels de procédure à distance? selon ceci: http://developer.android.com/guide/topics/fundamentals.html#servlife

les deux services ont un cycle de vie différent, donc ce n’est pas possible, est-ce que quelqu’un le sait?

Je pense que la réponse de hara était un peu déroutante. Ce que vous décrivez est parfaitement légitime et, en fait, le seul moyen d’obtenir le comportement souhaité. Si vous créez un service en vous y liant, il mourra lorsque vous vous déconnecterez. Donc, la seule façon de le conserver sans activités qui lui sont liées est de le démarrer avec startService (). Il n’y a pas de conflit avec les cycles de vie car cela ne concerne que la façon dont le service est COMMENCÉ. Ainsi, une fois démarré avec startService (), il suit ce processus de cycle de vie. Vous êtes donc libre de vous lier et de vous délier autant que vous le souhaitez et cela ne mourra que lorsque vous appelez stopService () ou stopSelf ()

Oui, vous pouvez lancer et lier (une ou plusieurs fois) le même service.

L’organigramme suivant montre comment le cycle de vie d’un service est géré. Le compteur de variables suit le nombre de clients liés: entrer la description de l'image ici

Bon exemple – application musicale. Explication de la création d’un tutoriel officiel du service de navigateur multimédia :

Un service uniquement lié (et non démarré) est détruit lorsque tous ses clients sont déconnectés. Si votre activité d’interface utilisateur se déconnecte à ce stade, le service est détruit. Ce n’est pas un problème si vous n’avez encore joué aucune musique. Cependant, lorsque la lecture commence, l’utilisateur s’attend probablement à continuer d’écouter même après avoir changé d’application. Vous ne voulez pas détruire le lecteur lorsque vous déconnectez l’interface utilisateur pour travailler avec une autre application.

Pour cette raison, vous devez vous assurer que le service est démarré lorsqu’il commence à être lu en appelant startService (). Un service démarré doit être explicitement arrêté, qu’il soit lié ou non. Cela garantit que votre lecteur continue à performer même si l’activité de contrôle de l’interface utilisateur se détache.

Pour arrêter un service démarré, appelez Context.stopService () ou stopSelf (). Le système arrête et détruit le service dès que possible. Toutefois, si un ou plusieurs clients sont toujours liés au service, l’appel pour arrêter le service est retardé jusqu’à ce que tous ses clients soient déconnectés.

De service ref:

Un service peut à la fois être démarré et avoir des connexions qui lui sont liées. Dans un tel cas, le système continuera à exécuter le service tant qu’il est démarré ou qu’il existe une ou plusieurs connexions avec l’indicateur Context.BIND_AUTO_CREATE. Une fois qu’aucune de ces situations n’est vérifiée, la méthode onDestroy () du service est appelée et le service est effectivement arrêté.

Si vous démarrez un service à l’aide de startService (), vous devez l’arrêter en utilisant stopService () .

Un service peut être exécuté par le système pour deux raisons. Si quelqu’un appelle Context.startService (), le système récupère le service (en le créant et en appelant sa méthode onCreate () si nécessaire), puis appelle sa méthode onStartCommand (Intent, int, int) avec les arguments fournis par le client. À ce stade, le service continuera à fonctionner jusqu’à ce que Context.stopService () ou stopSelf () soit appelé. Notez que plusieurs appels à Context.startService () ne sont pas nesteds (bien qu’ils entraînent plusieurs appels correspondants à onStartCommand ()), donc peu importe combien de fois il est démarré, un service sera arrêté une fois Context.stopService () ou stopSelf () est appelé; Toutefois, les services peuvent utiliser leur méthode stopSelf (int) pour garantir que le service n’est pas arrêté tant que les intentions démarrées n’ont pas été traitées.

Vous pouvez lier au service autant de ServiceConnection que vous le souhaitez avec bindService () , mais faites attention au drapeau que vous lui avez transmis. Si vous passez 0, si vous appelez stopService (), le service s’arrêtera (je ne sais pas exactement ce qui vous arrive ServiceConnection). Sinon, si vous souhaitez que votre service soit actif jusqu’à ce que ServiceConnection lui soit lié, utilisez BIND_AUTO_CREATE .

c’est à partir de stopService ():

Demander qu’un service d’application donné soit arrêté. Si le service ne fonctionne pas, rien ne se passe. Sinon, il est arrêté. Notez que les appels à startService () ne sont pas comptabilisés – ceci arrête le service quel que soit le nombre de fois qu’il a été démarré.

Notez que si un service arrêté a toujours des objects ServiceConnection liés à l’ensemble BIND_AUTO_CREATE, il ne sera pas détruit tant que toutes ces liaisons ne seront pas supprimées. Consultez la documentation du service pour plus de détails sur le cycle de vie d’un service.

Cette fonction lancera SecurityException si vous n’êtes pas autorisé à arrêter le service donné.

J’espère que ça aide..