Sie sind auf Seite 1von 20

Dveloppement Android

J.-F. Couchot
12 novembre 2012

Table des matires


1

.
.
.
.
.
.
.
.
.

3
3
3
3
3
3
3
3
4
4

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

5
5
5
5
5
6
6
7
7
7
7
7
7
7
7
9
9

Cycle de vie dune activit


I
Mthodes du cylce de vie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
II
Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10
10
10

Sauvegarder des donnes


I
Les prfrences . . . . . . . . . . . . . . . . . . . .
I.1
Mthodes . . . . . . . . . . . . . . . . . . .
I.2
Exercices . . . . . . . . . . . . . . . . . . .
I.3
Travaux Pratiques . . . . . . . . . . . . . . .
II
Les fichiers . . . . . . . . . . . . . . . . . . . . . .
III Le cloud . . . . . . . . . . . . . . . . . . . . . . . .
III.1 Hriter de la classe BackupAgentHelper
III.2 Modifier le manifest pour toute lapplication
III.3 La demande de synchronisation . . . . . . .
III.4 valuer le dveloppement . . . . . . . . . .
III.5 Travaux pratiques . . . . . . . . . . . . . . .

12
12
12
12
12
13
13
13
14
14
14
14

Introduction lOS embarqu Android


I
Composants principaux dune application
I.1
Une activit . . . . . . . . . . . .
I.2
Un service . . . . . . . . . . . .
I.3
Une Intention . . . . . . . . . . .
I.4
Un fournisseur de contenus . . . .
II
Organisation dun projet Android . . . . .
II.1
Arborescence . . . . . . . . . . .
II.2
Travaux Pratiques : Hello World .
II.3
Exercice . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

Les interfaces utilisateur


I
Rendu visuel . . . . . . . . . . . . . . . . . . . . . . .
II
Interface : programmation Java ou dclaration XML . . .
II.1
Programme Java . . . . . . . . . . . . . . . . .
II.2
Dclaration XML . . . . . . . . . . . . . . . . .
III Les principaux composants graphiques . . . . . . . . . .
III.1 Exercice . . . . . . . . . . . . . . . . . . . . . .
IV Les Layouts . . . . . . . . . . . . . . . . . . . . . . . .
IV.1
LinearLayout . . . . . . . . . . . . . . . . . . .
IV.2
RelativeLayout . . . . . . . . . . . . . . . . . .
IV.3
FrameLayout . . . . . . . . . . . . . . . . . . .
IV.4
TableLayout . . . . . . . . . . . . . . . . . . .
IV.5
Travaux Pratiques . . . . . . . . . . . . . . . . .
V
Les menus des activits . . . . . . . . . . . . . . . . . .
V.1
Les menus sous la version 2.3.X . . . . . . . . .
V.2
Une barre dactions . . . . . . . . . . . . . . . .
V.3
Particulariser la barre daction (ajouter un menu)

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

Rcupration priodique de donnes grce un service


I
Organisation gnrale . . . . . . . . . . . . . . . . .
II
Lapplication web . . . . . . . . . . . . . . . . . . .
II.1
La basse de donnes . . . . . . . . . . . . .
II.2
Les pages PHP . . . . . . . . . . . . . . . .
III Lapplication Android . . . . . . . . . . . . . . . . .
III.1 Vue organise laide donglets . . . . . . .
III.2 Lenvoi de messages . . . . . . . . . . . . .
III.3 Le service de rception de messages . . . . .
III.4 Laffichage des messages . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

15
15
15
15
15
17
17
18
18
19

Chapitre 1

Introduction lOS embarqu Android


I Composants principaux dune application
Une application Android est construite partir de quatre catgories de composants : les activits, les services, les
intentions et les fournisseurs de contenu.

I.1

Une activit

Cest la brique de base. Par dfaut une application est une activit. Cest un morceau de code qui sexcute
la demande de lutilisateur, de lOS,. . . et qui peut tre tu par lutilisateur ou lOS pour prserver la mmoire du
tlphone. Une activit peut interagir
avec lutilisateur en lui demandant des donnes
avec dautres activits ou services en mettant des intentions ou fournissant du contenu (voir ci dessous)

I.2

Un service

Cest lanalogue des services ou dmons qui sexcutent sur un OS classique. Cest un morceau de code qui
sexcute habituellement en arrire-plan entre le moment o il est lanc jusqu larrt du mobile.

I.3

Une Intention

Une intention (intent en anglais) est un message contenant des donnes mis par Android (lOS, une autre application, un autre service) pour prvenir les applications sexcutant de la survenue dun vnement : dplacement du
GPS, rception dun SMS. . .

I.4

Un fournisseur de contenus

Une application Android rpond normalement un besoin et fournit donc certaines fonctionnalits. On appelle
cela un fournisseur de contenus. Une application doit normalement se dclarer comme fournisseur de tel ou tel contenu
(lorsquils sont identifis). Une autre application qui ncessiterait un moment ce contenu met une requte auprs
de lOS pour lobtenir. LOS lance alors directement lapplication dclare comme fournisseur.

II

Organisation dun projet Android

II.1 Arborescence
Un projet Android dvelopp via lADT possde peu ou prou larborescence de fichiers et dossiers suivante :
Le dossier assets (un bien) qui contient les paquetages externes utiliss par lapplication dveloppe : les fontes,
les fichiers jar, etc.. . .
Le dossier bin qui contient toutes les classes compiles (.class) ainsi quune archive excutable du projet (.apk)
Le dossier gen qui contient les fichiers gnrs par lADT, notamment R.java
Le dossier res qui contient les ressources statiques du projet, notamment :
les dossiers drawable : on y met les images du projet ;
le dossier layout : contient les descriptions XML de linterface graphique ;

le dossier menu : contient les descriptions XML des menus ;


le dossier values : qui spcifie les chanes de caractres (strings.xml), les styles. . .
Noter que chaque dossier ressource peut tre particularis en fonction du support dexcution cible (voir
http ://developer.android.com/guide/topics/resources/providing-resources.html).
Le dossier src (raccourci de source ). Cest l quest plac lensemble des fichiers source Java de lapplication. Pratiquement tout le travail effectu lors de la cration dune application Android est faite dans ce dossier
ou bien dans le dossier res
Le dossier doc. Raccourci pour documentation. Cest l que seront mises les documentation relatives au projet.
Le fichier XML AndroidManifest.xml Ce fichier est gnr par lADT lorsquon cr un nouveau projet Android. Ce fichier dfinit les fondamentaux de lapplication : quelle est lactivit principale, quelles sont les
permissions requises sur lOS pour que lapplication puisse sexcuter,. . .

II.2 Travaux Pratiques : Hello World


Suivre le TP Hello World.

II.3 Exercice
1. Faire en sorte que lorsquon passe en mode paysage (dans lmulateur Ctrl+F11) lapplication Hello World
affiche en plus Landscreen.
2. Comment faire en sorte que licne de lancement de lapplication Hello World soit le mme quelle que soit
la rsolution du mobile ? Modifier en consquence le dossier res.
3. Comment faire en sorte que licne de lancement de lapplication Hello World soit le fichier icon2.jpg
lorsque laffichage est en mode paysage ?
4. Comment faire en sorte que lapplication affiche les messages en franais si la langue du tlphone est le franais
et des messages en anglais sinon ?
5. Dans le code suivant extrait du fichier manifest.xml expliquer
(a) la ligne 1
(b) les ligne 2 4
1 < a c t i v i t y a n d r o i d : n a m e = " . H e l l o W o r l d A c t i v i t y " a n d r o i d : l a b e l = " @ s t r i n g / app_name " >
2
<intent f i l t e r >
3
< a c t i o n a n d r o i d : n a m e = " a n d r o i d . i n t e n t . a c t i o n . MAIN" / >
4
< c a t e g o r y a n d r o i d : n a m e = " a n d r o i d . i n t e n t . c a t e g o r y . LAUNCHER" / >
5
</ intent f i l t e r >
6 </ activity>

Chapitre 2

Les interfaces utilisateur


On commence par crer une interface utilisateur graphique. La gestion des vnements lis celle-ci sera entrevue
en TP et approfondie plus tard.

I Rendu visuel
Dans une application Android, linterface utilisateur est construite laide dobjets de type View et ViewGroup.
Les objets de type View sont les units de base, i.e. des composants grant les interactions avec lutilisateur. Les objets
de type ViewGroup organisent la manire dont sont prsents les composants. Un ViewGroup est classiquement
dfini laide dun Layout.

II

Interface : programmation Java ou dclaration XML

La construction dinterface peut se faire selon deux approches complmentaires : la premire est programmatique
(Java) et la seconde est une dclaration laide dun fichier XML.

II.1 Programme Java


Dans la version programmatique, un objet ViewGroup est instanci dans le code Java ( laide du mot-cl
new) comme un Layout particulier (ligne 4). Puis chaque composant est instanci (lignes 4 et 6) et ajout ce
ViewGroup via la mthode addView (ligne 9 et 10) et enfin le ViewGroup est attach lactivit via setContentView.
1 p u b l i c c l a s s Program e x t e n d s A c t i v i t y {
2
p u b l i c void o n C r e a t e ( Bundle s a v e d I n s t a n c e S t a t e ) {
3
super . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ;
4
L i n e a r L a y o u t l l a y o u t = new L i n e a r L a y o u t ( t h i s ) ;
5
l l a y o u t . s e t O r i e n t a t i o n ( L i n e a r L a y o u t . VERTICAL ) ;
6
TextView n l b l = new TextView ( t h i s ) ;
7
n l b l . s e t T e x t ( "Nom" ) ;
8
E d i t T e x t n e d i t = new E d i t T e x t ( t h i s ) ;
9
l l a y o u t . addView ( n l b l ) ;
10
l l a y o u t . addView ( n e d i t ) ;
11
setContentView ( l l a y o u t ) ;
12
}
13 }

On se passe compltement du fichier XML de description de lorganisation (dossier res/layout) dans une telle
approche programmatique.

II.2 Dclaration XML


La philosophie est autre ici : lorganisation visuelle de lactivit est statique et dfinie une fois pour toute dans un
fichier XML du dossier res/layout. Celui donn ci dessous aura la mme interprtation visuelle que le programme
donn avant.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
5

android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/txtvname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/name" />
<EditText
android:id="@+id/edtname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
Il reste uniquement attacher cette organisation lactivit via setContentView (ligne 4).
1 p u b l i c c l a s s Program e x t e n d s A c t i v i t y {
2
p u b l i c void o n C r e a t e ( Bundle s a v e d I n s t a n c e S t a t e ) {
3
super . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ;
4
s e t C o n t e n t V i e w ( R . l a y o u t . main ) ;
5
}
6 }

III

Les principaux composants graphiques

III.1 Exercice
On considre une activit dont la vue est lie au layout dfini par les fichiers res/layout/main.xml et
res/values/arrays.xml ci-dessous. Dire quels lments vont tre affichs, comment . . .
1 <? xml v e r s i o n = " 1 . 0 " e n c o d i n g = " u t f 8" ? >
2 < L i n e a r L a y o u t x m l n s : a n d r o i d = " h t t p : / / s c h e m a s . a n d r o i d . com / apk / r e s / a n d r o i d "
3
a n d r o i d : o r i e n t a t i o n =" v e r t i c a l "
4
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
5
a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t " >
6
<CheckBox a n d r o i d : i d = "@+ i d / cbxYN "
7
a n d r o i d : l a y o u t _ w i d t h = " 20 dp "
8
a n d r o i d : l a y o u t _ h e i g h t = " 20 dp "
9
a n d r o i d : c h e c k e d =" f a l s e " / >
10
< RadioGroup a n d r o i d : i d = "@+ i d / r g G r o u p 1 "
11
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
12
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content "
13
a n d r o i d : o r i e n t a t i o n =" v e r t i c a l ">
14
< R a d i o B u t t o n a n d r o i d : i d = "@+ i d / RB1" a n d r o i d : t e x t = " B u t t o n 1 " / >
15
< R a d i o B u t t o n a n d r o i d : i d = "@+ i d / RB2" a n d r o i d : t e x t = " B u t t o n 2 " / >
16
< R a d i o B u t t o n a n d r o i d : i d = "@+ i d / RB3" a n d r o i d : t e x t = " B u t t o n 3 " / >
17
< / RadioGroup >
18
< S p i n n e r a n d r o i d : i d = "@+ i d / s p n S a i s o n s "
19
a n d r o i d : l a y o u t _ w i d t h =" wrap_content "
20
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content "
21
a n d r o i d : e n t r i e s = " @array / s a i s o n s " / >
22
< D a t e P i c k e r a n d r o i d : i d = "@+ i d / d P d a t e "
23
a n d r o i d : l a y o u t _ w i d t h =" wrap_content "
24
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content " / >
25
<ImageView a n d r o i d : i d = "@+ i d / i m g I c o n "
26
a n d r o i d : l a y o u t _ w i d t h =" wrap_content "
27
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content "
28
android:layout_gravity = " center "
29
a n d r o i d : s r c = " @drawable / i c o n " / >
30 < / L i n e a r L a y o u t >
1 <? xml v e r s i o n = " 1 . 0 " e n c o d i n g = " u t f 8" ? >
2 <resources>
3
< a r r a y name= " s a i s o n s " >

4
<item>printemps < / item>
5
<item> ete < / item>
6
< i t e m > automne < / i t e m >
7
<item> hiver < / item>
8
</ array>
9 </ resources>

IV

Les Layouts

Les Layouts organisent le positionnement des composants graphiques dans linterface utilisateur. On nonce
les principales ci-dessous. On pourra se rfrer http://developer.android.com/guide/topics/ui/
declaring-layout.html.

IV.1

LinearLayout

Cette organisation aligne les composants dans une seule direction : verticalement ou horizontalement (en fonction
de la valeur lattribut android:orientation). Gre lalignement (android:gravity) du composant. Voir
http://developer.android.com/guide/topics/ui/layout/linear.html.

IV.2

RelativeLayout

Permet de dclarer des postions relativement par rapport au parent ou par rapport dautres composants. Voir
http://developer.android.com/guide/topics/ui/layout/relative.html.

IV.3

FrameLayout

On empile les composant les uns sur les autres. Chacun est positionn dans le coin en haut gauche en masquant
plus ou moins celui du dessous sauf en cas de composant transparent.

IV.4

TableLayout

Cette organisation agence les composants selon un quadrillage (comme avec llment <table> en HTML). Il
utilise pour cela llment <tableRow> qui dclare une nouvelle ligne. Les cellules sont dfinies par les composants
quon ajoute aux lignes.

IV.5

Travaux Pratiques

Raliser le TP intitul Les menus de lutilisateur : Lanceur, menus et sudoku .

Les menus des activits

On se restreint dans une premire partie aux menus que lon peut lancer partir du bouton menu du tlphone,
soit les version dandroid 2.3.X. A partir de la version 3.0, ce bouton ntant plus ncessairement prsent, on doit
implanter une barre daction la place.

V.1

Les menus sous la version 2.3.X


Le modle de construction est bas sur le patron MVC :

1. le menu est dfini statiquement en XML et gonfl via un inflater,


2. son contrle se fait en grant un vnement et
3. le modle est modifi en accdant lunique instance de celui-ci de manire statique.

Dfinition statique des menus


Les menus sont enregistrs dans un fichier xml du dossier /res/menu du projet. Ils contiennent ventuellement
des sous-menus. Ci dessous on donne le fichier /res/menu/sudoku_menu.xml qui dfinit deux menus et un
sous menu.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_param"
android:icon="@android:drawable/ic_menu_preferences"
android:title="@string/libelle_param">
<menu>
<group android:checkableBehavior="single">
<item android:id="@+id/menu_n1"
android:title="@string/libelle_niv_1" />
<item android:id="@+id/menu_n2"
android:title="@string/libelle_niv_2" />
<item android:id="@+id/menu_n3"
android:title="@string/libelle_niv_3" />
</group>
</menu>
</item>
<item android:id="@+id/menu_quitter"
android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:title="@string/libelle_quitter" />
</menu>

Exercices

1. Que sont @android:drawable/ic_menu_close_clear_cancel et @android:drawable/ic_menu_pre


2. Que devrait-on faire pour utiliser des icones personnaliss ?
3. A quoi servent les lignes <menu>...</menu> ?
Gonflage du menus dfini en XML
Lors de lappuie sur le bouton menu du telephone, la mthode onCreateOptionsMenu(Menu menu) est
invoque dans lobjectif dassocier un menu xml lobjet menu pass en paramtre.
Comme le LayoutInflater gonflait les layouts dfini en xml, le MenuInflater gonfle les menus dfinis
en xml. On effectue lassociation comme suit :
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.sudoku_menu, menu);
return true;
}

Gestion des vnements lis aux menu


La mthode onOptionsItemSelected(MenuItem item) de lactivit o est cre le menu est invoqu
lorsquun lment est slectionn dans le menu apparu sur le tlphone. Il suffit de donner un code traitant tous les
items du menu (et des ventuels sous-menus) comme suit :
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_n1:
...
return true;
case R.id.menu_quitter:
this.finish();
return true;
}
}

Exercice
Complter le code pour quon puisse choisir entre trois niveaux et que cela charge trois grilles diffrentes correspondantes aux niveaux.
8

F IGURE 2.1 Barre daction

V.2

Une barre dactions


Une barre daction peut tre incluse dans toute application partir de Android 3.0 (API numro 11).

Mise en place
Le manifest doit prciser que lapplication vise ou la version minimum du sdk minSdkVersion, targetSdkVersion
et minSdkVersion est fixe 11 ou plus.
<manifest ... >
<uses-sdk android:minSdkVersion="4"
android:targetSdkVersion="11" />
...
</manifest>
Dans lexemple prcdent, on a une application qui est telle que chacune des ses activits embarque la barre par
dfaut donne la figure ci-dessus.
lorsquelle est excute sur un Android 3.0 au moins. Dans une excution sur un Android 2.3.X ou moins, la barre
daction est fixe en haut de lcran.
Masquer la barre
Pour supprimer statiquement la barre daction dans une activit particulire, on modifie le manifest comme suit :
<activity android:theme="@android:style/Theme.Holo.NoActionBar">
Pourle faire dynamiquement, on fait comme suit :
ActionBar actionBar = getActionBar();
// actionBar.hide();
// actionBar.show();

V.3

Particulariser la barre daction (ajouter un menu)

Pour intgrer un menu personnel dans une barre daction, on dclare que le menu est un item daction de la barre.
Pour cela il suffit de dfinir un menu en xml et de le gonfler comme la section Gonflage du menus dfini en XML .
Exercice
Complter le code pour quon puisse choisir entre trois niveaux et que cela charge trois grilles diffrentes correspondantes aux niveaux.

Chapitre 3

Cycle de vie dune activit


I Mthodes du cylce de vie
La figure 3.1 rsume le cycle de vie dune activit en montrant quelles mthodes sont appeles lors des vnement
quelle peut rencontrer.
1. onCreate : Cette mthode est tout dabord invoque lorsque lactivit est cree : Cest l quon associe la
vue, initialise ou rcupre les donnes persistantes. . . La mthode onCreate reoit toujours en paramtreun
objet Bundle qui contient ltat dans lequel tait lactivit avant linvocation.
2. onStart : Cette mthode est invoque avant que lactivit soit visible et Une fois que lexcution de cette
mthode est finie,
si lactivit apparat en premier plan, cest onResume qui est invoque
si lactivit ne peut apparatre en premier plan, cest onStop qui est invoque
3. onResume : Cette mthode est appele immdiatement avant que lactivit ne passe en Elle est appele soit
parce quelle vient dtre (re)lance, par exemple lorsquune autre activit a pris le devant puis a t ferme,
remettant votre activit en premier plan.
Cest souvent lendroit o lon reconstruit les interfaces en fonction de ce qui sest pass depuis que lutilisateur
la vue pour la dernire fois.
4. onPause : Lorsque lutilisateur est dtourn de votre acivit, en la passant en second plan, cest cette mthode
qui est invoque avant de pouvoir afficher la nouvelle activit en premier plan. Une fois cette mthode excute,
Android peut tuer tout moment lactivit sans vous redonner le contrle. Cest donc l quon arrte proprement
les services, threads,. . . et que lon sauvegarde les donnes utiles lactivit lorsquelle redmarera.
5. onStop : Cette mthode est invoque lorsque lactivit nest plus visible soit par ce quune autre est passe en
premier plan, soit parce quelle est en cours de destruction.

II

Exercice
Raliser le TP intitul Cycle de vie dune activit Android : Vie, pause et mort .

10

F IGURE 3.1 Cycle de vie dune activit android

11

Chapitre 4

Sauvegarder des donnes


Dans ce chapitre on voit comment sauvegarder des donnes dune application android : les prfrences (donnes
courtes), les fichiers (donnes plus volumineuses) et la serialisation (en binaire).

I Les prfrences
Android permet de mmoriser une information sous la forme dune paire (clef,valeur) et dy accder lors de
lexcution de lactivit ou du service. La valeur est de type primaire (boolen,flottant, entier, long ou chane de
caractres). Destine essentiellement pour sauvegarder les prfrences de lapplication, la mthode permet en fait de
stocker toute information pouvant se mettre sous la forme (clef,valeur).

I.1

Mthodes

On accde aux prfrences partages avec la mthode


getSharedPreferences(String nomFichier, int typeAcces)
o
typeAcces est le type daccs au fichier :
MODE_PRIVATE pour un accs interne lapplication,
MODE_WORLD_READABLE et
MODE_WORLD_WRITEABLE pour des accs universels en lecture et en criture
nomFichier est le nom du fichier lire. Sil nexiste pas, il sera cre lorsquon crira des donnes dedans
Notez que pour un nom de fichier donn, il ny a quune seule instance dobjet correspondant ce fichier. Cette
instance est partage par toutes les applications ventuellement.
Sur un objet de type SharedPreferences, on invoque la mthode edit() pour obtenir un flux en criture.
La mthode putBoolean(String clef, boolean valeur), permet dassocier une clef identifie par
une chane une valeur sous la forme dun boolen. On a aussi putString, putFloat, putInt et putLong de
mme signature et au comportement vident. Les mises jour ne sont rellement effectues quaprs invocation de la
mthode commit() sur le flux.
Pour rcuprer les donnes enregistres, sur un objet de type SharedPreferences, on invoque la mthode getBoolean(String clef, boolean vd) qui retourne la valeur boolenne associe la clef si elle
existe ou la valeur par dfaut vd si elle nexiste pas. On a aussi, getFloat(String clef, float vd),
getInt(String clef, int vd), getLong(String clef, boolean vd) pour les valeurs numriques
et getString(String clef, String vd) pour rcuprer une variable sous la forme dune chane de caractres.

I.2

Exercices
1. Dans quelle mthode de lactivit principale devrait se faire la sauvegarde des prfrences ?
2. Dans quelle mthode de lactivit principale devrait se faire une rcupration des paramtres utilisateurs ?

I.3

Travaux Pratiques
1. Dans la classe JeuxModel, crer la mthode grid2String() qui retourne la grille sous la forme dune
chane de 81 caractres numriques.
12

2. Dans la classe JeuxModel, crer la mthode string2grid(String r) qui affecte lattribut grid la
grille sous la forme dune chane de 81 caractres numriques passe en paramtres.
3. Modifier le code de lapplication pour que celle-ci sauvegarde ltat de la grille lorsquelle est est tue.
4. Modifier le code de lapplication pour que celle-ci recharge la dernire grille utilise lorsque le bouton continuer est appuy.

II

Les fichiers

En plus de supporter les classes usuelles Java dentre/sortie la bibliothque Android fournit les mthodes simplifies openFileInput et openFileOuput permettant de lire et dcrire aisment dans des fichiers. Lexemple
suivant rsume la situation :
try{
FileOutputStream fos = openFileOutput("tempfile.tmp", MODE_PRIVATE);
fos.write(new String("Hello World").getBytes());
fos.close();
String s = "";
FileInputStream fis = openFileInput("tempfile.tmp");
int b = fis.read();
while (b != -1){
s += new Character((char)b);
b = fis.read();
}
fis.close();
Toast.makeText (this,s,Toast.LENGTH_SHORT).show();
}catch(Exception e){
//
}

On note les contraintes suivantes :


On ne peut crer un fichier qu lintrieur du dossier de lapplication. Prciser un sparateur de dossier (\)
dans la mthode openFileOutput engendre en effet une exception.
Par contre dautres applications peuvent ventuellement le lire et le modifier. Si lon souhaite ceci, la permission
dclarer la cration sera MODE_WORLD_READABLE et MODE_WORLD_WRITEABLE respectivement.
Si le fichier tempfile.tmp nexiste pas, lappel la mthode openFileOutput le cre.

III

Le cloud

Cette partie est largement inspire des pages 214 224 du livre Android, guide de dveloppements dapplications
pour Smartphones et Tablettes de Sbastien PROCHON aux ditions ENI, juillet 2011.
Depuis la version 2.2 (API 8) Android permet de sauvegarder les donnes de lapplication sur un serveur de
Google. Pour un utilisateur ayant plusieurs appareils, la mme application a ses donnes cohrentes sur tous ces
appareils grce un processus de synchronisation en arrire plan avec les serveurs de Google.
Pour une utilisation en dehors de lmulateur les donnes sont associes au compte Google renseign dans lappareil. Lutilisateur doit avoir un compte Google identique sur tous ses appareils pour bnficier de ce service.
Le principe gnral est le suivant : lapplication communique avec le gestionnaire de sauvegarde des donnes
persistantes sur le serveur. Cest ce dernier qui se charge denvoyer les donnes dans le nuage et de les rcuprer au
lancement de lapplication, par exemple.

III.1 Hriter de la classe BackupAgentHelper


La mthode la plus simple consiste exploiter la classe BackupAgentHelper qui fournit une interface minimale pour synchroniser les donnes avec un serveur du cloud.

public class MonAgentDeSauvegarde extends BackupAgentHelper{


public void onCreate(){
SharedPreferencesBackupHelper assistantFichierPrefs = new SharedPreferencesBackupHelper(this,Sudoku.PREFS_NAME);
addHelper("clefPourAgent",assistantFichierPrefs);
}
}

13

Dans le code prcdent, on a construit un agent de sauvegarde, qui hrite de la classe BackupAgentHelper.
la cration, on comence par dfinir quel(s) fichier(s) doit(doivent) tre synchroniss dans le cloud. Ici cest un fichier
de prfrnce. La dmarche est semblable pour un fichier quelconque. Ensuite, on renseigne que cest cet assistant
qui va tre utilis pour la synchronisation.

III.2 Modifier le manifest pour toute lapplication


Pour bnficier de ce service Google, le dveloppeur doit tout dabord rserver un espace dans le cloud. Cela se
fait via la page suivante o doit tre renseign le nom du package.
http://code.google.com/intl/fr/android/backup/signup.html

Une fois enregistr, le dveloppeur reoit une clef, insrer dans llment application du manifest comme suit :
<application>
...
<meta-data android:name="com.google.android.backup.api_key"
android:value="your_backup_service_key" />
</application>

Enfin, llment application doit dfinir lattribut android:backupAgent pour prciser quelle est la classe
qui assure la gestion de la persistance des donnes avec le serveur de Google.
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:backupAgent=".MonAgentDeSauvegarde">

III.3 La demande de synchronisation


Pour faire une demande de sauvegarde, lapplication doit invoquer un objet de type BackupManager dans toute
activit necssitant la sauvegarde des prfrences.
BackupManager backupManager = new BackupManager(this);

Pour lui dire que les donnes ont chang, on insre le code suivant chaque fois que les donnes doivent tre
modifies.
this.backupManager.dataChanged();

III.4 valuer le dveloppement


On peut simuler une snario denregistrement dans le cloud dans une invite de commande comme suit :
adb
adb
adb
adb

shell bmgr enable true


shell bmgr backup your.package.name
shell bmgr run
uninstall your.package.name

Ici, successsivement
on active le service de sauvegarde (ligne 1 et 2)
puis on demande et on force lenregistrement (ligne 3)
enfin on supprime lapplication

III.5 Travaux pratiques


Reprendre le code Sudoku et enregistrer le niveau de difficult dans le cloud. Lorsquon rinstalle lapplication,
cest la dernire valeur sauvegarde qui est affiche.

14

Chapitre 5

Rcupration priodique de donnes grce un


service
I Organisation gnrale
Lapplication android est compose dune partie qui envoie la demande des messages courts et dune partie qui
publie les derniers messages envoys par tous les utilisateurs de lapplication.
Pratiquement, aucune donne nest sauvegarde par lapplication :
lorsque lutilisateur valide un message, celui-ci est envoy un serveur web qui mmorise le message dans une
base de donnes.
lors du lancement de lapplication, un service est activ. Celui-ci interroge rgulirement le serveur web pour
obtenir les derniers messages. Une fois ceux-ci rcuprs, il envoie une intention lOS android. Cette intention
est rcupre par lapplication qui met jour la liste des messages publis.

II

Lapplication web
Cette partie nest pas dtaille car sort du contexte du cours.

II.1 La basse de donnes


Pour les besoins de lexercice, on cre la base de donnes Mysql messagerieAndroid et la table messages
selon le script suivant :
CREATE TABLE I F NOT EXISTS m e s s a g e s (
i d i n t ( 1 1 ) NOT NULL AUTO_INCREMENT,
u t i l i s a t e u r v a r c h a r ( 2 5 6 ) NOT NULL,
t e x t v a r c h a r ( 2 5 6 ) NOT NULL,
date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ( i d )
) ENGINE=MyISAM DEFAULT CHARSET= l a t i n 1 AUTO_INCREMENT=2 ;

II.2 Les pages PHP


On construit 4 fichiers PHP sur le serveur :
conf.class.php : cest une classe dont les attributs statiques sont les paramtres de lapplication web ;
message.class.php : cest une classe qui est la version objet de la table messages ; elle fournit une
mthode dajout dun message et une mthode statique de lecture des cinq derniers messages ;
ajoutemsg.php : page PHP qui rceptionne les donnes envoyes par lapplication android et qui demande
linsertion du message dans la base ;
recupemsg.php : page PHP qui est interroge rgulirement par le service android, qui demande la rcupration des cinq derniers messages de la base et qui affiche ceci au format xml
Les Classes de lapplication web

On donne ci dessous le fichier message.class.php

15

<? php
i n c l u d e _ o n c e " c o n f . c l a s s . php " ;
c l a s s Message {
private $utilisateur ;
private $text ;
public function __construct ( $ u t i l i s a t e u r , $text ){
$ t h i s > u t i l i s a t e u r = $ u t i l i s a t e u r ;
$ t h i s > t e x t = $ t e x t ;
}
p u b l i c f i n a l s t a t i c f u n c t i o n cnx ( ) {
$ l i e n = m y s q l _ c o n n e c t ( Conf : : $ s e r v e r , Conf : : $ u s e r , Conf : : $passwd ) ;
$db = m y s q l _ s e l e c t _ d b ( Conf : : $ b a s e , $ l i e n ) ;
}
public function insere (){
Message : : cnx ( ) ;
$ q u e r y = " INSERT INTO m e s s a g e s ( i d , u t i l i s a t e u r , t e x t , d a t e )
VALUES (NULL, $ t h i s > u t i l i s a t e u r , $ t h i s > t e x t , CURRENT_TIMESTAMP) " ;
$ r e s u l t = mysql_query ( $query ) ;
mysql_free_result ( $result );
}
public final s t a t i c function recupere_cinq_derniers (){
Message : : cnx ( ) ;
$ q u e r y = "SELECT u t i l i s a t e u r , t e x t , d a t e FROM m e s s a g e s ORDER by d a t e DESC
LIMIT 5 " ;
$ r e s u l t = mysql_query ( $query ) ;
e c h o " <? xml v e r s i o n = \ " 1 . 0 \ " e n c o d i n g = \ "UTF8\ " ? > \ n " ;
w h i l e ( $row = m y s q l _ f e t c h _ a s s o c ( $ r e s u l t ) ) {
e c h o " <msg > \ n " ;
e c h o " < u t i l i s a t e u r > " . $row [ u t i l i s a t e u r ] . " </ u t i l i s a t e u r > \ n " ;
e c h o " < t e x t > " . $row [ t e x t ] . " </ t e x t > \ n " ;
e c h o " < d a t e > " . $row [ d a t e ] . " </ d a t e > \ n " ;
e c h o " </ msg > \ n " ;
}
mysql_free_result ( $result );
}
}
?>

et le fichier conf.class.php
<? php
c l a s s Conf {
public s t a t i c
public s t a t i c
public s t a t i c
public s t a t i c
}
?>

$ s e r v e r ="_" ;
$user ="_" ;
$passwd = " _ " ;
$base=" messagerieAndroid " ;

Les pages pour lAjout et la suppression de messages Le fichier ajoutemsg.php


<? php
i n c l u d e _ o n c e " m e s s a g e . c l a s s . php " ;
$msg = new Message ( $_GET [ u t i l i s a t e u r ] , $_GET [ t e x t ] ) ;
$msg> i n s e r e ( ) ;
?>

et le fichier recupemsg.php
<? php
i n c l u d e _ o n c e " m e s s a g e . c l a s s . php " ;
Message : : r e c u p e r e _ c i n q _ d e r n i e r s ( ) ;
?>

16

III

Lapplication Android

III.1 Vue organise laide donglets


Lorganisation dune interface utilisateur laide donglets facilite souvent la navigation entre les principales parties dune application. Pratiquement il suffit dutiliser llment <TabHost> dans le layout principal de lapplication
comme suit :
<? xml v e r s i o n = " 1 . 0 " e n c o d i n g = " u t f 8" ? >
< TabHost x m l n s : a n d r o i d = " h t t p : / / s c h e m a s . a n d r o i d . com / apk / r e s / a n d r o i d "
a n d r o i d : i d =" @android:id / t a b h o s t "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t ">
<LinearLayout a n d r o i d : o r i e n t a t i o n =" v e r t i c a l "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t ">
< TabWidget a n d r o i d : i d = " @ a n d r o i d : i d / t a b s "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content " / >
<FrameLayout a n d r o i d : i d =" @android:id / t a b c o n t e n t "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t ">
< L i n e a r L a y o u t a n d r o i d : i d = "@+ i d / t a b l i n e a r "
a n d r o i d : o r i e n t a t i o n =" v e r t i c a l "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t ">
< TextView a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t "
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content "
a n d r o i d : t e x t =" U t i l i s a t e u r : " / >
< E d i t T e x t a n d r o i d : i d = "@+ i d / e d t _ t x t _ u "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content " / >
< TextView a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t "
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content "
a n d r o i d : t e x t = " Message : " / >
< E d i t T e x t a n d r o i d : i d = "@+ i d / e d t _ t x t _ m "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content " / >
< B u t t o n a n d r o i d : i d = "@+ i d / b t n "
a n d r o i d : l a y o u t _ w i d t h =" wrap_content "
a n d r o i d : l a y o u t _ h e i g h t =" wrap_content "
a n d r o i d : t e x t =" V a l i d e r "
a n d r o i d : l a y o u t _ g r a v i t y =" c e n t e r _ h o r i z o n t a l " / >
</ LinearLayout>
< S c r o l l V i e w a n d r o i d : i d = "@+ i d / s c r l l "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t ">
< TextView a n d r o i d : i d = "@+ i d / w e b t x t "
a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t "
a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t " / >
< / ScrollView>
< / FrameLayout>
</ LinearLayout>
< / TabHost >

Les identifiants des lments TabHost, TabWidget et FrameLayout qui sont @android:id/tabhost,
@android:id/tabs et "@android:id/tabcontent respectivement ne doivent pas tre modifis.
Lactivit principale de lapplication est reprsente par des onglets, ceci se ralise en tendant la classe TabActivity.
De plus, comme elle coute le bouton de validation, elle implante linterface OnClickListener.
Comme dans toute activit, la mthode onCreate vise construire la vue lie lactivit. La vue avec onglets
est dfinie par un objet de type TabHost instanci directement par getTabHost() qui le lie llment du mme
nom identifi par @android:id/tabhost".
TabHost mTabHost = g e t T a b H o s t ( ) ;
TabSpec TabGSpec = mTabHost . newTabSpec ( " t a b _ m e s s a g e " ) ;
TabGSpec . s e t I n d i c a t o r ( "N . Message " , g e t R e s o u r c e s ( ) . g e t D r a w a b l e ( a n d r o i d . R . d r a w a b l e . i c _ m e n u _ a d d ) ) ;

17

TabGSpec . s e t C o n t e n t ( R . i d . t a b l i n e a r ) ;
TabSpec TabDSpec = mTabHost . newTabSpec ( " t a b _ c o n t r i b s " ) ;
TabDSpec . s e t I n d i c a t o r ( " C o n t r i b s " , g e t R e s o u r c e s ( ) . g e t D r a w a b l e ( a n d r o i d . R . d r a w a b l e . i c _ m e n u _ v i e w ) ) ;
TabDSpec . s e t C o n t e n t ( R . i d . w e b t x t ) ;
mTabHost . addTab ( TabGSpec ) ;
mTabHost . addTab ( TabDSpec ) ;
B u t t o n b o u t o n _ e n v o y e r = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b t n ) ;
bouton_envoyer . setOnClickListener ( t h i s ) ;

III.2 Lenvoi de messages


Il sagit ici dappeler une page php depuis lapplication android. Quatre classes suffisent pour remplir cet objectif.
Uri.Builder qui permet de construire mthodiquement lurl utiliser. Cette classe fournit pour cela les
mthodes
scheme(String scheme) : fixe le protocole (http, https. . . )
authority(String authority) : fixe ladresse de lurl
path(String path) : fixe le chemin jusqu la page atteindre
appendQueryParameter(String key, String value) : encode la clef et sa valeur.
build : construit lobjet correspondant lurl http://nom_serveur/ajoutemsg.php?utilisateur=
couchot&text=blabla
HttpGet : lurl passe en paramtres lors de la construction dun objet de ce type est amene tre utilise
avec la mthode GET.
DefaultHttpClient : cest un client HTTP dont lobjectif est dexcuter des requtes via la mthode
execute(HttpUriRequest request) qui excute la requte (par exemple lobjet de la classe HttpGet
donn plus haut). Cette mthode retourne une HttpResponse que lon peut analyser pour y dtecter des erreurs ventuelles.
Exercice
Dans la classe Messagerie :
1. construire la mthode envoie_msg(String utilisateur, String msg) qui envoie le message
identifi par la paire (utilisateur, msg) la page ajoutemsg.php hberge sur votre serveur ;
2. construire la mthode onClick qui invoque la mthode envoie_msg avec les paramtres rcuprs dans les
objets de la classe EditText ;
3. vrifier la correction du code en constatant que les messages ont bien t mmoriss dans votre base de donnes ;
4. essayer de faire de mme en sadressant la mme page stocke sur le serveur de votre voisin.

III.3 Le service de rception de messages


Le travail de rcupration des message se fait laide dun service indpendant qui priodiquement interroge la
page recupemsg.php et affiche son contenu.
Deux classes et trois tapes suffisent pour raliser ceci :
la classe RecupService qui tend Service, qui contient lobjet chrono (de la classe Timer) et la tche
raliser tmt (de la classe RecupTimerTask). Ces deux objets sont initialiss comme suit :
public void o n S t a r t ( I n t e n t i n t e n t , i n t s t a r t I d ) {
c h r o n o . s c h e d u l e A t F i x e d R a t e ( tmt , 0 , ( l o n g ) 1 0 0 0 0 ) ; }
public void onCreate ( ) {
c h r o n o = new Timer ( " chrono_maj_msg " ) ;
t m t = new RecupTimerTask ( t h i s ) ; }

la classe RecupTimerTask qui tend TimerTask. Sa mthode run() appele toutes les 10s dans lexemple invoque la mthode msg_maj() de la classe RecupService
dans la classe RecupService, la mthode msg_maj()
1. interroge la page recupemsg.php via un client DefaultHttpClient comme avant ;
18

2. rcupre la rponse via un gestionnaire de rponse BasicResponseHandler


3. construit une intention et lenvoie lOS Android comme suit :
I n t e n t i n t e n t = new I n t e n t ( " l i s t e de m e s s a g e " ) ;
i n t e n t . putExtra ( log , chaine ) ;
this . sendBroadcast ( i n t e n t ) ;

Exercice
Complter le dveloppement des deux classes dcrites ci-dessus et vrifier dans le dbugueur que les intentions
sont envoyes par le service.

III.4 Laffichage des messages


Pour capturer les intentions mises par le service, il suffit dans la classe Messagerie dinstancier un rcepteur de
la classe MsgRecepteur et de le dclarer comme receveur dintentions de la sorte "liste de message" comme suit :
t h i s . m s g r c p t = new M s g R e c e p t e u r ( t h i s ) ;
I n t e n t F i l t e r f i l t e r = new I n t e n t F i l t e r ( " l i s t e de m e s s a g e " ) ;
t h i s . r e g i s t e r R e c e i v e r ( t h i s . msgrcpt , f i l t e r ) ;

Ceci se fait dans la mthode onResume de la classe Messagerie. Dire pourquoi. Enfin le la classe MsgRecepteur
qui tend BroadcastReceiver doit dfinir la mthode onReceive(Context arg0, Intent arg1) :
celle-ci invoque uniquement la mthode msg_affichage_maj ( dfinir) de la classe Messagerie qui remplit
le texte de la textview.

19

Das könnte Ihnen auch gefallen