Vous êtes sur la page 1sur 25

05/01/2023

Chapitre 3 :
Les intents

Introduction
● Les applications Android doivent se décomposer en activités distinctes les unes des autres.
● Au sein de ces applications, les activités doivent pouvoir s'enchaîner, s'appeler, retourner à
leur activité principale.
● Pour mettre en place cette communication entre activités, Android utilise le système des
intentions.
● Celles-ci permettent d'envoyer des messages d'une activité vers une autre avec des
données pour les activer.

1
05/01/2023

Définition
● Android utilise « intent » (Intention en français) pour la communication.
● Intent est l’objet utilisé dans android pour le passage des informations entre
les activités d’une même application et il peut assurer la communication
entre les applications.
● Un intent est un message qui peut être utilisé pour demander une action à
partir d’un autre composant de l’application.
● Il permet d’invoquer des Activités, des « Broadcast Receivers » ou des
Services.

Utilisation des intentions sous android


Il peut être souvent utilisé pour :
● Lancer/démarrer une activité : Démarrer une nouvelle instance d'une activité en
transmettant un intent à startActivity(…) ou startActivityForResult (…).
● Dans la suite du cours on ne va travailler que sur ce cas de figure.
● Démarrer un service : pour effectuer une opération ponctuelle (télécharger un fichier)
en transmettant un intent à startService (intent) ou bindService (Intent,
ServiceConnection, int) pour communiquer avec un service d'arrière-plan.
● Diffuser un Broadcast : Le système diffuse diverses émissions pour les événements du
système (par exemple lorsque le système démarre ou que l'appareil commence à se
charger). broadcastIntent sera envoyé à tous les composants « Broadcast Receiver »
intéressés.

2
05/01/2023

Types d’Intents en Android


Il existe 2 types d’Intents en Android :
● Explicites :
○ En ciblant un composant précis d’une application par invocation directe (Exemple : une
activité donnée déclenche l’affichage d’une autre activité dans la même application).
○ Ils permettent généralement de démarrer un composant appartenant à votre propre
application.
● Implicites :
○ Ils ne permettent pas de cibler un composant spécifique, mais déclarent seulement une
action à réaliser.
○ Ils permettent généralement à un composant d’une application d’appeler un autre
composant d’une autre application (exemple : navigateur web, Galerie, Contacts…).
5

Intent
Explicite
6

3
05/01/2023

Structure d’un intent Explicite

● Un objet Intent contient des informations utilisées par le système Android pour
déterminer le composant à démarrer, ainsi que les informations que le
composant destinataire utilise pour exécuter correctement l'action à
entreprendre.

Structure d’un intent Explicite


○ Context :
■ le contexte à partir duquel l’Intent est créé et sera envoyé (this). On peut aussi la récupérer
en utilisant la méthode getApplicationContext ().
■ Ce paramètre fait référence la plupart du temps à l’activité en cours pointée par le mot clef
« this » ;
○ Component :
■ Nom du composant cible à démarrer. C'est ce qui rend un intent explicite.
■ Sans le nom du composant, l'intent est implicite et le système décide quel composant doit
recevoir l'intent.
■ Il est pointé par le mot clef NomActiviteADemarrer.class.

4
05/01/2023

Démarrage d’une activité


Démarrage d’une activité sans retour
● Cala permet de démarrer une activité sans attendre un retour de l’activité qui sera
lancée. ● Pour se faire, on utilise la méthode
startActivity(..).

● ● Le constructeur de la classe Intent prend le


paramètre suivant:
startActivity(Intent intent);
.

Démarrage d’une activité


Démarrage d’une activité avec retour
● La méthode startActivity(Intent intent) ne propose aucun mécanisme de retour d’information vers
l’activité « parent » qui a démarré l’activité enfant, du coup la méthode startActivityForResult(Intent
intent, int requestCode) est prévue à cet effet.
● Lorsque une activité enfant termine sa tâche(Activity2), elle en avertira l’activité parent(Activity1) qui l’a
lancé (elle lui envoie un retour) comme le montre la figure suivante :

10

5
05/01/2023

Démarrage d’une activité


Démarrage d’une activité avec retour
1. L’activité parent (Activity1) invoque l’Activity2 en utilisant la méthode
startActivityForResult(Intent intent, int requestCode).
○ A la différence de la méthode startActivity(…), la méthode startACtivityForResult(…)
prend en paramètre l’Intent et un entier.
○ Cet entier est comme un identifiant à cette opération que vous choisissez.
2. L’activité enfant (Activity2), exécute sa tâche et envoie un retour à l’Activity1 en utilisant la
méthode setResult() et termine sa tâche :

3. Quand l’Activity détecte que l’Activity2 a terminé sa tâche L’activité1 exécute la méthode
onActivityResult(int requestCode, int resultCode, Intent data) et récupère la valeur de
retour envoyée par Activity2. 11

Démarrage d’une activité


Démarrage d’une activité avec retour

○ int requestCode : valeur identifiant quelle activité a appelé la méthode. La même


valeur a été spécifiée comme paramètre de la méthode startActivityForResult
lors du démarrage de la sous-activité ;
○ int resultCode : 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.

12

6
05/01/2023

Démarrage d’une activité


Exemple d’illustration
● Android prévoit plusieurs resultCode par défaut telles que RESULT_OK et RESULT_CANCELED…

13

Démarrage d’une activité


Exemple d’illustration
● Pour récupérer la valeur de retour envoyée par une activité enfant, utilisez la méthode
onActivityResult(int requestCode, int resultCode, Intent data) de l’activité parent, depuis
laquelle vous avez 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. La même
valeur a été spécifiée comme paramètre de la méthode startActivityForResult lors du
démarrage de la sous-activité ;
■ int resultCode : 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.
14

7
05/01/2023

Démarrage d’une activité


Exemple d’illustration

Au niveau de
l’activité parente :

15

Injection de données
● Les Intents ne sont pas utilisés seulement pour démarrer une activité, elles peuvent aussi
transmettre des données d’une activité à une autre en utilisant un champ «extra» qui leur
permet de contenir des données à véhiculer entre les activités.
=> Un extra est une clé à laquelle on associe une valeur.
● Pour insérer un extra, il suffit d'utiliser la méthode suivante :

● Vous pouvez récupérer un extra précis à l'aide de sa clé et de son type en utilisant la méthode
get{X}Extra(String key, X defaultValue) (defaultValue la valeur qui sera retournée si la clé
passée ne correspond à aucun extra de l'intent).
● NB : X pour indiquer le type de la valeur (on peut y mettre un peu n'importe quel type de base,
int, String ou double[]…).
16

8
05/01/2023

Injection de données
● En revanche, pour les types un peu plus complexes tels que les tableaux, on ne peut préciser
de valeur par défaut, par conséquent on devra par exemple utiliser la méthode float[]
getFloatArrayExtra(String key) pour un tableau de float.
● Pour récupérer tous les extras d'un intent, utilisez la méthode Bundle getExtras(…).
● Exemple :

17

Exercice d’application
On veut créer une application qui calcule la somme de 2 entiers. Cette application contient 2
activités : Activity1 et Activity2.
1. Implémentez la solution en utilisant la méthode startActivity.
L’interface graphique est la suivante :

● Avec 2 EditText dont l’id est respectivement : ent1 et ent2 et 1 Button dont l’id est btn

18

9
05/01/2023

Exercice d’application
2. Implémentez la solution en utilisant la méthode startActivityForResult
L’interface graphique est la suivante :

● Avec 2 EditText dont l’id est respectivement : ent1 et ent2, 1 Button dont l’id est btn et Un
textView dont l’id est res.

19

Correction
1) Utilisation de startActivityForResult

20

10
05/01/2023

Correction

21

Correction
2) Utilisation de startActivityForResult
Avtivity1:

22

11
05/01/2023

23

Avtivity2:

24

12
05/01/2023

Avtivity2:

25

Les intents Filter


● Un Intent Filter est une expression dans le fichier Manifest d’une application qui spécifie le
type d’intents que le composant veut recevoir
● Il Permet aux autres activités de lancer directement votre activité en utilisant un certain Intent.
● Si vous ne déclarez pas d’Intent Filters à votre activité, elle ne pourra être déclenchée que par
un Intent Explicite.
● Il est recommandé de ne pas déclarer d’Intent Filters pour les services, car cela peut causer des
problèmes de sécurité.

26

13
05/01/2023

Intents
Implicites
27

Introduction
Application A 2

Implicite
Activity1

Application 1

Activity2

Explicite Application 2

1
28

14
05/01/2023

Définition et utilisation
● Ne permettent pas de cibler un composant spécifique comme les intents explicites, mais
déclarent une action à réaliser.
● Ils permettent généralement d’appeler un composant d’une autre application
(exemple : navigateur web, galerie…).

Browser Contacts Picture Geo localization

● Ce système d’utilisation d’Intent implicite a recourt à des filtres comme points d’entrée
pour distribuer les intents aux composants les plus appropriés. 29

Définition et utilisation
● Un Intent permet également de demander à un composant d’une autre application de
traiter l’action que vous souhaiteriez réaliser.
● C’est le système qui décide de l’application à utiliser pour accomplir votre souhait.

30

15
05/01/2023

Structure d’un Intent Implicite


Intent(ACTION, Data);

● Action : l’action à réaliser, peut être prédéfinie ACTION_VIEW, ACTION_EDIT, ACTION_MAIN…) ou


créée par l’utilisateur.
● Donnée : Les données principales sur lesquelles on va agir, tel que le numéro de téléphone à
appeler.
Intent.ACTION_CALL Appeler un numéro de téléphone.

Intent.ACTION_DIAL Afficher l’interface de composition des numéros.

Intent.ACTION_VIEW Démarrer une action permettant de visualiser l’élément


identifié par l’URI spécifiée en paramètre.
Intent.ACTION_SENDTO Lancer une activité capable d’envoyer un message au
contact défini par l’URI spécifiée en paramètre.
Intent.ACTION_PICK Choisissez un contenu (photo, contact…)
31

Structure d’un Intent Implicite


Intent(ACTION, Data);

Intent. ACTION_ANSWER Prendre en charge un appel entrant.

Intent.ACTION_EDIT Éditer une donnée.


Intent.ACTION_DELETE Démarrer une activité permettant de supprimer une donnée
identifiée par l’URI spécifiée en paramètre.
Intent.ACTION_SEARCH Démarrer une activité de recherche.

Intent.ACTION_WEB_SEARCH Démarrer une action permettant de visualiser l’élément identifié


par l’URI spécifiée en paramètre.

32

16
05/01/2023

Spécifier les permissions liées aux actions


● Pour certaines actions, il est nécessaire de spécifier dans le fichier de configuration les permissions
nécessaires
 Appel téléphonique, accès réseau, etc.

● Exemple :

<manifest …

<uses-permission
android: name="android.permission.CALL_PHONE" />

</manifest>

33

Spécifier les permissions liées aux actions


● Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation
par une balise <uses-permission>

<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.WRITE_CONTACTS" />

<uses-permission
 android:name="android.permission.READ_CALENDAR" />

<uses-permission android:name="android.permission.WRITE_CALENDAR" />

<uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS" />

<uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS"
34

17
05/01/2023

Structure d’un Intent Implicite


Intent(ACTION, Data);

● C’est une URI (Uniform Ressource Identifier ) référençant


la donnée sur laquelle l’action va agir.
● 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).
● Pour créer un objet URI, il suffit d'utiliser la méthode
statique : Uri Uri.parse(String uri).
● Exemple : Uri x = Uri.parse("sms:0606060606");

35

Structure d’un Intent Implicite


Intent(ACTION, Data);
● La syntaxe d'un URI peut être analysée de la manière suivante :
<schéma> : <information>
○ Le schéma décrit quelle est la nature de l'information. S'il s'agit d'un numéro
de téléphone, alors le schéma sera tel, s'il s'agit d'un site internet alors le
schéma sera http.
○ L'information est la donnée à envoyer.
● Exemples : Tel: numéro de téléphone
Smsto: numéro de telephone
http: adresse web
Gps: les coordinations gps (Ex : 123.456789,-12.345678)
36

18
05/01/2023

Exemples : Intent Implicite


Intent appel =
new Intent(Intent.ACTION_CALL, Uri.parse("tel:20111222"));

Permissions to add (Manifest):


<uses-permission android:name="android.permission.CALL_PHONE">
</uses-permission>

37

Exemples : Intent Implicite

Intent sms=
new Intent(Intent.ACTION_SENDTO,
Uri.parse("smsto:20111222"));

Sms. putExtra("sms_body", "Bonjour à tous");

38

19
05/01/2023

Exemples : Intent Implicite

Intent web=
New Intent(Intent.ACTION_VIEW,
Uri.parse("http:www.google.fr"));

39

Exemples : Intent Implicite

Intent picture=
new Intent(Intent.ACTION_VIEW,
MediaStore.Images.Media.INTERNAL_CONTENT_URI);

40

20
05/01/2023

Exemples : Intent Implicite

Intent contact=
new Intent(Intent.ACTION_PICK,
Uri.parse( "content://contacts/people/"));

41

Exemples : Intent Implicite

Intent wifi = new Intent(Settings.ACTION_WIFI_SETTINGS);

42

21
05/01/2023

Exemples : Intent Implicite

Intent manager= new


Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);

43

Comment lancer un
Intent implicite ?

22
05/01/2023

Lancer un Intent Implicite


Méthode 1

Démarrer une activité Méthode 2


sans retour Démarrer une activité
avec retour

startActivity(Intent i) startActivityForResult
(Intent i, Integer RequestCode)

1 2

1. La méthode startActivity

Intent appel = new Intent(Intent.ACTION_CALL, Uri.parse("tel:20111222"));


startActivity(appel);

23
05/01/2023

2. La méthode Start Activity for Result

(1)
Calling Activity 2 (2)
Using Intent Receiving Data
& from Activity 1
Sending Data

(3)
(4) Sending
Receiving Data/Result
a Return from To Activity 1
Activity 2

Activity 1 Activity 2

Example

ImageView

Get a Picture

Activity 1 Application Gallery

24
05/01/2023

Correction Activity 1

public class MainActivity extends AppCompatActivity {


ImageView image;
Button btn1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image=findViewById(R.id.image);
btn1=findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i=new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(i, 37);
}
});

Correction Activity 1

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode==37) {
if (resultCode==RESULT_OK) {

Uri uri=data.getData();
image.setImageURI(uri);
}
}

25

Vous aimerez peut-être aussi