Cet atelier de programmation fait partie du cours Développement Android avancé en Kotlin. Vous tirerez pleinement parti de ce cours en suivant les ateliers de programmation dans l'ordre, mais ce n'est pas obligatoire. Tous les ateliers de programmation du cours sont listés sur la page de destination des ateliers de programmation Android avancé en Kotlin.
Introduction
Dans l'atelier de programmation précédent, vous avez ajouté des notifications à votre minuteur d'œufs, qui sont créées et déclenchées dans votre application. Un autre cas d'utilisation important des notifications consiste à envoyer à distance des notifications push qui peuvent être reçues même lorsque votre application n'est pas en cours d'exécution.
Qu'est-ce qu'une notification push ?
Les notifications push sont des notifications que le serveur "envoie" aux appareils mobiles. Elles peuvent être envoyées à un appareil, que votre application soit en cours d'exécution ou non.
Les notifications push sont un excellent moyen d'informer les utilisateurs d'une mise à jour ou de leur rappeler une tâche ou une fonctionnalité. Imaginez que vous attendez qu'un produit soit de nouveau en stock. Grâce aux notifications push, une application d'achat peut vous informer des mises à jour de stock sans que vous ayez à vérifier l'état du stock tous les jours.
Les notifications push utilisent le modèle Pub/Sub, qui permet aux applications de backend de transmettre du contenu pertinent aux clients intéressés. Sans modèle de publication/d'abonnement, les utilisateurs de votre application devraient vérifier régulièrement si des mises à jour sont disponibles dans votre application. Ce processus est fastidieux et peu fiable pour les utilisateurs. De plus, à mesure que le nombre de clients augmente, ces vérifications périodiques imposent une charge trop importante sur les ressources de mise en réseau et de traitement, à la fois pour le serveur de votre application et pour l'appareil d'un utilisateur.
Comme pour tous les autres types de notifications, veillez à respecter vos utilisateurs avec les notifications push. Si le contenu de la notification n'est pas intéressant ou pertinent pour l'utilisateur, il peut facilement désactiver toutes les notifications de votre application.
Qu'est-ce que Firebase Cloud Messaging ?
Firebase Cloud Messaging fait partie de la plate-forme Firebase pour le développement mobile. En règle générale, vous devez configurer un serveur à partir de zéro, capable de communiquer avec les appareils mobiles pour déclencher des notifications. Firebase Cloud Messaging vous permet d'envoyer des notifications à tous les utilisateurs ayant installé votre application, ou à un sous-ensemble d'entre eux, sans avoir à configurer de serveur. Par exemple, vous pouvez envoyer un rappel aux utilisateurs ou leur proposer une promotion spéciale, comme un cadeau gratuit.Vous pouvez envoyer une notification à un ou plusieurs appareils à distance.
Vous pouvez également utiliser Firebase Cloud Messaging pour transférer des données de votre application de backend ou d'un projet Firebase à vos utilisateurs.
Dans cet atelier de programmation, vous allez apprendre à utiliser Firebase Cloud Messaging pour envoyer des notifications push et des données pour votre application Android.
Si vous rencontrez des problèmes (bugs de code, erreurs grammaticales, formulation peu claire, etc.) au cours de cet atelier de programmation, veuillez les signaler via le lien Signaler une erreur situé dans l'angle inférieur gauche de l'atelier de programmation.
Ce que vous devez déjà savoir
Vous devez maîtriser les éléments suivants :
- Comment créer des applications Android en Kotlin. En particulier, travaillez avec le SDK Android.
- Concevoir votre application à l'aide de composants d'architecture et de la liaison de données.
- Connaissances de base sur les broadcast receivers.
- Connaissances de base d'AlarmManager.
- Créer et envoyer des notifications à l'aide de NotificationManager
Points abordés
- Comment envoyer des messages à l'utilisateur via Firebase Cloud Messaging.
- Découvrez comment envoyer des données d'un backend à votre application à l'aide de messages de données, qui font partie de Firebase Cloud Messaging.
Objectifs de l'atelier
- Ajoutez des notifications push à l'application de démarrage.
- Gérer Firebase Cloud Messaging pendant l'exécution de votre application.
- Transférer des données avec Firebase Cloud Messaging
Dans cet atelier de programmation, vous allez travailler sur le code de l'atelier de programmation précédent sur l'utilisation des notifications dans les applications Android. Dans l'atelier de programmation précédent, vous avez créé une application de minuteur d'œufs qui envoie des notifications lorsque le minuteur de cuisson est terminé. Dans cet atelier de programmation, vous allez ajouter Firebase Cloud Messaging pour envoyer des notifications push aux utilisateurs de votre application afin de leur rappeler de manger des œufs.
Pour obtenir l'application exemple, vous pouvez :
Clonez le dépôt depuis GitHub et passez à la branche starter :
$ git clone https://github.com/googlecodelabs/android-kotlin-notifications-fcm
Vous pouvez également télécharger le dépôt sous forme de fichier ZIP, le décompresser et l'ouvrir dans Android Studio.
Étape 1 : Créez un projet Firebase
Avant de pouvoir ajouter Firebase à votre application Android, vous devez créer un projet Firebase pour vous connecter à votre application Android.
- Connectez-vous à la console Firebase.
- Cliquez sur Ajouter un projet, puis sélectionnez ou saisissez un nom de projet. Nommez votre projet fcm-codelab.
- Cliquez sur Continuer.
- Vous pouvez ignorer la configuration de Google Analytics en désactivant le bouton Activer Google Analytics pour ce projet .
- Cliquez sur Créer un projet pour terminer la configuration du projet Firebase.
Étape 2 : Enregistrez votre application auprès de Firebase
Maintenant que vous avez créé un projet Firebase, vous pouvez y ajouter votre application Android.
- Au centre de la page de présentation du projet de la console Firebase, cliquez sur l'icône Android pour lancer le workflow de configuration.
- Dans le champ Nom du package Android, saisissez
com.example.android.eggtimernotifications
. - Cliquez sur Enregistrer l'application.
Important : Assurez-vous de saisir le bon ID pour votre application, car vous ne pourrez pas ajouter ni modifier cette valeur une fois que vous aurez enregistré votre application dans votre projet Firebase.
Étape 3 : Ajoutez le fichier de configuration Firebase à votre projet
Ajoutez le fichier de configuration Firebase Android à votre application.
- Cliquez sur Télécharger google-services.json pour obtenir votre fichier de configuration Firebase pour Android (
google-services.json
). Assurez-vous que le fichier de configuration ne comporte pas de caractères supplémentaires et qu'il est nommé exactementgoogle-services.json
. - Déplacez votre fichier de configuration dans le répertoire du module (au niveau de l'application) de votre application.
Étape 4 : Configurez votre projet Android pour activer les produits Firebase
Pour activer les produits Firebase dans votre application, vous devez ajouter le plug-in google-services à vos fichiers Gradle.
- Dans votre fichier Gradle au niveau du projet (
build.gradle
), vérifiez que vous disposez du dépôt Maven de Google. - Ajoutez ensuite des règles pour inclure le plug-in des services Google.
build.gradle
buildscript {
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
}
dependencies {
// ...
// Add the following line:
classpath 'com.google.gms:google-services:4.3.2' // Google Services plugin
}
}
allprojects {
// ...
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
// ...
}
}
- Dans le fichier Gradle de votre module (au niveau de l'application), généralement
app/build.gradle
, ajoutez une ligne pour appliquer le plug-in en bas du fichier.
app/build.gradle
apply plugin: 'com.android.application'
android {
// ...
}
// Add the following line to the bottom of the file:
apply plugin: 'com.google.gms.google-services' // Google Play services Gradle plugin
Dans cette tâche, vous allez ajouter Firebase Cloud Messaging (FCM) à votre projet pour utiliser les notifications push.
Le code du service Android pour FCM de cet atelier de programmation est fourni dans MyFirebaseMessagingService.kt
. Dans les étapes suivantes, vous ajouterez du code à votre application Android.
Vous utiliserez le compositeur de notifications pour tester votre implémentation. Le compositeur de notifications est un outil qui vous aide à composer et à envoyer des messages depuis le site Web de la console Firebase.
- Ouvrir
MyFirebaseMessagingService.kt
- Inspectez le fichier, en particulier les fonctions suivantes :
onNewToken()
: appelé automatiquement si votre service est enregistré dans le fichier manifeste Android. Cette fonction est appelée la première fois que vous exécutez votre application et chaque fois que Firebase émet un nouveau jeton pour votre application. Un jeton est une clé d'accès à votre projet de backend Firebase. Il est généré pour votre appareil client spécifique. Grâce à ce jeton, Firebase sait à quel client le backend doit envoyer des messages. Firebase sait également si ce client est valide et s'il a accès à ce projet Firebase.onMessageReceived
: appelé lorsque votre application est en cours d'exécution et que Firebase lui envoie un message. Cette fonction reçoit un objetRemoteMessage
qui peut contenir une charge utile de notification ou de message de données. Vous en apprendrez davantage sur les différences entre les charges utiles des notifications et des messages de données dans la suite de cet atelier de programmation.
Étape 1 : Envoyer des notifications FCM à un seul appareil
La console Notifications vous permet de tester l'envoi d'une notification. Pour envoyer un message à un appareil spécifique à l'aide de la console, vous devez connaître le jeton d'enregistrement de cet appareil.
Lorsque le backend Firebase génère un jeton ou l'actualise, la fonction onNewToken()
est appelée, et le nouveau jeton est transmis en tant qu'argument. Si vous souhaitez cibler un seul appareil ou créer un groupe d'appareils auxquels envoyer un message, vous devrez accéder à ce jeton en étendant FirebaseMessagingService
et en remplaçant onNewToken()
.
- Ouvrez
AndroidManifest.xml
et supprimez la mise en commentaire du code suivant pour activerMyFirebaseMessagingService
pour l'application de minuteur. Les métadonnées de service dans le fichier manifeste Android enregistrentMyFirebaseMessagingService
en tant que service et ajoutent un filtre d'intent afin que ce service reçoive les messages envoyés depuis FCM. La dernière partie des métadonnées déclarebreakfast_notification_channel_id
commedefault_notification_channel_id
pour Firebase. Vous utiliserez cet ID à l'étape suivante.
<!-- AndroidManifest.xml -->
<!-- TODO: Step 3.0 uncomment to start the service -->
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<!-- [START fcm_default_icon] -->
<!--
Set custom default icon. This is used when no icon is set for incoming notification messages.
See README(https://goo.gl/l4GJaQ) for more.
-->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/common_google_signin_btn_icon_dark"/>
<!--
Set color used with incoming notification messages. This is used when no color is set for the incoming
notification message. See README(https://goo.gl/6BKBk7) for more.
-->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent"/> <!-- [END fcm_default_icon] -->
<!-- [START fcm_default_channel] -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/breakfast_notification_channel_id" />
<!-- [END fcm_default_channel] -->
Il est conseillé de créer un canal de notification pour FCM, car vos utilisateurs peuvent souhaiter activer ou désactiver séparément le minuteur ou les notifications push FCM.
- Ouvrez
ui/EggTimerFragment.kt
. DansonCreateView()
, ajoutez le code de création de canal suivant.
// EggTimerFragment.kt
// TODO: Step 3.1 create a new channel for FCM
createChannel(
getString(R.string.breakfast_notification_channel_id),
getString(R.string.breakfast_notification_channel_name)
)
- Ouvrez
MyFirebaseMessagingService.kt
et annulez la mise en commentaire de la fonctiononNewToken()
. Cette fonction est appelée lorsqu'un nouveau jeton est généré.
// MyFirebaseMessagingService.kt
// TODO: Step 3.2 log registration token
// [START on_new_token]
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the
* InstanceID token is initially generated so this is where you would retrieve
* the token.
*/
override fun onNewToken(token: String?) {
Log.d(TAG, "Refreshed token: $token")
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
sendRegistrationToServer(token)
}
// [END on_new_token]
- Exécutez l'application de minuterie.
- Observez Logcat (Afficher > Fenêtres d'outils > Logcat). Une ligne de journal affichant votre jeton devrait s'afficher, comme ci-dessous. Il s'agit du jeton dont vous avez besoin pour envoyer un message à cet appareil. Cette fonction n'est appelée que lorsqu'un nouveau jeton est créé.
2019-07-23 13:09:15.243 2312-2459/com.example.android.eggtimernotifications D/MyFirebaseMsgService: Refreshed token: f2esflBoQbI:APA91bFMzNNFaIskjr6KIV4zKjnPA4hxekmrtbrtba2aDbh593WQnm11ed54Mv6MZ9Yeerver7pzgwfKx7R9BHFffLBItLEgPvrtF0TtX9ToCrXZ5y7Hd-m
Remarque : Si le jeton n'apparaît pas dans les messages Logcat, il est possible que votre application l'ait déjà reçu. Dans ce cas, désinstallez l'application pour recevoir un nouveau jeton.
Vous pouvez maintenant effectuer un test en envoyant une notification. Pour envoyer une notification, vous devez utiliser le composeur de notifications.
- Ouvrez la console Firebase et sélectionnez votre projet.
- Ensuite, sélectionnez Cloud Messaging dans le menu de navigation de gauche.
- Cliquez sur Envoyer votre premier message.
- Saisissez
Time for Breakfast!
comme titre de la notification etDon't forget to eat eggs!
comme texte de la notification, puis sélectionnez Envoyer un message de test. La boîte de dialogue pop-up Test on device (Tester sur l'appareil) s'affiche et vous demande de fournir un jeton d'enregistrement FCM.
- Copiez le jeton de votre application à partir de Logcat.
- Collez ce jeton dans le champ Ajouter un jeton d'enregistrement FCM de la fenêtre pop-up, puis cliquez sur le bouton Ajouter à côté du jeton.
- Dans la liste des jetons qui s'affiche, cochez la case correspondant au jeton. Le bouton Tester devrait être activé.
- Sur votre appareil, mettez l'application Egg Timer en arrière-plan .
- Dans le pop-up, cliquez sur Tester.
- Après avoir cliqué sur Tester, l'appareil client cible sur lequel votre application s'exécute en arrière-plan devrait recevoir la notification dans la barre de notifications système. (Nous verrons plus tard comment gérer les messages FCM lorsque votre application est au premier plan.)
Tâche : Envoyer des notifications FCM à un sujet
La messagerie par sujet FCM est basée sur le modèle de publication/abonnement.
Une application de messagerie peut être un bon exemple pour le modèle Pub/Sub. Imaginez qu'une application recherche de nouveaux messages toutes les 10 secondes. Cela épuisera non seulement la batterie de votre téléphone, mais utilisera également des ressources réseau inutiles et créera une charge inutile sur le serveur de votre application. Au lieu de cela, un appareil client peut s'abonner et être averti lorsque de nouveaux messages sont envoyés via votre application.
Les sujets vous permettent d'envoyer un message à plusieurs appareils qui ont activé ce sujet spécifique. Pour les clients, les thèmes sont des sources de données spécifiques qui les intéressent. Pour le serveur, les thèmes sont des groupes d'appareils qui ont choisi de recevoir des informations sur une source de données spécifique. Les thèmes peuvent être utilisés pour présenter des catégories de notifications, comme les actualités, les prévisions météo et les résultats sportifs. Pour cette partie de l'atelier de programmation, vous allez créer un thème "petit-déjeuner" pour rappeler aux utilisateurs intéressés de l'application de manger des œufs au petit-déjeuner.
Pour s'abonner à un sujet, l'application cliente appelle la fonction Firebase Cloud Messaging subscribeToTopic(
)
avec le nom du sujet breakfast
. Cet appel peut avoir deux résultats. Si l'appelant réussit, le rappel OnCompleteListener
est appelé avec le message auquel il est abonné. Si le client ne parvient pas à s'abonner, le rappel recevra un message d'erreur à la place.
Dans votre application, vous abonnerez automatiquement vos utilisateurs au thème "Petit-déjeuner". Toutefois, dans la plupart des applications de production, il est préférable de laisser les utilisateurs choisir les thèmes auxquels ils souhaitent s'abonner.
- Ouvrez
EggTimerFragment.kt
et recherchez la fonctionsubscribeTopic()
vide. - Obtenez une instance de
FirebaseMessaging
et appelez la fonctionsubscibeToTopic()
avec le nom du thème. - Ajoutez un
addOnCompleteListener
pour recevoir une notification de FCM indiquant si votre abonnement a réussi ou échoué.
// EggTimerFragment.kt
// TODO: Step 3.3 subscribe to breakfast topic
private fun subscribeTopic() {
// [START subscribe_topics]
FirebaseMessaging.getInstance().subscribeToTopic(TOPIC)
.addOnCompleteListener { task ->
var msg = getString(R.string.message_subscribed)
if (!task.isSuccessful) {
msg = getString(R.string.message_subscribe_failed)
}
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
}
// [END subscribe_topics]
}
- Appelez la fonction
subscribeTopic()
pour vous abonner à un sujet au démarrage de l'application. Faites défiler l'écran jusqu'àonCreateView()
et ajoutez un appel àsubscribeTopic()
.
// EggTimerFragment.kt
// TODO: Step 3.4 call subscribe topics on start
subscribeTopic()
return binding.root
- Pour vous abonner au thème "Petit-déjeuner", exécutez à nouveau l'application. Le message toast "Subscribed to topic" (Abonné au thème) doit s'afficher.
Vous pouvez maintenant tester l'envoi de messages à un sujet :
- Ouvrez le compositeur de notifications et sélectionnez Composer une notification.
- Définissez le titre et le texte de la notification comme précédemment.
- Cette fois, au lieu d'envoyer le message à un seul appareil, cliquez sur Sujet sous Cible et saisissez
breakfast
comme sujet du message.
- Sélectionnez Maintenant pour la programmation.
- Assurez-vous que votre application s'exécute en arrière-plan sur votre appareil de test.
- Cliquez sur Examiner, puis sur Publier. Si vous pouvez exécuter l'application sur plusieurs appareils, vous pouvez tester et observer que la notification est reçue sur tous les appareils abonnés à ce thème.
L'application dispose désormais des canaux de notification suivants : Egg et Breakfast. Sur un appareil client, appuyez de manière prolongée sur l'icône de l'application, sélectionnez Infos,puis cliquez sur Notifications. Vous devriez voir les canaux de notification Egg (Œuf) et Breakfast (Petit-déjeuner), comme le montre la capture d'écran ci-dessous. Si vous désélectionnez la chaîne Petit-déjeuner, votre application ne recevra aucune notification envoyée sur cette chaîne.
Lorsque vous utilisez des notifications, gardez toujours à l'esprit que les utilisateurs peuvent désactiver n'importe quel canal de notification à tout moment.
Étape 1 : Messages de données
Les messages FCM peuvent également contenir une charge utile de données qui traite les messages dans l'application cliente. Utilisez des messages de données au lieu de messages de notification.
Pour gérer les messages de données, vous devez gérer la charge utile de données dans la fonction onMessageReceived()
de MyFirebaseMessagingService
. La charge utile est stockée dans la propriété data
de l'objet remoteMessage
. L'objet remoteMessage
et la propriété data
peuvent être null
.
- Ouvrir
MyFirebaseMessagingService.
- Vérifiez si la propriété
data
de l'objetremoteMessage
a une valeur et affichez les données dans le journal.
// MyFirebaseMessagingService.kt
// [START receive_message]
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ
Log.d(TAG, "From: ${remoteMessage?.from}")
// TODO: Step 3.5 check messages for data
// Check if the message contains a data payload.
remoteMessage?.data?.let {
Log.d(TAG, "Message data payload: " + remoteMessage.data)
}
}
// [END receive_message]
Pour tester votre code, vous pouvez à nouveau utiliser le compositeur de notifications.
- Ouvrez le compositeur de notifications, créez un message et définissez sa Cible sur le thème "petit-déjeuner".
- Cette fois, lorsque vous arrivez à l'étape 4, Options supplémentaires, définissez les propriétés de clé et de valeur Données personnalisées comme suit :
- Clé :
eggs
- Valeur :
3
- Assurez-vous que votre application est en cours d'exécution au premier plan. Si votre application est en arrière-plan, le message FCM déclenchera une notification automatique et la fonction
onMessageReceived()
ne recevra que l'objetremoteMessage
lorsque l'utilisateur cliquera sur la notification. - Envoyez le message depuis le compositeur de notifications et observez le journal des messages de données qui s'affiche dans logcat.
Étape 2 : Gérer les messages au premier plan et en arrière-plan
Lorsqu'un appareil client exécutant votre application reçoit un message incluant à la fois des charges utiles de notification et de données, le comportement de l'application dépend de son état sur cet appareil (en arrière-plan ou au premier plan) :
- Si l'application s'exécute en arrière-plan et que le message comporte une charge utile de notification, la notification s'affiche automatiquement dans la barre de notification. Si le message comporte également une charge utile de données, celle-ci sera traitée par l'application lorsque l'utilisateur appuiera sur la notification.
- Si l'application s'exécute au premier plan et que la notification de message comporte une charge utile de notification, elle n'apparaît pas automatiquement. L'application doit décider comment gérer la notification dans la fonction
onMessageReceived()
. Si le message comporte également une charge utile de données, les deux charges utiles seront traitées par l'application.
Pour les besoins de cet atelier de programmation, vous souhaitez rappeler à l'utilisateur de l'application de manger des œufs au petit-déjeuner. Vous ne prévoyez pas d'envoyer de données, mais vous souhaitez également vous assurer que la notification de rappel s'affiche toujours, que l'application soit au premier plan ou en arrière-plan.
Lorsque vous envoyez un message FCM aux appareils sur lesquels l'application de minuteur est installée, le message de notification s'affiche automatiquement si l'application n'est pas en cours d'exécution ou est en arrière-plan. Toutefois, si l'application est en cours d'exécution au premier plan, la notification ne s'affiche pas automatiquement. C'est le code de l'application qui décide de ce qu'il faut faire du message. Si l'application est au premier plan lorsqu'elle reçoit un message FCM, la fonction onMessageReceived()
est déclenchée automatiquement avec le message FCM. C'est là que votre application peut gérer silencieusement les charges utiles de notification et de données, ou déclencher une notification.
Pour votre application, vous devez vous assurer que l'utilisateur reçoit le rappel lorsque l'application est au premier plan. Implémentons donc du code pour déclencher une notification :
- Ouvrez à nouveau la fonction
onMessageReceived()
dansMyFirebaseMessagingService
. - Immédiatement après le code que vous avez récemment ajouté pour vérifier le message de données, ajoutez le code suivant qui envoie une notification à l'aide du framework de notifications.
// MyFirebaseMessagingService.kt
// TODO: Step 3.6 check messages for notification and call sendNotification
// Check if the message contains a notification payload.
remoteMessage.notification?.let {
Log.d(TAG, "Message Notification Body: ${it.body}")
sendNotification(it.body as String)
}
- Si vous exécutez à nouveau l'application et envoyez une notification à l'aide du compositeur de notifications, vous devriez voir une notification comme celle que vous avez vue dans la première partie de l'atelier de programmation, que l'application soit au premier plan ou en arrière-plan.
Le code de solution se trouve dans la branche principale du code que vous avez téléchargé.
- Implémentez un BroadcastReceiver FCM en étendant
FirebaseMessagingService
. - Configurez un projet Firebase Cloud Messaging (FCM) et ajoutez FCM à votre application Android.
- Testez votre application en envoyant des notifications push depuis le compositeur de notifications.
- Abonnez-vous aux sujets FCM en appelant la fonction
subscribeToTopic()
de la classeFirebaseMessaging
. - Envoyez une charge utile de données à l'aide d'un objet
RemoteMessage
. - Gérez les données dans la fonction
onMessageReceived()
. - Ajoutez une logique pour gérer FCM lorsque l'application est au premier plan et lorsqu'elle est en arrière-plan.
Cours Udacity :
Documentation Firebase :
Pour accéder aux autres ateliers de programmation de ce cours, consultez la page de destination des ateliers de programmation Android avancé en Kotlin.