Android – Cours/tp 3 – Intents
Principe
- On crée un objet
Intent
- On insérer les éventuels paramètres dans cet objet
- On envoie cet objet
Intent
au système (méthodestartActivity
) - Le système démarre l’activité adéquate
source: https://developer.android.com/guide/components/intents-filters.html
Table des matières
- Démarrer une seconde activité depuis une première activité
- Envoyer des paramètres à la seconde activité
- Récupérer une valeur de retour lorsqu’on revient à la première activité
- Intents Implicites/Explicites
1. Démarrer une seconde activité depuis une première activité
On utilise la classe Intent
(intention).
1 2 3 4 | public class Intent extends Object implements Parcelable, Cloneable public Intent(Context packageContext, Class<?> cls) |
(d’autres constructeurs existent)
TP: Créer un projet avec 2 activités
- Activité principale
- Créez un projet avec une activité de type Empty Activity
- MainActivity.java
- activity_main.xml
- Ajouter un bouton qui permettra de lancer l’activité 2
- Créez un projet avec une activité de type Empty Activity
- Seconde Activité
- Utilisez le menu File/New/Activity/Empty Activity
- MainActivity2.java
- activity_main2.xml
- Ajoutez un
textView
avec un texte différent de la première
- Utilisez le menu File/New/Activity/Empty Activity
1.1. Le fichier Manifest
- Chaque activité doit être référencée dans le fichier manifest
1 | < activity android:name = ".MainActivity2" ></ activity > |
- a priori c’est fait automatiquement si vous avez utilisé l’assistant (le menu File/New/Activity) pour créer la seconde activité.
TP
Vérifiez en ouvrant le fichier Manifest.xml
1.2. Lancer la seconde activité
- On va d’abord créer un objet intent :
1 | Intent intent = new Intent( this , MainActivity2. class ); |
- Ensuite on démarre la seconde activité :
1 | startActivity(intent); |
TP
- Où allons nous insérer ces lignes, dans le TP en cours ?
- Que se passe-t-il lors de l’exécution ?
TP (solution)
- dans la fonction de traitement du bouton (
onClick
) - l’
Intent
(intention) est envoyé au système qui démarre la seconde activité (indépendamment de la première)
TP: Résumé
- Créez un projet avec 2 activités
- Vérifiez que la seconde activité est bien référencée dans le fichier Manifest.xml
- Dans la première activité placez un bouton « Go »
- Dans la méthode
onClick
, insérez créez un intent et lancez la seconde application :
1 2 | Intent intent = new Intent( this , MainActivity2. class ); startActivity(intent); |
- Exécutez l’application
2. Envoyer des paramètres à la seconde activité
Insérer les données à transmettre dans l’Intent
en utilisant les méthodes putExtra
de la classe Intent
.
2.1. Préliminaire
- Reprenez le projet précédent (ou bien dupliquez-le)
- Ajoutez un champ de saisie sur la première activité
pour saisir un message à transmettre - Ajouter un
textView
à la seconde activité
pour afficher le message transmis
2.2. Ajouter un « extra » à l’intent
La classe Intent
possède de nombreuses méthodes putExtra
permettant d’insérer dans l’intent des données de différents types.
Quelques exemples:
1 2 3 4 5 6 7 | Intent putExtra(String name, int value) Intent putExtra(String name, int [] value) Intent putExtra(String name, byte value) Intent putExtra(String name, double value) Intent putExtra(String name, boolean value) Intent putExtra(String name, String value) Intent putExtra(String name, String[] value) |
Il en existe 24 dans l’API 27, dont une pour chacun des types simples, pour les tableaux de types simples, et pour un certain nombre de classes de base (e.g. String
)
Dans notre exemple, avant de lancer le startActivity(intent)
- On va récupérer le message dans le champ de texte :
1 2 | EditText editText = (EditText) findViewById(R.id.editText); String message = editText.getText().toString(); |
- puis on l’insère dans l’Intent
1 | intent.putExtra( "MSG_KEY" , message); |
2.3. Récupérer le message dans la seconde activité
- On récupère l’
intent
et - on va chercher l’extra
1 2 | Intent intent = getIntent(); String message = intent.getStringExtra( "MSG_KEY" ); |
TP
- Où allons nous insérer ces lignes, dans le TP en cours ?
- Que fait exactement
getIntent
2.4. Méthodes de récupération des extras
Il en existe pour chacune des types de données pour lesquels existe un putExtra
1 2 3 4 5 6 7 | int getIntExtra(String name, int defaultValue) int getIntArrayExtra(String name) byte getByteExtra(String name, byte defaultValue) double getDoubleExtra(String name, double defaultValue) boolean getBooleanExtra(String name, boolean defaultValue) String getStringExtra(String name) String[] getStringArrayExtra(String name) |
TP: Résumé
- Ajouter un champ de saisie à l’activité 1
- Avant le
startActivity(intent)
:
1 | intent.putExtra( "MSG_KEY" , message); |
- On récupère la valeur dans l’activité 2
- Dans le
onCreate
de la seconde activité :
1 2 | Intent intent = getIntent(); String message = intent.getStringExtra( "MSG_KEY" ); |
3. Récupérer une valeur de retour lorsqu’on revient à la première activité
- On lance l’intent avec la méthode
startActivityForResult
- On implémente la méthode
onActivityResult
, qui sera exécutée lorsque la seconde activité est terminée, et qu’on retourne à la première.
3.1. La méthode startActivityForResult
1 2 3 | void startActivityForResult ( Intent intent, int requestCode) |
Le requestCode
sera renvoyé à l’activité lors du retour.
TP
À quoi sert-il ?
3.2. La méthode onActivityResult
1 2 3 4 | void onActivityResult ( int requestCode, int resultCode, Intent data) |
- Le
resultCode
est assigné dans l’activité 2 par la méthodesetResult(int)
- Par défaut (si rien n’a été assigné ou crash) ce sera la constante
Activity.RESULT_CANCELED
- Une autre valeur prédéfinie est
Activity.RESULT_OK
- Toute autre valeur est possible (code perso)
- Par défaut (si rien n’a été assigné ou crash) ce sera la constante
3.3. Renvoyer des données
On utilise de nouveau un Intent.
- Créer un objet
Intent
avec son constructeur par défaut - Ajouter des données (
putExtra
) - Assigner l’intent au résultat qui sera renvoyé, avec
setResult(int, Intent)
1 2 3 4 | Intent resultIntent = new Intent(); resultIntent.putExtra( "RET_KEY" , message); setResult(Activity.RESULT_OK, resultIntent); finish(); |
TP
- Reprenez le projet précédent (ou bien dupliquez-le de nouveau)
- Ajoutez dans la seconde activité :
- un champ de saisie
- un bouton OK
- Ajoutez dans la première activité un champ de texte pour recevoir le message de retour
- Terminez l’implémentation pour qu’un message saisi dans le champs de saisie soit placé dans le champs de texte
- Utilisez le code de retour (
resultCode
) pour savoir si l’activité 2 a terminé via le bouton OK ou via le bouton retour du système (utilisez un Toast pour indiquer le résultat).
4. Intent explicite vs implicite
- Jusqu’à maintenant on a utilisé des Intent explicites, c’est à dire qu’on a indiqué explicitement l’activité à lancer.
- Dans le cas d’Intent implicites
- on indique seulement une action à réaliser
- le système doit choisir quelle activité lancer
- si plusieurs sont possibles il demande à l’utilisateur
4.1. Exemple d’intent implicite
- Envoyer une chaîne de texte
- Le système propose toutes les activités capables de recevoir une chaîne de texte, il affiche cet app chooser
source: https://developer.android.com/guide/components/intents-filters.html
TP
- Cherchez dans la documentation comment créer un intent implicite.
- Ajoutez à votre application un bouton permettant d’envoyer un texte à une application capable de recevoir du texte
4.2 Recevoir un Intent implicite
Maintenant nous souhaitons que notre application soit capable de recevoir un Intent implicite. C’est à dire que lorsqu’une application enverra un Intent avec une action donnée, notre application soit proposée parmi les possibilités. Il faut pour cela la déclarer dans le fichier Manifest
.
TP
- Retrouvez dans la documentation (même pas que précédemment) les éléments à ajouter au fichier
Manifest
. - Déclarez que la seconde activité de votre appli est capable de recevoir des actions de type
ACTION_SEND
- Testez, est-ce que le message est bien reçu par l’activité (retrouvez vous bien le texte). Si non d’où peut venir le problème ? Corrigez.