2012-01-09 5 views
36

J'ai l'activité et le service. Lorsque l'activité est démarrée, elle appelle startService() pour que ce service soit actif même lorsque l'activité est détruite, et bindService() pour communiquer avec ce service.Service Android: onBind (Intent) et onUnbind (Intent) est appelé une seule fois

bindService() renvoie la valeur true, mService.onBind() est appelée et ServiceConnection.onServiceConnected() est appelée aussi. Tout fonctionne

Lorsque je détruis mon activité en appuyant sur la touche Retour, il appelle unbindService(), et mon mService.onUnbind() est appelé. (Je reviens false dans ce onUnbind().)

Puis-je commencer à nouveau cette activité, bindService() renvoie true, puis mService.onBind() est pas appelé! Mais ServiceConnection.onServiceConnected() est appelé aussi, et tout fonctionne à nouveau.

Il semble que Dalvik se souvienne de ce que mon onBind() a retourné la dernière fois, et n'appelle pas de nouveau onBind(). Lorsque je détruis à nouveau mon activité, onUnbind() est et non.

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

Dans docs je ne trouve aucune explication de ce comportement. Inversement, this figure indique que onBind() et onUnbind() doivent être appelés chaque fois que les clients lient et délient le service. Cette figure peut être trouvée sur le bas de this Dev Guide.

Répondre

47

Je pense que this (référencé du guide dev officiel) peut expliquer toutes vos requêtes:

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

+21

oh merci. J'ai raté ça, malheureusement. Cependant, j'ai découvert que je peux renvoyer true dans 'onUnbind()', puis 'onRebind()' et 'onUnbind()' seront appelés pour le client suivant. –

+18

La documentation est réellement trompeuse. Il dit qu'il n'y a plus d'appels à 'onBind()', mais cela s'applique uniquement au cas de plusieurs clients. Les documents indiquent également que si votre service est démarré et accepte la liaison, lorsque le système appelle votre méthode onUnbind(), vous pouvez éventuellement renvoyer true si vous souhaitez recevoir un appel à onRebind() la prochaine fois qu'un client se connecte au service (** au lieu de recevoir un appel à onBind() **) ". Seulement, il n'y a pas d'appel à 'onBind()'. Encore un autre cas où la documentation est erronée. – Malcolm

+0

désolé de se cogner dans @Malcolm ... j'ai une question concernant ce genre de liaison et unbinding.Qu'en est-il si je mets un thread ServerSocket à l'intérieur de ce service, et dans l'activité A, je mets onStart() et onStop() avec liaison et désengagement en conséquence. Serait-il recréé si je passais à une autre activité et la reliais? ou le Fil reste-t-il le dernier? – gumuruh

0

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

Vous pouvez connecter plusieurs clients à un service en même temps. 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 IBinder uniquement lorsque le premier client se lie. Le système fournit ensuite ce même IBinder à tous les clients supplémentaires qui se lient à ce même service, sans appeler de nouveau onBind().