M.Houssem LAHIANI
1
Cours de programmation
sous Android
Responsable de matière : Monsieur Houssem Lahiani.
Chapitre 4 : Les intents sous Android
Plan du chapitre Cours de programmation sous Android .............................................................................................................................. 1
Chapitre 4 : Les intents sous Android ................................................................................................................................. 2
I. Types de transmission d'Intent ............................................................................................................................... 2
II. Structure d'un Intent ............................................................................................................................................... 2
III. Actions d'Intent prédéfinies ................................................................................................................................ 2
IV. Intent Filter .......................................................................................................................................................... 3
V. Les différents types d'Intents .................................................................................................................................. 3
VI. Transfert de données entre activités .................................................................................................................. 4
VII. Exercice : Utilisation des Intent de passer d'une activité à l'autre envoyer des données via putExtra ........... 5
M.Houssem LAHIANI
2
Chapitre 4 : Les intents sous Android
Les Intents sont des messages asynchrones qui permettent aux composants d'une application de
demander des fonctionnalités à d’autres composants Android. Les Intents vous permettent d'interagir
avec vos propres composants ou des composants d'autres applications. Par exemple, une activité peut
démarrer une autre activité pour prendre une photo.
Les Intents sont des objets de type android.content.Intent. Votre code peut les envoyer au système
Android pour définir les composants que vous ciblez. Par exemple à travers la méthode startActivity(),
vous pouvez définir que cet Intent doit être utilisé pour démarrer une activité.
Un Intent peut avoir des données dans un Bundle. Ces données peuvent être utilisées par le composant
qui traite l'Intent.
I. Types de transmission d'Intent
Unicast: vers un composant explicitement nommé :vers une classe Java.
Anycast: vers un composant assurant une certaine action (visualisation, édition, launcher, ...)
sur certain type de données.
Multicast: diffusion vers des recepteur de broadcast inscrit pour recevoir un type d'Intent.
Par défaut, la communication est uni-directionnel, mais on peut répondre à un Intent par un
autre Intent.
II. Structure d'un Intent
Un Intent est constitué de :
– Action à réaliser
– Donnée sur laquelle réaliser l'action sous forme d'URI (setData()) ou d'un type MIME (setType())
– Paramètre optionnels (EXTRA)
Création d'un Intent
– Intent(Context, Class<?>) pour l'appels explicite
– Intent(String action, URI) pour l'appel implicite
– addCategory(String category) ajout de catégories
– putExtra(String key,value)
– setFlags(flags) permission sur les données, relation activité/BackStack.
III. Actions d'Intent prédéfinies
ACTION_MAIN: action principale
ACTION_VIEW: visualiser une donnée
M.Houssem LAHIANI
3
ACTION_ATTACH_DATAT: attachement de donnée
ACTION_EDIT: Edition de donnée
ACTION_PICK: Choisir un répertoire de donnée
ACTION_CHOOSER: menu de choix pour l'utilisateur
– EXTRA_INTENT contient l'Intent original, EXTRA_TITLE le titre du menu
ACTION_GET_CONTENT: obtenir un contenu suivant un type MIME
ACTION_SEND: envoyé un message (EXTRA_TEXT|EXTRA_STREAM) à un destinataire non spécifié
ACTION_SEND_TO: on spécifie le destinataire dans l'URI
ACTION_INSERT: on ajoute un élement virge dans le répertoire spécifié par l'URI
ACTION_DELETE: on supprime l'élement désigné par l'URI
ACTION_PICK_ACTIVITY: menu de sélection selon l'EXTRA_INTENT mais ne lance pas l'activité
ACTION_SEARCH: effectue une recherche
etc.
IV. Intent Filter
Définie dans le AndroidManifest.xml dans la balise <activity>
Nom de l'action
<action android:name=”XXX”/>
Category
<category android:name=”XXX”/>
Android.intent.category.[DEFAULT|BROWSABLE|TAB|
ALTERNATIVE|LAUNCHER|HOME|PREFERENCE|TEST]
Type MIME
<category android:mimeType=”XXX”/>
Exemples
Définir l’activité principale qui se lance en premier lieu dans l’application
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Mon activité sait lire et éditer les images JPEG
<intent-filter android:label="@string/jpeg_editor">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<data android:mimeType="image/jpeg" />
</intent-filter>
V. Les différents types d'Intents Android supporte les Intents explicites et implicites.
Une application peut définir les composants cibles directement dans l'Intent (Intent explicite) ou demander au
système Android de rechercher le composant adéquat en se basant sur les données de l'Intent (Intent implicite).
M.Houssem LAHIANI
4
1. Les Intents explicites
Les Intents explicites définissent explicitement le composant qui doit être appelé par le système Android en
utilisant le nom de classe Java comme identifiant.
L'exemple suivant montre comment créer un Intent explicite et comment l'envoyer au système Android. Si cette
classe représente une activité, le système Android la démarrera.
Intent i = new Intent(this, ActivityTwo.class);
//Envoi de données à la seconde activité
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two for ActivityTwo");
//Pour démarrer l’intent
i.startActivity(i);
Les Intents explicites sont généralement utilisés au sein d'une application car les classes de cette application
sont contrôlées par le développeur de l'application.
2. Les Intents implicites
Les Intents implicites précisent l'action qui devrait être effectuée avec éventuellement les données pour cette
action.
Par exemple, ce qui suit indique au système Android d'afficher une page Web. Tous les navigateurs Web
installés doivent être enregistrés avec l'Intent correspondant en utilisant un Intent Filter.
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://houssem-lahiani.blogspot.com/"));
startActivity(i);
Si un Intent explicite est envoyé au système Android, il recherche tous les composants qui sont enregistrés avec
l'action spécifique et le type de données approprié.
VI. Transfert de données entre activités
Un Intent contient l'action et éventuellement des données complémentaires. Le composant qui crée l'Intent peut
y ajouter des données avec la méthode surchargée putExtra(). Les données supplémentaires sont des paires
clé/valeur, la clé est toujours une chaîne. En valeur, vous pouvez utiliser les types de données primitifs (int,
float, ..) ainsi que les types String, Bundle, Parcelable et Serializable.
Le composant récepteur peut accéder à ces informations avec les méthodes getAction() et getData() sur l'objet
Intent. Cet objet Intent peut être récupéré avec la méthode getIntent().
Le composant qui reçoit l'Intent peut utiliser la méthode getIntent().getExtras () pour obtenir les données
supplémentaires.
Bundle extras = getIntent().getExtras();
if (extras == null) {
return;
}
// Get data via the key
String value1 = extras.getString(Intent.EXTRA_TEXT);
if (value1 != null) {}
M.Houssem LAHIANI
5
VII. Exercice : Utilisation des Intents pour passer d'une activité à une autre et envoyer des données
via putExtra Dans cet exercice, nous allons voir comment passer d'une activité à une autre en envoyant des données après
avoir cliqué sur le bouton.
Créez un nouveau projet dans votre éclipse (File ==> New ==> Android Application Poject) et donner le nom de
«Intention» de votre projet.
Dans votre activity_main.xml mettez ce code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<Button
android:id="@+id/intent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Click me !" />
</RelativeLayout>
Dans votre classe MainActivity.java mettez ce code :
public class MainActivity extends Activity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.intent);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
}}
M.Houssem LAHIANI
6
Maintenant, ajoutez « a new android xml file » dans votre dossier layout et donnez lui le nom de
second_activity.xml: Faites un clic droit sur le dossier layout ==> New ==> Android XML File.
Mettez ce code dans votre fichier second_activity.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
Après cela ajouter une nouvelle activité (classe java) dans votre package situé dans le dossier src et donnez-lui
ce nom : «Second».
Cette nouvelle classe (Second.java) dans laquelle nous pouvons faire appel à notre interface avec
setContentView (View) doit hériter de la classe Activity et doit contenir la méthode "onCreate()" pour appeler
(avec setContentView(View)) notre layout "second_activity.xml "récemment ajouté.
La classe Second.java doit contenir ce code :
public class Second extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
}}
N'oubliez pas de déclarer votre nouvelle activité (Second) dans le fichier AndroidManifest.xml.
A l'intérieur de la balise XML <application> .... </ application> du fichier AndroidManifest.xml mettez ce code :
<activity
android:name=".Second"
android:label="@string/app_name" >
</activity>
M.Houssem LAHIANI
7
Votre AndroidManifest.xml sera semblable à ce code :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.intention"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Second"
android:label="@string/app_name" >
</activity>
</application>
</manifest>
M.Houssem LAHIANI
8
Maintenant, ce que nous voulons faire est de passer de la "MainActivity" à "Second", nous devons utiliser une
intent pour le faire.
Alors maintenant, nous devons ajouter ces deux lignes dans la methode onClick () de notre bouton pour passer
de MainActivity à Second :
public class MainActivity extends Activity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.intent);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intention = new Intent(MainActivity.this, Second.class);
startActivity(intention);
}
});
}
}
Maintenant, exécutez votre projet et vous verrez ce qui se passera lorsque vous cliquez sur le bouton "Click
me!".
Mais si nous voulons envoyer des données de l'activité principale de la deuxième activité que ferons-nous ?
Nous allons créer une variable de type String dans le MainActivity.java dans laquelle nous allons mettre un
texte.
Ce texte doit être affiché dans un toast après le déplacement de la première activité vers la seconde .Donc la
valeur de cette chaîne doit être envoyé dans l’Intent avec la méthode "putExtra".
Nous allons commencer par déclarer notre variable de type String.
String value="Hello World!!!!";
Nous devons mettre cette variable dans notre méthode putExtra () après la déclaration de l’Intent.
intention.putExtra("send", value);
M.Houssem LAHIANI
9
Le composant qui crée l'Intent peut y ajouter des données avec la méthode surchargée putExtra(). Les données
supplémentaires sont des paires clé ("send")/valeur(value), la clé est toujours une chaîne.
En valeur, vous pouvez utiliser les types de données primitifs (int, float, ..) ainsi que les types String, Bundle,
Parcelable et Serializable.
Notre MainActivity aura ce code :
public class MainActivity extends Activity {
Button btn;
String value="Hello World!!!!";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.intent);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intention = new Intent(MainActivity.this, Second.class);
intention.putExtra("send", value);
startActivity(intention);
} });}}
La question se pose maintenant : comment la classe "Second.java" pourrait récupérer les données qui ont été
envoyées ? Nous devons créer un Bundle dans la classe Second.java pour récupérer les valeurs provenant de la
classe « MainActivity.java ».
Bundle extras= getIntent().getExtras();
getExtras():récupère les données qui ont été ajouté à l'aide putExtra ().
getIntent () retourne l'Intent qui a démarré cette activité.
Après ceci, nous devons créer une variable de type String pour avoir la chaîne passée avec l'Intent et par la suite
nous allons créer un Toast pour nous montrer le contenu de cette chaîne.
if(extras != null)
{
String newString=extras.getString("send");
Toast.makeText(Second.this,newString, Toast.LENGTH_LONG).show(); }
M.Houssem LAHIANI
10
Donc le code que la classe Second.java doit contenir ressemble à ceci :
public class Second extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
Bundle extras= getIntent().getExtras();
if(extras != null)
{
String newString=extras.getString("send");
Toast.makeText(Second.this,newString, Toast.LENGTH_LONG).show();
}
}
}
Top Related