Les intents sous Android

10
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

Transcript of Les intents sous Android

Page 1: Les intents sous Android

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

Page 2: Les intents sous Android

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

Page 3: Les intents sous Android

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).

Page 4: Les intents sous Android

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) {}

Page 5: Les intents sous Android

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

}

});

}}

Page 6: Les intents sous Android

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>

Page 7: Les intents sous Android

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>

Page 8: Les intents sous Android

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);

Page 9: Les intents sous Android

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(); }

Page 10: Les intents sous Android

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();

}

}

}