Naoufel KHAYATI « Développement des Systèmes Mobiles »
168
Chapitre 5
Intents
Naoufel KHAYATI
[email protected]
AU. 2024 - 2025
Introduction
169
La communication au sein d’un système Android est basée
sur l’échange de messages.
Un message = Une intention d’une action.
Un message peut être émis à un autre composant de la
même application (une activité, un service, etc.) ou d’une
autre application.
Un message permet de véhiculer toutes les informations
nécessaires à la réalisation d’une action:
action à effectuer et données à utiliser.
Les Intents
ENISo – IA2 & GTE2 – 2024 / 2025 1
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Introduction
170
Les objets Intent servent essentiellement à:
Démarrer une activité au sein de la même application
Solliciter d’autres applications
Diffuser des informations
Pour le 1er point, on parle de démarrage d’une activité
en mode explicite.
Pour le 2ème point, on parle de démarrage d’une
activité en mode implicite et de résolution d’intents.
Pour le 3ème point, on parle de diffusion d’intents.
171
Intents explicites
ENISo – IA2 & GTE2 – 2024 / 2025 2
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Démarrage d’une activité – Sans retour
172
De façon générale, chaque composant d’une
application nécessite l’emploi d’un Intent pour être
démarré.
Si on souhaite démarrer une activité sans retour, on
utilise simplement la méthode startActivity()
Son paramètre est une instance de la classe Intent
spécifiant la classe de l’activité à lancer :
Démarrage d’une activité – Avec retour
173
Notons « activité fille », l’activité à lancer.
Notons « activité mère », celle qui va démarrer l’activité
fille.
Avec startActivity(), on ne sera jamais averti de l’état
de l’activité fille.
On ne peut rien récupérer de cette activité.
Si par exemple une activité fille propose à l’utilisateur
de répondre à un formulaire par Oui ou Non.
Comment l’activité mère récupère-t-elle la valeur saisie
dans l’activité fille?
ENISo – IA2 & GTE2 – 2024 / 2025 3
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Démarrage d’une activité – Avec retour
174
Afin de permettre à une activité mère de récupérer
un résultat de la part d’une activité fille, il faut
suivre les étapes suivantes :
enregistrer l’activité mère pour la récupération d'un
résultat,
lancer l’activité fille qui fournira un résultat, et
traiter le résultat une fois reçu par l’activité mère.
Démarrage d’une activité – Avec retour
175
1. Enregistrement de l’activité mère pour la récupération
d'un résultat
registerForActivityResult() renvoie un ActivityResultLauncher
qui sera utilisé pour lancer l'activité fille.
Dedans, c’est le code de la fonction de callback
onActivityResult() qui servira à traiter le résultat reçu.
ENISo – IA2 & GTE2 – 2024 / 2025 4
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Démarrage d’une activité – Avec retour
176
Si on attend plusieurs résultats distincts, on peut
appeler registerForActivityResult() plusieurs fois
pour enregistrer plusieurs instances
ActivityResultLauncher.
registerForActivityResult() peut être appelée en
toute sécurité avant la création de l’activité (en
dehors de onCreate()).
Démarrage d’une activité – Avec retour
177
2. Lancement de l’activité fille
Se fait grâce à la méthode launch() de l’objet
ActivityResultLauncher précédemment créé.
3. Traitement du résultat
Lorsque l’activité fille aura terminé sa tâche, elle en avertira
l’activité mère en lui communiquant un code résultat (par
exemples RESULT_OK ou RESULT_CANCELED) et éventuellement
un résultat.
Ensuite, la fonction de callback onActivityResult() sera exécutée.
ENISo – IA2 & GTE2 – 2024 / 2025 5
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Démarrage d’une activité – Avec retour
178
Un resultCode peut prendre plusieurs valeurs:
RESULT_OK vaut -1 : si l'activité fille va jusqu'au bout
de son exécution.
RESULT_CANCELED vaut 0 : si l'activité fille a été
interrompue (bouton Cancel / Annuler ou appui sur la
touche retour arrière du téléphone).
RESULT_FIRST_USER : pour commencer une liste de
valeurs définies par l’utilisateur.
Démarrage d’une activité – Avec retour
179
Dans l'activité fille, c'est la méthode setResult() qui renverra le
resultCode et le résultat vers l'activité mère.
setResult() est toujours suivie par la méthode finish(), pour
quitter l’activité fille.
ENISo – IA2 & GTE2 – 2024 / 2025 6
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Transport d’informations – (M F)
180 Mère
Transmission
Les intents peuvent permettre aussi de "transporter" des
informations grâce à la méthode putExtra ().
Cette méthode utilise le principe d’un couple clé/valeur.
La méthode "putExtra ()" est appliquée sur un objet de
type Intent.
L'intent va donc appeler l’activité fille et lui transmettre
l'information.
intent.putExtra (clé,valeur)
Transport d’informations – (M F)
181 Mère
Transmission – Code chez la mère
ENISo – IA2 & GTE2 – 2024 / 2025 7
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Transport d’informations – (M F)
182 Fille
Extraction
Extraire la valeur de l'intent: il faut utiliser un objet de type
"Bundle".
val extras = intent.extras
Placer la valeur transportée dans une variable: il faut appliquer la
méthode "getX" à l'objet "Bundle".
Cette méthode accepte un paramètre, la clé associée à la valeur
transportée.
X est à remplacer par le type de la valeur transportée.
"getString" si la valeur transportée est de type String,
"getInt" si la valeur est de type int,
"getDoubleArray" si la valeur transportée est un tableau de type Double,
etc.
Transport d’informations – (M F)
183 Fille
Extraction – Code chez la fille
NB : t1 et t2 sont deux TextViews
ENISo – IA2 & GTE2 – 2024 / 2025 8
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Transport d’informations – (F M)
184
Créer un objet de type Intent vide dans l'activité fille.
Utiliser la méthode putExtra() pour remplir l'objet Intent
avec les informations à transmettre.
La méthode setResult() aura alors 2 paramètres
Le resultCode et,
l'objet Intent déjà créé.
L'activité mère utilisera la méthode getXExtra().
Transport d’informations – (F M)
185 Fille
Code chez la fille
ENISo – IA2 & GTE2 – 2024 / 2025 9
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Transport d’informations – (F M)
186 Mère
Code chez la mère
187
Intents implicites
ENISo – IA2 & GTE2 – 2024 / 2025 10
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Appel à une autre application
188
Une application A, pour solliciter une autre
application B (inconnue pour A):
peut se contenter de transmettre son intention au
système qui va se charger de:
trouver l’application B et le composant correspondant,
démarrer ce dernier (activité, service, etc.),
lui transmettre l’Intent correspondant.
Appel à une autre application
189
C’est le système qui décide d’utiliser l’application adéquate.
Navigateur pour ouvrir une page web
Composeur pour passer un appel
Pour choisir le composant le plus approprié, le système se base sur les
informations spécifiées dans:
l’objet Intent (action, données, etc.) créé par le demandeur.
les Intent Filters définis dans le fichier Manifest du composant recherché.
Il essaie de trouver une correspondance.
Ce mécanisme d’Intent implicite, permet d’éviter les dépendances envers
des applications.
L’association entre l’application appelante et le composant appelé se fait au
moment de l’exécution et non pas à la compilation.
ENISo – IA2 & GTE2 – 2024 / 2025 11
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Appel à une autre application
190
Les données
Les données sont formatées à l'aide des URI.
Un URI est une chaîne de caractères qui permet
d'identifier un endroit.
La syntaxe d'un URI se présente comme suit:
Appel à une autre application
191
Le schéma décrit la nature de l'information.
tel: s'il s'agit d'un numéro de téléphone à composer.
sms / smsto: s’il s’agit d’un numéro de téléphone destinataire avec
éventuellement le corps du message.
http: s'il s'agit d'un site internet.
geo: s’il s’agit d’une requête GPS (composée de latitude et longitude).
L'information est la donnée elle même.
tel: 95200444
geo: 36.8, 10.17
La requête permet de fournir une précision par rapport à l'information.
Le fragment permet d’accéder à une sous-partie de l'information.
ENISo – IA2 & GTE2 – 2024 / 2025 12
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Appel à une autre application
192
L'action
Une action est une constante qui se trouve dans la classe
Intent et qui commence toujours par « ACTION_ ».
ACTION_VIEW: permet de visualiser une donnée.
Une adresse mail sera affichée dans l'application pour les mails,
Un numéro de téléphone dans le composeur,
Une adresse Web dans le navigateur, etc.
Appel à une autre application
193
ACTION_DIAL: pour ouvrir le composeur de numéro du téléphone.
ACTION_CALL: pour appeler un numéro de téléphone
ACTION_SENDTO: pour envoyer un SMS à quelqu'un.
ACTION_WEB_SEARCH: pour effectuer une recherche sur internet
ACTION_DELETE: pour supprimer des données à partir d’un URI.
ACTION_EDIT: pour ouvrir un éditeur adapté pour modifier les
données fournies.
ACTION_INSERT: pour insérer des données.
ACTION_PICK: pour sélectionner un élément dans un ensemble de
données.
Les 4 dernières actions fonctionnent avec des Content Providers.
ENISo – IA2 & GTE2 – 2024 / 2025 13
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Appel à une autre application
194
Exemple: Composer un numéro de téléphone.
Créer un nouvel objet Intent spécifiant le type d’action et les
valeurs complémentaires dans le constructeur;
ACTION_DIAL comme type d’action pour demander au système
de composer un numéro.
Le numéro à appeler comme info complémentaire, inscrit dans un
URI.
Aucune précision du type de la classe cible.
Appel à une autre application
195
Exemple: Composer un numéro de téléphone.
Démarrer une nouvelle activité en spécifiant cet
objet Intent.
Le système déterminera quelle application ouvrir, par
défaut l’interface de composition de numéro.
ENISo – IA2 & GTE2 – 2024 / 2025 14
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Appel à une autre application
196
Appel à une autre application
197
ENISo – IA2 & GTE2 – 2024 / 2025 15
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Appel à une autre application
198
Exemple: Visiter une page Web.
Appel à une autre application
199
Accorder les permissions liées aux actions
émettre un appel depuis l’application
ENISo – IA2 & GTE2 – 2024 / 2025 16
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Appel à une autre application
200
Accorder les permissions liées aux actions
Certaines actions requièrent des privilèges spéciaux
qui amèneront à ajouter des permissions dans le
fichier Manifest de l’application.
Pour notre exemple, il faudra ajouter la permission
« android.permission.CALL_PHONE » sous l’élément
racine <manifest>.
Appel à une autre application
201
Accorder les permissions liées aux actions
C’est insuffisant!!!
Il faut accorder l’autorisation
manuellement dans l’appareil
mobile, OU
Demander l’autorisation des
utilisateurs.
ENISo – IA2 & GTE2 – 2024 / 2025 17
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Résolution d’Intents
202
Par exemple, dans le cas de ACTION_VIEW, comment Android
détermine quel composant doit répondre à un Intent donné?
Android compare l'Intent à des filtres existants dans les Manifest
des différentes applications installées.
Ces filtres signalent que les composants des applications peuvent gérer
ou répondre à certains Intents.
Ces filtres sont représentés par les nœuds <intent-filter>.
Un composant d'une application doit avoir autant de filtres que de
capacités de traitement.
Le test de conformité entre un Intent et un filtre peut se faire sur trois
critères: l’action, la catégorie et les données.
Résolution d’Intents
203
Exemples de Filtres (Manifest)
ENISo – IA2 & GTE2 – 2024 / 2025 18
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Résolution d’Intents
204
Action (filtre)
Permet de filtrer en fonction du champ Action d'un Intent.
Il peut y en avoir une ou plusieurs balises <action> par filtre.
Si un tel champ est absent, tous les Intents implicites seront refusés.
Un Intent sera accepté si ce qui se trouve dans son champ action est
identique à au moins une des actions du filtre.
Si un Intent ne précise pas d'action, alors il sera automatiquement
accepté.
Résolution d’Intents
205
Exemples d’actions
ENISo – IA2 & GTE2 – 2024 / 2025 19
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Résolution d’Intents
206
Catégorie (filtre)
Les balises <category> ne sont pas indispensables.
S'il y en a une ou plusieurs, alors pour passer ce test, il
faut que toutes les catégories de l'Intent correspondent
à des catégories du filtre.
Si on veut qu’un composant accepte les Intents implicites,
on doit rajouter la catégorie CATEGORY_DEFAULT au
filtre.
Résolution d’Intents
207
Exemples de catégories
ENISo – IA2 & GTE2 – 2024 / 2025 20
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Résolution d’Intents
208
Données (filtre)
Les balises <data> déclarent les différents types de
données acceptés, en utilisant un ou plusieurs attributs.
Résolution d’Intents
209
Données (filtre)
Les types MIME peuvent être (liste non exhaustive) :
ENISo – IA2 & GTE2 – 2024 / 2025 21
Naoufel KHAYATI « Développement des Systèmes Mobiles »
210
Diffusion d’intents
(Broadcast intents & Broadcast Receivers)
Diffusion d’Intents
211
Il est possible de diffuser un objet Intent à plusieurs
applications
Informer les applications d’un ensemble d’informations
systèmes
État de la batterie (faible, chargée).
État du réseau (Wifi connecté, déconnecté).
Appel entrant, SMS entrant, etc.
Le système pouvant très vite devenir bavard, les
applications peuvent mettre en place un filtre.
Ne conserver que les Intents jugés nécessaires.
ENISo – IA2 & GTE2 – 2024 / 2025 22
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Diffusion d’Intents
212
Ces Intents sont alors appelés des Broadcast Intents.
Les récepteurs sont appelés des Broadcast Receivers.
Android propose plusieurs actions prédéfinies pour
communiquer l’état d’un service ou le changement
d’un composant du système.
Messages natifs
Diffusion d’Intents
213
ENISo – IA2 & GTE2 – 2024 / 2025 23
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Diffusion d’Intents
214
Diffuser un Intent programmé
Envoyer un Intent au système grâce à la méthode
sendBroadcast() d’une activité.
Il faut bien définir cet objet intent, sinon on risque de
parasiter le système ou d’obtenir des comportements non
désirés (ouverture d’applications non sollicitées, etc.).
Diffusion d’Intents
215
Recevoir et traiter un Intent diffusé
Écouter le flux de messages grâce à un objet
BroadcastReceiver.
À chaque fois que cet écouteur recevra un message, le
système appellera sa méthode onReceive().
ENISo – IA2 & GTE2 – 2024 / 2025 24
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Diffusion d’Intents
216
Déclaration du Receiver en XML
Pour que ça marche, il faut déclarer le receiver et lui définir un filtre
d’Intents dans le fichier Manifest de l’application.
L’application n’a pas besoin d’être en cours d’exécution pour que le
filtre fonctionne.
Si elle n’est pas lancée et qu’un Intent correspondant au filtre est diffusé,
une nouvelle instance de l’application sera automatiquement démarrée
par le système.
Diffusion d’Intents
217
Déclaration du Receiver en Kotlin
Associer le receiver au filtre d’Intent avec la
méthode registerReceiver().
ENISo – IA2 & GTE2 – 2024 / 2025 25
Naoufel KHAYATI « Développement des Systèmes Mobiles »
Pour Finir…
218
Les intents représentent l’un des principaux
composants d’une application Android.
Intents explicites (les plus simples à définir et à gérer).
Intents implicites et résolution des intents via les filtres.
Diffusion
d’intents et gestion de leur réception par les
Broadcast Receivers.
219
A SUIVRE…
TO BE CONTINUED…
ENISo – IA2 & GTE2 – 2024 / 2025 26