Académique Documents
Professionnel Documents
Culture Documents
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).
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);
• 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 :
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
• 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);
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’é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
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