Le 14 septembre 2017, nous avons publié une version actualisée de notre Politique de confidentialité. En utilisant video2brain.com vous vous engagez à respecter ces documents mis à jour. Veuillez donc prendre quelques minutes pour les consulter.

Android : L'interaction avec les appareils

Binder un service

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Appréhendez la manière dont votre activité pourra se connecter à un service. Ainsi, vous pourrez communiquer avec ce même service.
08:18

Transcription

Actuellement, nous avons une activité qui lance un service et notre service affiche des messages dans la console toutes les deux secondes. Dans cette vidéo, je vais vous montrer comment faire en sorte que notre service puisse transmettre les messages qu'il affiche dans la console à l'activité pour que celle-ci puisse les afficher dans son « TextView ». Problème : notre activité n'a pas de pointeur sur mon service et mon service n'a pas de pointeur vers mon activité. Donc, impossible de faire le « call back » habituel avec des interfaces. Je vais donc vous montrer comment « binder » notre activité à un service de manière à pouvoir avoir un pointeur vers notre service. Pour cela, j'ai rajouté un bouton que j'ai appelé « Connexion au service » qui va nous permettre de lancer la connexion au service. Côté Activité, j'ai rajouté un pointeur vers ce bouton, j'ai récupéré son instance et je me suis abonné à ses clics. Côté Service, j'ai créé une interface qui sera notre interface de « call back ». Elle va nous permettre de transmettre les messages. J'ai créé un « setter » qui va nous permettre de nous abonner à notre service ainsi qu'un pointeur vers notre interface et, au moment d'afficher les messages dans la console, je les transmettrai grâce à mon « call back ». Attention, ici, à bien vérifier que mon pointeur n'est pas nul car, au lancement de mon service, le pointeur sera nul. Voilà donc mon service est prêt à recevoir un « call back ». Pour cela, il faut avoir un pointeur vers notre service. Comment obtenir un pointeur vers notre service ? On va créer une classe interne dont le seul but est d'avoir un pointeur vers notre service. J'appelle cette classe « MyServiceBinder » elle contient un pointeur vers notre service, on va faire un « getter » et on va lui ajouter un constructeur qui prend en paramètres un pointeur vers notre service. Pour que cela fonctionne, il va falloir lui ajouter « InstanceBinder » c'est-à-dire la faire étendre de la classe « Binder » et, dans notre constructeur, appeler le constructeur de « Binder ». En fait, « Binder » implémente l'interface « IBinder » qui est ici. Du coup, dans ma méthode « onBind » je vais pouvoir faire « new myServiceBinder » et lui transmettre l'instance du service courant, à savoir « this ». On peut donc maintenant se « binder » à notre service. Nous allons nous « binder » à notre service côté « Activity ». Ici, j'ai un pointeur vers notre service c'est justement ce que l'on cherche à obtenir pour pouvoir s'abonner à son « call back ». Pour cela, nous allons utiliser la classe « serviceConnexion » c'est une classe mise à disposition par le SDK, exprès pour se « binder » au service. Dans le « onCreate », je vais instancier le « serviceConnexion ». Comme c'est une interface, elle va me générer deux méthodes passant par un objet anonyme. La première « onServiceConnected » qui va me prévenir quand j'ai réussi à me « binder » à mon service et me transmettre un pointeur vers un « IBinder ». Ce pointeur vers notre « IBinder » représente ce que nous retournons dans la méthode « onBind » donc un « myServiceBinder ». Ce qui veut dire qu'ici, je vais pouvoir « caster » mon paramètre reçu en « myServiceBinder ». De là, je vais pouvoir récupérer le pointeur vers mon service vu que le seul rôle de « myServiceBinder » est d'avoir un pointeur vers notre service. Maintenant que j'ai mon pointeur vers mon service, je peux m'abonner à son « call back ». Ici, si j'envoie juste « this », il va représenter l'instance de serviceConnexion Pour préciser qu'on veut l'instance du « this » de « MainActivity », on l'écrit avec cette syntaxe « MainActivity.this ». Voilà pour quand je me connecte à mon service. Quand mon service se déconnecte, ou s'il est tué, on va passer dans « onServiceDisconnected ». Dans ce cas-là, on va libérer le « call back » sinon on sera lié et, du coup, le « garbage collector » ne pourra pas récupérer l'espace mémoire pris par le service et on va indiquer que notre service est maintenant nul. Donc voilà l'objet « serviceConnexion » qui va nous permettre d'être au courant. Ici, j'ai transmis que je veux que ce soit « MainActivity » qui implémente l'interface donc « Alt+entrée », ce qui me génère la méthode « onServiceMessage » qui sera appelée par la classe « myService» lorsqu'elle transmettra un message. Quand on reçoit un message, je vous rappelle que les messages sont transmis ici, je suis donc à l'intérieur de la méthode « run » de mon « timer ». Mon « timer » ne travaillant pas sur le « thread » principal, transmettra ses messages donc dans un « thread » à part en dehors de l' « UI thread ». Cette méthode sera donc appelée en dehors de l' « UI thread ». Ici, si je ne suis pas dans l' « UI thread », pour rappel on ne peut pas toucher aux composants graphiques en dehors de l' « UI thread », je vais donc utiliser la méthode « runOnUiThread » fournie par la classe « Activity » qui prend un « runnable » et tout ce qui est contenu dans le « run » sera exécuté sur l' « UI thread ». Je vais donc pouvoir faire « tv.setText » de mon « text ». Si je fais cela, je vais avoir tout le temps le même texte qui s'affiche à l'écran vu que mon service envoie le même message en boucle tant qu'on n'a pas incrémenté notre « startID ». Je vais donc rajouter le contenu qu'il y avait avant, ce qui veut dire que cela revient juste à écrire du texte au-dessus et je mets un retour à la ligne pour un peu de mise en forme. Ici, mon « Text » pour y avoir accès, il faut le déclarer en « final ». Voilà pour écrire. Maintenant, comment on se « bind » à notre service ? On va utiliser le même principe que pour « startService », on va faire un « intent » et derrière, pour dire qu'on lance le servive, on va utiliser la méthode « bindService » où on va transmettre notre « intent » que représente notre service, notre objet « serviceConnexion » qui sera le « call back » pour savoir quand notre service est connecté ou non et l'attribut 0 en dernier argument. Que représente ce zéro ? Je fais « Ctrl+clic » pour arriver ici. J'appuie sur le petit « i » pour arriver à l'interface et là, j'ai la doc complète de mon dernier argument. Cela représente simplement comment se passe le « bind » c'est-à-dire que si le service n'existe pas, est-ce que je le crée ou non ou d'autres éléments. Si je mets zéro, il ne se passe tout simplement rien, c'est-à-dire que si je me « bind » et qu'il n'y a pas de service, il ne fait rien. Je vous laisse lire le reste de la documentation pour plus d'informations. Maintenant, ici, je viens de me « binder » à un service. Si je me « bind » à un service, je vais avoir un risque d'erreurs qui est tout simplement que si je quitte mon activité sans me « débinder », je vais me retrouver avec un pointeur vers notre service et, du coup, le « garbage collector » ne pourra pas libérer l'activité. Il va donc falloir que je me « débinde ». Si on se « bind » à un service, il faut se « débinder », que le servive ait été lancé ou non. Pour faire simple, je vais gérer une variable qui sera un « boolean bind = false » Si je me suis « bindé » au service « bind = true » et, au moment où je vais détruire mon activité, je vais simplement faire un « if (bind) ». Si j'ai été « bindé », je vais utiliser la méthode « unbindService » de mon « serviceConnexion ». Si je n'ai pas été « bindé » dans tous les cas, mon pointeur vers mon service, lui, sera toujours nul. Par contre, si j'ai été « bindé » je vais pouvoir aussi libérer mon service en me désabonnant du « call back ». Toujours le même principe. Mon activité n'ayant plus de lien avec mon service, le « garbage collector » pourra la libérer. Testons notre application. Premier exemple, je démarre le service. Il est bien démarré dans la console, je m'y connecte, je suis bien synchronisé avec ma console, j'arrête mon service, ma console et mon « textView » s'arrêtent. J'ai bien mon service qui a communiqué avec mon activité. J'effectue une rotation de l'écran, ça efface mon « textView ». Cette fois, je me connecte au service, donc celui-ci n'est pas démarré, n'existe peut-être même pas, et derrière, je le démarre. Il passe dans « onCreate » et je me connecte bien à mon service. J'effectue une rotation d'écran, je passe dans l' « onDestroy » et donc je me désabonne de mon service je n'ai pas de flux de mémoire, je reviens, mon service tourne toujours. Derrière, je m'y connecte, je peux le rejoindre. Je l'arrête. Dernier cas de figure, je lance mon service donc mon service tourne. J'effectue une rotation d'écran, ça revient à quitter l'activité et à revenir dessus. J'arrête mon service, mon service s'arrête, rotation de l'écran, tout est bon. Voilà, vous savez maintenant comment vous « binder » à votre service.

Android : L'interaction avec les appareils

Exploitez les outils mis à disposition par le kit de développement Android. Améliorez l’expérience utilisateur de vos applications​ mobiles​ avec les composants et les animations.

1h58 (23 vidéos)
Aucun commentaire n´est disponible actuellement
 

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !