web-dev-qa-db-fra.com

Service Android: onBind (Intent) et onUnbind (Intent) est appelé une seule fois.

J'ai l'activité et le service. Lorsque Activity est démarré, il appelle startService() pour que ce service soit actif même lorsque l'activité est détruite, et bindService() pour communiquer avec ce service.

bindService() renvoie true, mService.onBind() est appelé et ServiceConnection.onServiceConnected() est également appelé. Tout fonctionne. 

Lorsque je détruis mon activité en appuyant sur la touche Back, il appelle unbindService() et ma mService.onUnbind() est appelée. (Je retourne false dans cette onUnbind().) 

Ensuite, je recommence cette activité, bindService() renvoie true, puis mService.onBind() est ET NON appelé! Mais ServiceConnection.onServiceConnected() est également appelé et tout fonctionne à nouveau.

Il semble que Dalvik se souvienne de ce que ma onBind() est retournée la dernière fois et n’appelle simplement pas onBind() à nouveau. Quand je détruis mon activité à nouveau, onUnbind() est PAS appelé aussi. 

Je peux lier et dissocier ce service à mon activité n'importe quel nombre de fois, mais ces méthodes ne seront plus appelées tant que je n'aurai pas détruit le service en annulant la liaison et en appelant stopService().

Dans la documentation, je ne trouve aucune explication à ce problème. Inversement, ce chiffre montre que onBind() et onUnbind() doivent être appelées à chaque fois que les clients lient et dissocient le service. Ce chiffre se trouve au bas de ce Guide de développement .

39
Dmitry Frank

Je pense que this (référencé par le guide de développement officiel) peut expliquer toutes vos questions: 

Plusieurs clients peuvent se connecter au service à la fois. Cependant, le système appelle la méthode onBind () de votre service pour extraire IBinder uniquement lorsque le premier client est lié. Le système distribue ensuite le même IBinder à tous les clients supplémentaires qui se lient, sans appeler à nouveau onBind ().

51
yorkw

Vous pouvez le trouver ici: https://developer.Android.com/guide/components/bound-services.html

Vous pouvez connecter plusieurs clients à un service simultanément. Cependant, le système met en cache le canal de communication du service IBinder. En d'autres termes, le système appelle la méthode onBind () du service pour générer l'IBinder uniquement lorsque le premier client est lié. Le système distribue ensuite ce même IBinder à tous les clients supplémentaires qui se lient au même service, sans appeler à nouveau onBind ().

0
Amol K