Android : L'interaction avec les appareils

Établir le cycle de vie du service

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Ajoutez un timer à votre service. Puis, voyez comment ce timer réagit si l'application venait à être détruite.
05:38

Transcription

Nous allons maintenant mettre un Timer dans notre service. Le but de ce Timer : afficher toutes les deux secondes un message dans la console, soit bonjour, soit bonsoir, en fonction de notre startId, qui est pair ou impair. Pour cela, nous allons créer un Timer, en tant qu'attribut de notre service, ainsi que notre startId que nous allons stocker en attribut. Dans onStartCommand, on va stocker notre startId. On n'a plus besoin du Toast. On va instancier notre Timer dans la méthode onCreate, car il est inutile de relancer un nouveau Timer à chaque fois qu'on lance le service si on l'a lancé au démarrage. Pour indiquer l'action à effectuer tous les x temps, on va utiliser la méthode scheduleAtFixedRate et lui passer un TimerTask. Le contenu de la méthode run sera exécuté toutes les deux secondes et commencera au bout d'une seconde. Donc ici, nous allons nous contenter de mettre bonjour ou bonsoir en fonction de notre startId, et de l'afficher sur la console. Alors, pourquoi le mettre sur la console et pas sur un Toast? Tout simplement parce que le Toast est sur UiThread. Or, le Timer, dans notre méthode run, ne sera pas sur UiThread, donc nous n'avons pas accès à l'interface graphique. De plus, le service n'ayant pas d'interface graphique, je ne peux pas utiliser la méthode runOnUiThread de la classe Activity. Donc, pour le moment, je vais me contenter de le mettre dans la console. Je vais donc maintenant relancer mon application. Je vais préparer ma console en écrivant mon tag. Et c'est parti. Je lance mon service. C'est donc bonsoir qui s'affiche toutes les deux secondes. Je relance mon service. Mon timer change et passe à bonjour. Maintenant, pour aller plus loin et voir justement le but du service, je vais faire un rotation d'écran. Le fait d'effectuer une rotation d'écran va tuer l'activité et la relancer. Cela reviendrait au même si je changeais d'activité. On peut voir, ici, que mon service continue d'être exécuté. Il n'est pas dépendant de mon activité. Je vais effacer le contenu pour qu'on puisse continuer à voir. Si j'arrête le service, il s'arrête, même si ce n'est pas cette activité qui l'a lancé. Et là, on peut voir que mon service continue de tourner. Et c'est là qu'on peut découvrir une fuite mémoire. Ici, dans la méthode onCreate, je me suis abonné à un Timer. Or, ce Timer, je ne m'en suis jamais désabonné. Je suis passé dans onDestroy, mais je ne m'en suis jamais désabonné, c'est-à-dire, je ne l'ai jamais arrêté. Comme il n'a jamais été arrêté, mon service, même si je lui ai dit stopService, il a tenté de le détruire, il est passé dans onDestroy, mais mon service existe encore et mon Timer continue de tourner. J'ai donc, ici, une énorme fuite mémoire. C'est-à-dire que si le relance un service, il va réinstancier un nouveau service, et j'aurai les deux qui tournent. Si je stop et en relance un troisième, on peut voir que si je fais cela trop de fois, je peux me retrouver avec 4, 5, 6, 7 et une infinité de services. J'ai donc ici une énorme fuite mémoire. Donc, si on s'abonne à un Timer, il faut surtout penser à se désabonner du timer en faisant un timer.cancel(). Je vais donc tuer mon application, vider mes logs et relancer. Je démarre le service, je le fais passer à deux, je l'arrête, je passe dans onDestroy. Il est bien arrêté. Je le relance, il recommence à un. Voilà, je n'ai ici pas de fuite mémoire. Donc, mon service tourne, je vais le faire passer à deux. Maintenant, je vais tuer mon application. Et là, on peut voir que mon service continue de tourner et est passé de deux à quatre. Alors, que s'est-il passé concrètement? Puisque j'ai tué l'application, il est passé deux fois dans onStartCommand. En fait, il est passé dans onCreate, et dans onStartCommand, et mon service a simplement redémarré. Pourquoi? Car si je vais voir super.onStartCommand, on m'indique ce qui se passe si mon service est tué par le système. Le fait d'avoir tué mon application, c'est le système qui a tué mon service. Et du coup, on lui indique START_STICKY. START_STICKY, si on va voir, explique que si le service est tué, il est relancé. Donc, c'est ce qui s'est passé. Mon service a été tué, et il est relancé. Ça veut dire que mon application ne tourne pas, mais mon service, lui, tourne. Si je relance mon application et que je fais arrêter le service, le service s'arrête. Le service qui tournait en dehors de mon application a été arrêté par ma nouvelle application qui a été relancée. Et je peux le relancer, ainsi de suite. Donc là, ça veut dire que si je ne tue pas mon service dans mon application, mon service se relancera indéfiniment. Sauf si l'utilisateur va dans les paramètres de son téléphone et le détruit. Si je veux que mon application tue mon service et qu'il ne se relance pas, au lieu d'utiliser super.onStartCommand, je vais utiliser START_NOT_STICKY, c'est-à-dire, ne se relance pas. Et ici, je démarre le service, il est lancé, je tue mon application. Mon service s'arrête également. Voilà comment lancer et arrêter un 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 !