Vous êtes sur la page 1sur 24

Développement Mobile

sous Android
5 – Communication entre
applications: la classe Intent

FST – 2021/2022
Objectifs de cette partie
• Comprendre le mécanisme de communication entre
les activités et entre les applications Android.
• Démarrer des activités ou solliciter d’autres
applications en utilisant la classe Intent.
• Véhiculer les informations nécessaires à la
réalisation d’une action au sein d’une application
Android.

215
Les intentions
• Au cœur du système Android, les Intents forment un
mécanisme sophistiqué et complet permettant aux activités
et aux applications d’interagir entre elles.
• La communication interne du système Android est basée sur
l’envoi et la réception de messages exprimant l’intention
d’une action.
• Un message représente une description abstraite d’une action
à effectuer,
– Un message peut être émis à destination d’un autre composant
de la même application (une activité, un service, etc.) ou celui
d’une autre application.
– Un message permet de véhiculer toutes les informations
nécessaires à la réalisation de l’action (action à effectuer et les
données avec lesquelles agir, catégorie du composant cible du
message et instructions d’exécution de l’action). 216
Les intentions
• Les deux parties les plus importantes d’une intention
sont l’action et ce qu’Android appelle les "données".
– l’action est le verbe et les "données" sont une Uri comme
content://contacts/people/1, représentant un contact dans
la base de données des contacts.
– Les actions sont des constantes, comme ACTION_VIEW (pour
afficher la ressource), ACTION_EDIT (pour l’éditer) ou
ACTION_PICK (pour choisir un élément disponible dans une
Uri représentant une collection, comme
content://contacts/people).

• Le démarrage des composants d’une application


(activités, services, etc.) est réalisé au moyen d’un objet
Intent. 217
L’objet Intent
Un objet Intent véhicule toutes les informations nécessaires à la réalisation d’une action (ou à la
réception d’information) :
• le nom du composant ciblé : composant qui sera utilisé pour réaliser l’opération. Si le nom
du composant n’est pas renseigné, le système déterminera le composant le plus approprié ;
• l’action : une chaîne de caractères définissant l’action à réaliser.
• les données : le type de contenu MIME sous la forme d’une chaîne de caractères et le
contenu ciblé sous la forme d’un URI. Par exemple, pour afficher une page web, vous
utiliserez l’action ACTION_VIEW et un URI de la forme http://<adresse du site> ;
• les données supplémentaires : spécifiées sous la forme d’une collection de paires clé/valeur.
Par exemple, si l’Intent est une demande d’envoi d’un courriel, l’utilisation de la constante
EXTRA_EMAIL permet de préciser les adresses de messagerie des destinataires ;
• la catégorie : précise qui devra gérer l’Intent émis. Par exemple, l’utilisation de la constante
CATEGORY_BROWSABLE demande le traitement par un navigateur alors que la constante
CATEGORY_LAUNCHER spécifie que l’activité est le point d’entrée de l’application ;
• les drapeaux : principalement utilisés pour spécifier comment le système doit démarrer une
activité. Par exemple, l’utilisation de la constante FLAG_ACTIVITY_NO_ANIMATION spécifie
que l’activité doit être démarrée sans jouer l’animation de transition entre écrans. 218
Principe de fonctionnement
Les objets Intent ont différentes utilisations :
• Démarrer une activité au sein de l’application courante
• Solliciter d’autres applications : transmettre son intention au système
qui, lui, va se charger trouver l’application et le composant le plus
approprié (on parle alors de résolution de l’intention : le système
choisit au mieux l’application correspondant à un objet Intent -action-
donné.
• Envoyer des informations.
• Démarrage de services (applications fonctionnant en arrière plan :
lire une musique, passer à la chanson suivante)
• Diffuser un objet Intent à plusieurs applications (par exemple pour
informer l’ensemble des applications ouvertes que la batterie est
défaillante).

219
Types d’Intent
• Pour réaliser une action souhaitée par l’utilisateur, il existe deux modes d’envoi d’Intent:
– Intent explicite: consiste à cibler un composant précis d’une application (on connait l’activité à
lancer)
– Intent implicite: consiste à laisser le système déléguer le traitement (ou non) de cette action au
composant le plus approprié. On décrit l’activité à lancer et Android recherche une activité
correspondant à cette description
• L’utilisation d’un composant externe est décidée au moment de l’exécution de
l’application et non lors de la compilation de l’application.
• Ce mécanisme permet d’éviter les dépendances et de rendre beaucoup plus dynamique
et pertinente l’utilisation des applications dans un contexte donné.
• Exemple : Dans le cas d’affichage d’une page Web particulière depuis une application,
l’utilisateur ne va pas cibler un navigateur en particulier, mais demande au système
d’ouvrir un navigateur qui peut être celui fourni par défaut par le système ou un
navigateur alternatif que l’utilisateur préfère utiliser.
• Un système de filtres permet à chaque application de filtrer et de gérer uniquement les
Intents qui sont pertinents pour celle-ci. Une application peut ainsi être dans un état
d’inactivité, tout en restant à l’écoute des intentions circulant dans le système. 220
Démarrer une activité
• La méthode startActivity
– permet de démarrer une autre activité (appelée : activité enfant)
– reçoit comme paramètre une instance de la classe Intent spécifiant la classe de l’activité à exécuter.
• Syntaxe :
Intent I = new Intent(Contexte,ActivitéADémarrer.class);
startActivity(I);
• Le constructeur de la classe Intent prend les paramètres suivants :
– Context Contexte : le contexte à partir duquel l’Intent est créé et sera envoyé. Ce paramètre fait référence la
plupart du temps à l’activité en cours pointée par le mot clef this ;
– Class<?> ActivitéADémarrer : un type de classe Java héritant de la classe Activity et pointé ici par le mot clef
ActiviteADémarrer.class.
• Exemple : afficher l’écran “Paramètres”
Intent I = new Intent(this,Paramêtres.class);
startActivity(I);
• Remarque : Avant de démarrer l’activité, il faut la déclarer dans le fichier de configuration
AndroidManifest.xml de l’application. Sans cela, une erreur du type
ActivityNotFoundException sera générée lors de l’appel de la méthode startActivity.

221
Démarrer une activité et obtenir
un retour
• La méthode startActivity ne propose aucun mécanisme de retour d’information vers l’activité « parent »
qui a démarré l’activité enfant.
• Avec la méthode startActivityForResult (appelée à partir de l’activité parent), lorsque la sous-activité
aura terminé sa tâche, elle en avertira l’activité parent et lui communiquera une valeur en retour.

• Syntaxe:
private static final int CODE_ACTIVITE = valeur;
...
Intent I = new Intent(this,ActivitéAppelée.class);
startActivityForResult(I, CODE_ACTIVITE);

• La constante CODE_ACTIVITE définie par le développeur représente l’identifiant de la requête


(requestCode) et permet d’identifier, après, quelle activité a provoqué le retour de valeur.

• Exemple : Appel de l’activité VerifConnexion


private static final int CODE_ACTIVITE = 1;
...
Intent I = new Intent(this,VerifConnexion.class);
startActivityForResult(I, CODE_ACTIVITE);
222
Retour d’une activité
Renvoyer une valeur de retour
• La méthode setResult de la classe Activity permet de renvoyer la valeur de retour à l’activité
principale.
• Cette méthode reçoit comme paramètre le code de retour. Android prévoit plusieurs valeurs
par défaut telles que RESULT_OK et RESULT_CANCELED, etc.
• Principe:
– Construire un nouvel Intent via new Intent()
– Ajouter des données dans l’Intent via putExtra(String)
– Envoyer le résultat via setResult(int resultCode, Intent data)
– Le code de la requête est ajouté automatiquement
– Le nouvel Intent est envoyé à l’application appelante

• Syntaxe:
//l’activité appelée fabrique un nouvel Intent
Intent I = new Intent();
I.putExtra("resultat", R);
//RESULT_OK est une constante prédéfinies
setResult(Activity.RESULT_OK, resultIntent);

• Remarque: l’activité appelée peut forcer le retour en appelant la méthode finish(); 223
Retour d’une activité
Récupérer la valeur de retour
• Pour récupérer la valeur de retour envoyée par une activité enfant, il
faut utiliser la méthode onActivityResult de l’activité parent, depuis
laquelle est appelé la méthode startActivityForResult :

• La méthode onActivityResult utilise trois paramètres pour identifier


l’activité et ses valeurs de retour :
– int requestCode : valeur identifiant quelle activité a appelé la méthode (par exemple, la
valeur de la constante CODE_ACTIVITE spécifiée comme paramètre de la méthode).
– int resultCode : représente la valeur de retour envoyée par la sous-activité pour signaler
son état à la fin de la transaction. C’est une constante définie dans la classe Activity
(RESULT_OK, RESULT_CANCELED, etc.) ou par le développeur;
– Intent data : cet objet permet d’échanger des données comme nous l’avons vu
précédemment.
224
Retour d’une activité

Exemple: l’activité appelante récupère les données

public void onActivityResult(int requestCode, int resultCode, Intent


data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (48) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data } break; }
}
}

225
Intent implicite
• L’envoi d’un Intent implicite permet de demander (déléguer
au système le choix d’une application) à un composant d’une
autre application de traiter l’action souhaitée par l’utilisateur.
• C’est le système qui décide de l’application à utiliser pour
accomplir l’action. Il se base sur les informations spécifiées
dans l’objet Intent : action, données, catégorie, etc.
• On dit que le système se chargera de résoudre l’intention de
l’utilisateur pour lui proposer le composant de l’application le
plus approprié.
– Informations utilisées pour la résolution : l’action, les données
(l’URI et le type de contenu MIME) et la catégorie.
– Les autres données ne jouent pas de rôle dans la résolution et la
distribution des Intent aux applications. 226
Intent implicite

Mode de résolution des intentions

• Remarques
– L’utilisation d’Intent implicite, recourt à des filtres comme points d’entrée pour
distribuer les intents aux composants les plus appropriés.
– Le système pouvant très vite devenir verbeux, les applications peuvent mettre en place
un filtre permettant de ne conserver que les Intents que l’application juge nécessaires.
227
Exemple d’Intent implicite
Appel téléphonique: pour pouvoir demander au système de
réaliser cette action, l’intention envoyée au système sera
composée d’une action et d’un URI comportant le numéro à
appeler.
1. Créons un objet Intent dont nous spécifions le type d’action et
les valeurs complémentaires (sous forme d’URI) et cela sans
préciser le type de la classe ciblée.
• Utiliser le type d’action : ACTION_DIAL permettant de demander au
système de composer un numéro.
• Préciser le numéro de téléphone.
2. Démarrer une nouvelle activité en spécifiant cet objet Intent.
3. Le système détermine à quel composant d’une quelconque
application envoyer cette demande d’action (par défaut
l’interface de composition de Numéro).
228
Exemple d’Intent Implicite
• Syntaxe:
Intent I = new Intent (ACTION, [URI]);
startActivity(I);
• Exemple:
Uri numero = Uri.parse("tel:0612345678");
Intent I = new Intent(Intent.ACTION_DIAL, numero);
startActivity(I)
• Résultat: Lancement de la composition d’un numéro

229
Actions natives sous Android

230
Exemples d’utilisation d’actions
natives
• Lancer l’Android Market avec un Intent
Uri application= Uri.parse("market://search?q=pub:\"Nicolas et Emmanuel\"");
Intent I = new Intent(Intent.ACTION_VIEW, application);
startActivity(I);

• Démarrer un navigateur internet


Uri site = Uri.parse("http://www.google.fr/");
Intent I = new Intent(Intent.ACTION_VIEW, site);
startActivity(I);

• Affichage d’un emplacement sur Google Maps


Uri coordonnées =Uri.parse("geo:" + lat.toString() + "," + lon.toString());
Intent I =new Intent(Intent.ACTION_VIEW, coordonnées);
startActivity(I);
231
Exemple d’Intent implicite

• On saisi un emplacement. La carte lancée montre l’emplacement de


la Tour Eiffel à Paris

232
Transfert de données
• Dans une application Android, l’utilisateur doit souvent spécifier d’autres
données supplémentaires (exemple : l’ouverture d’une activité contenant
un navigateur web nécessite la spécification d’une adresse web).

• L’objet Bundle permet de véhiculer les données transférées d’une activité à


une autre.
• La classe Intent dispose de méthodes grâce auxquelles un objet de type
Bundle véhiculera les données d’une activité à une autre.
– putExtra : utilisée dans l’activité appelante et permet l’insertion de données à
transmettre dans le conteneur.
– getExtra : utilisée dans l’activité appelée et permet d’extraire les données
reçues.

• L’échange des données se fait par l’association d’une clé (représentée par
une chaîne de caractères) à une donnée à échanger.

233
Transfert de données

Ajout des données à échanger (dans l’activité appelante)


• Il faut appeler la méthode putExtra avec la clé et la donnée à échanger.
• Syntaxe : Intent.putExtra(clé, valeur);
• La méthode putExtra prend deux paramètres:
– clé : la clef unique permettant d’identifier la donnée dans la collection du Bundle;
– valeur : la donnée à échanger.
• Exemple:
Intent I = new Intent (this, VerifConnexion.class);
I. putExtra("username", "haithem");
I.putExtra("password","12345");
startActivityForResult(I,48)

234
Transfert de données
Extraction des données échangées (dans l’activité appelée)
• Une fois l’intention reçue par l’application, on peut utiliser la méthode getExtras
pour récupérer les données contenues dans l’objet Bundle transmis.
• Il suffit d’appeler l’une des méthodes getXXX correspondant au type de la donnée
recherchée (getString pour une donnée de type String, getInt pour une donnée de
type Int, etc.) en spécifiant le nom de la clé associée pour récupérer les
informations.
Exemple de récupération d’une donnée d’un Bundle
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Récupérer l’objet Bundle
Bundle extra = this.getIntent().getExtras();
if(extra != null) {
String user = extra.getString(“username");
String pwd = extra.getString(“password");
235
}}
Activités système (1/2)
• Possibilité de lancer des activités systèmes grâce à des constantes
Android.
• Exemple de constantes de la classe Settinges:
– ACTION_DATE_SETTINGS,
– ACTION_MANAGE_APPLICATIONS_SETTINGS,
– ACTION_MEMORY_CARD_SETTINGS,
– ACTION_SOUND_SETTINGS,
– ACTION_WIFI_SETTINGS,
– Etc.
Activités système (2/2)
• Exemple : afficher les paramètres d’heure/date

237

Vous aimerez peut-être aussi