Vous êtes sur la page 1sur 10

Atelier 3

Le modèle de
composants.

Le modèle de composants Page 1


Sommaire :

1. Les Intents et le partage de données entre activités via Intent.


2. Broadcast Receiver

Etape 1 - Les intents et Partage de données entre activités via Intent


Il existe deux types d'intents dans Android. L'un est l'intent implicite et l'autre est l'intent
explicite. Nous allons discuter de deux intents Android avec des exemples appropriés dans
cette étape de l'atelier.

Dans le même exemple, nous allons utiliser deux boutons (boutons nommés comme
«intention explicite» et «intention implicite») dans l'écran principal d'une activité; alors quand
nous allons cliquer sur le premier bouton (de l'intent explicite), nous allons commencer une
nouvelle Activité Android utilisant 'intent explicite. De même, lorsque nous allons cliquer sur
le deuxième bouton (de l'intent implicite), nous allons ouvrir un navigateur web avec une URL
spécifiée.

1. Créer un projet dont le nom est "IntentExample"

Le modèle de composants Page 2


2. Nommer l'application "IntentExample" et le nom de package "atelier.intentexample".

3. Créer les deux interfaces (fichiers XML) des deux activités qu'on utilisera dans le répertoire
"res/layout" comme suit :

le premier fichier sera nommé "activity_main.xml" et représentera l'interface principale de


l'application comme on l'a montré auparavant

le deuxième fichier sera nommé "activity_second.xml" et comportera tout simplement un


champ de texte indiquant c'est la deuxième activité qui est en cours d'exécution.

on aura alors pour "activity_second.xml"

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".SecondActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="c'est la deuxieme activité"/>
</LinearLayout>

et pour "activity_main.xml" on aura :

Le modèle de composants Page 3


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">

<TextView
android:layout_width="match_parent"
android:layout_height="62dp"
android:layout_weight="3"
android:gravity="center"
android:text="Android Intent Example"
android:textColor="@color/c1"
android:textSize="24sp" />

<Button
android:id="@+id/btnExplicitInt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:layout_marginTop="90dp"
android:text="Explicit Intent"
android:layout_weight="1"/>
<Button
android:id="@+id/btnImplicitInt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Implicit Intent"
android:layout_weight="1"/>

</LinearLayout>

4. créer l'activité principale de notre application relative à la première interface


"activity_main.xml", cette activité déclarera les méthodes d'invocation des intents (vu
auparavant dans l'atelier) lors du clique sur les boutons de l'interface.

la première activité sera nommée "MainActivity" et la seconde "SecondActivity" on aura alors


pour la premiere activité :

Le modèle de composants Page 4


package com.example.bh_info_81.intentexample;

import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

import java.net.URI;

public class MainActivity extends AppCompatActivity {

private Button btnExplicitInt;

private Button btnImplicitInt;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnExplicitInt=findViewById(R.id.btnExplicitInt);
btnImplicitInt=(Button)findViewById(R.id.btnImplicitInt);
btnExplicitInt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intentExplicit=new
Intent(getApplicationContext(),SecondActivity.class);
intentExplicit.putExtra("First Value", "First value of
activity");
intentExplicit.putExtra("Second Value", "Second value of
activity");
startActivity(intentExplicit);
}
});
btnImplicitInt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intentImplicit=new Intent(Intent.ACTION_VIEW,
Uri.parse("https://stackoverflow.com/"));
try{
startActivity(intentImplicit);
}
catch(ActivityNotFoundException e){
e.getMessage();
}
}
});

Le modèle de composants Page 5


et pour la première activité :

package com.example.bh_info_81.intentexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {


private TextView editValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
editValue=findViewById(R.id.editValue);
String str1= getIntent().getStringExtra("First Value");
String str2=getIntent().getStringExtra("Second Value");
editValue.setText(str1 + "___"+str2);

}
5. Compiler et exécuter le projet.

Le modèle de composants Page 6


Exercice sur le partage de données entre activités via intents :

1. créer l'interface principale de l'application contenant les champs de saisie du nom et du


numéro de téléphone ainsi que le bouton d'invocation de la deuxième activité. la première
interface (fichier XML) sera nommée "activity_main.xml"

2. créer l'activité principale relative à l'interface "activity_main.xml" et comportera les lignes


de codes responsables de la récupération des données saisies par l'utilisateur et l'envoi de ces
données vers la deuxième activité lors du clique sur le bouton. l'activité sera nommé
"MainActivity "

3. créer la deuxième interface qui comportera un simple champ de texte dans lequel on
affichera les données reçues depuis la première activité. la deuxième interface sera nommée
"activity_second.xml"

4. créer la deuxième activité relative à la deuxième interface et dont le rôle et de récupérer


les données envoyées par la première activité et les afficher dans le champ de texte de la
deuxième interface.

la récupération de données depuis un intent est réalisée manipulant la méthode :

- getIntent().getStringExtra("nom de la donnée");

la deuxième activité sera nommée "ActivitySecond"

5. Compiler et exécuter le projet.

Le modèle de composants Page 7


Etape 3 - Les Boradcast Receiver :
Pour pouvoir recevoir des intents, Android vous permet de créer une classe qui implémente
BroadcastReceiver. Ces objets sont conçus pour recevoir des intents (intentions) et appliquer
des comportements spécifiques à votre code.

L’interface BroadcastReceiver ne possède qu’une seule méthode onReceive() que votre classe
devra implémenter.

Un BroadcastReceiver ne vit que le temps de traiter votre onReceive(). L’instance peut être
supprimée par le Garbage Collector.

Les receivers sont limités : ils ne peuvent pas ouvrir de boite de dialogue par exemple. Le
système Android envoie l’intention à tous les BroadCast Receiver abonnées par ordre de
priorité (priorité de votre BroadCast dans le fichier AndroidManifest.xml).

Si un BroadCast souhaite interrompre la réception du Broadcast à ceux d’un niveau inferieure


de priorité, il faut utiliser la méthode abortBroadcast().

Le but de cette étape de l'atelier est de créer un BroadCast Receiver permettant de notifier
l'utilisateur de la réception d'un SMS en affichant un "Toast" Android à ce dernier. Nous
devons pour cela enregistrer un BroadCast Receiver relatif à la fonctionnalité de réception
d'SMS.

1 . créer le BroadCast Receiver

D'abord créer votre propre classe de récepteur héritant de la classe BroadcastReceiver par
défaut. Ensuite Substituez la méthode OnReceive () dans votre classe. Cette méthode
OnReceive () sera appelée quand un nouveau SMS sera reçu par le téléphone.

Ci-dessous est la classe de récepteur pour obtenir la notification d'arrivée de SMS. Dans la
méthode OnReceive (), nous allons obtenir des détails sur les SMS entrants. Nous allons
afficher les détails des SMS entrants en utilisant un Toast Android.

Le modèle de composants Page 8


2. Enregistrer le BoradCast Receiver afin de recevoir les notification de réception d'SMS.

Il ya deux façons d'enregistrer la BroadcastReceiver dans Android.

- Enregistrez le BroadcastReceiver dans le fichier manifeste du projet. Si vous utilisez cette


méthode, vous ne pourrez pas contrôler le cycle de vie du BroadcastReceiver. Cela signifie que
votre application sera toujours notifier, à moins que vous désinstallez l'application.

- Enregistrez le BroadcastReceiver utilisant la méthode Context.registerReceiver(). En utilisant


cette méthode, nous pouvons contrôler le cycle de vie du BroadCast grâce à l'enregistrement
et non-enregistrement du BoradCast selon notre exigence.

on utilisera ici la méthode de l'enregistrement dans le Manifest (le receiver est définit dans
l'élément "application") :

Le modèle de composants Page 9


3 . Ajouter la permissions nécessaire dans le fichier de configuration Manifest afin de pouvoir
détecter la réception d'SMS dans notre application. (les permission sont définis dans l'élément
"manifest") :

4. Compiler et exécuter le projet.

5. Simuler l'envoi d'un SMS depuis l'outil DDMS dans eclipse et observer le résultat sur
l'émulateur.

Le modèle de composants Page 10