Académique Documents
Professionnel Documents
Culture Documents
Master CCI
Bertrand Estellon - DII - Aix-Marseille Université
1
Organisation de l'enseignement
Objec fs :
Connaître les différents composants d'une applica on Android
Savoir organiser une applica on
Savoir u liser une documenta on
Progresser en Java
Évalua on :
Seuls les TP seront évalués
Il est important de venir à tous les TP
Les notes sont individuelles
Vous devez donc travailler seul
2.1
Le projet
Un réveil :
2.2
Démo du projet
2:16
2.3
Les fonctionnalités du projet
Ajout d'une alarme
Modifica on de l'heure des alarmes
Ac va on/Désac va on d'une alarme
Suppression d'une alarme
No fica on de l'u lisa on
Sonnerie de l'alarme
Réveil de l'écran en cas de sonnerie
Possibilité d'arrêter l'alarme
2.4
Les outils pour développer sur Android
Nous devons u liser le SDK d'Android qui fournit :
les librairies Java d'Android
un émulateur pour tester vos applica ons
des images du système Android
Nous devons u liser Java donc il faut :
Maîtriser les concepts de la programma on objet
Savoir lire une documenta on Java
Nous devons u liser un IDE adapté, c'est‐à‐dire, Android Studio :
Première étape du TP, la configura on de l'IDE
Il est basé sur IntelliJ IDEA de Jet Brains
2.5
Android Studio
2.6
Android SDK
2.7
AVD Manager
2.8
Émulateur
2.9
Installation
5:20
2 . 10
Création d'une machine virtuelle
1:13
2 . 11
Création d'un projet
1:51
2 . 12
Les composants d'une application
Ac vités : les différents écrans de l'applica on
Services : un composant qui s'exécute en tâche de fond
Fournisseur de contenu : ges on et partage des données
Receveur de broadcasts : recep on de no fica ons
FireActivity
AlarmActivity
AlarmProvider
FireService
UpdateBroadcastReceiver
2 . 13
Sécurité dans le système Android
Chaque applica on est exécutée dans une sandbox (bac à sable) :
Android est système Linux mul ‐u lisateur
Chaque applica on est un u lisateur différent
Chaque fichier de l'applica on n'est accessible que par elle
Par défaut, chaque processus possède sa machine virtuelle
Chaque applica on a son propre processus Linux
2 . 14
Communication entre composants
Les ac vités, les services et les receveurs de broadcasts sont
ac vés par des messages asynchrones : les intents
I n t e n t i n t e n t = n e w I n t e n t ( c o n t e x t , F i r e S e r v i c e . c l a s s )
i n t e n t . s e t A c t i o n ( F i r e S e r v i c e . A C T I O N _ F I R E ) ;
Les fournisseurs de contenu sont ac vés par des requêtes
effectuées à l'aide d'un résolveur de contenu.
Une requête est composée :
d'une URI de la forme content://authority/path
d'une ac on query, delete, update ou insert
U r i u r i = U r i . p a r s e ( " c o n t e n t : / / f r . u n i v _ a m u . c c i . a l a r m / a l a r m s " ) ;
r e s o l v e r . i n s e r t ( u r i , v a l u e s ) ;
c u r s o r = r e s o l v e r . q u e r y ( u r i , n u l l , n u l l , n u l l , n u l l ) ;
2 . 15
Quelques classes d'Android
Cursor
Intent
Activity
ContentProvider
Service
BroadcastReceiver
ContentResolver
View
2 . 16
Structure d'un projet
Manifeste
Code Java
Ressources
Scripts de compilation
2 . 17
Manifeste d'une application
< m a n i f e s 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 . c o m / a p k / r e s / a n d r o i d "
p a c k a g e = " c o m . u n i v _ a m u . c c i . c o m . a l a r m " >
< u s e s - p e r m i s s i o n a n d r o i d : n a m e = " a n d r o i d . p e r m i s s i o n . R E C E I V E _ B O O T _ C O M P L E T E D " / >
< a p p l i c a t i o n a n d r o i d : i c o n = " @ m i p m a p / i c _ l a u n c h e r "
a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " >
< a c t i v i t y a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . v i e w s . A l a r m A c t i v i t y " >
< i n t e n t - f i l t e r >
< 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 . M A I N " / >
< 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 . L A U N C H E R " / >
< / i n t e n t - f i l t e r >
< / a c t i v i t y >
< p r o v i d e r a n d r o i d : a u t h o r i t i e s = " c o m . u n i v _ a m u . c c i . a l a r m "
a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . m o d e l . A l a r m P r o v i d e r " / >
< s e r v i c e a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . s e r v i c e . F i r e S e r v i c e " / >
< r e c e i v e r
a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . s e r v i c e . U p d a t e B r o a d c a s t R e c e i v e r " >
< i n t e n t - f i l t e r >
< 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 . B O O T _ C O M P L E T E D " / >
< / i n t e n t - f i l t e r >
< / r e c e i v e r >
< / a p p l i c a t i o n >
< / m a n i f e s t >
2 . 18
Une activité :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ;
T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ;
t e x t . s e t T e x t ( " H e l l o W o r l d ! " ) ;
l a y o u t . a d d V i e w ( t e x t ) ;
s e t C o n t e n t V i e w ( l a y o u t ) ;
}
}
3.1
Déclaration de l'activité dans le manifeste
< m a n i f e s 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 . c o m / a p k / r e s / a n d r o i d "
p a c k a g e = " c o m . c c i . c a l c u l a t o r " >
< a p p l i c a t i o n
a n d r o i d : a l l o w B a c k u p = " t r u e "
a n d r o i d : i c o n = " @ d r a w a b l e / i c _ l a u n c h e r "
a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e "
a n d r o i d : t h e m e = " @ s t y l e / A p p T h e m e " >
< a c t i v i t y
a n d r o i d : n a m e = " . M a i n 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 / a p p _ n a m e " >
< i n t e n t - f i l t e r >
< 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 . M A I N " / >
< 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 . L A U N C H E R " / >
< / i n t e n t - f i l t e r >
< / a c t i v i t y >
< / a p p l i c a t i o n >
< / m a n i f e s t >
3.2
Le résultat :
3.3
Cycle de vie d'une activité :
Aucune méthode main dans un programme Android
Android exécute le code d'une ac vité en appelant des callbacks
Ces callbacks correspondent aux phrases de la vie d'une ac vité
Il n'est pas nécessaire d'implémenter toutes les callbacks
3.4
États durables d'une activité
Resumed
L'ac vité est au premier plan et l'u lisateur peut interagir avec elle
On dit aussi qu'elle est en train d'être exécutée
Paused
L'ac vité est par ellement recouverte par une autre ac vité qui se
trouve au premier plan
L'ac vité en pause ne peut pas recevoir d'ac on de l'u lisateur
Stopped
L'ac vité est totalement cachée et ne peut plus exécutée de code
Toutes ses informa ons sont conservées
3.5
États transitoires d'une activité
Created
L'ac vité vient d'être créée.
Started
L'ac vité vient de devenir visible.
3.6
Les callbacks
p u b l i c c l a s s E x a m p l e A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { / * . . . * / }
@ O v e r r i d e
p r o t e c t e d v o i d o n S t a r t ( ) { / * . . . * / }
@ O v e r r i d e
p r o t e c t e d v o i d o n R e s u m e ( ) { / * . . . * / }
@ O v e r r i d e
p r o t e c t e d v o i d o n P a u s e ( ) { / * . . . . * / }
@ O v e r r i d e
p r o t e c t e d v o i d o n S t o p ( ) { / * . . . * / }
@ O v e r r i d e
p r o t e c t e d v o i d o n D e s t r o y ( ) { / * . . . * / }
}
3.7
Cycle de vie des activités
3.8
Mise en pause et reprise de l'activité
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ;
o p e n C a m e r a ( ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n P a u s e ( ) {
s u p e r . o n P a u s e ( ) ;
r e a l e a s e C a m e r a ( ) ;
}
3.9
Sauvegarde de l'état de l'application
L'applica on est détruite dans les états rouges :
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
L i n e a r L a y o u t l a y o u t = n e w L i n e a r L a y o u t ( t h i s ) ;
b u t t o n = n e w B u t t o n ( t h i s ) ;
b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w O n C l i c k L i s t e n e r ( ) ) ;
u p d a t e B u t t o n L a b e l ( ) ;
l a y o u t . a d d V i e w ( b u t t o n ) ;
s e t C o n t e n t V i e w ( l a y o u t ) ;
}
p u b l i c v o i d u p d a t e B u t t o n L a b e l ( ) { b u t t o n . s e t T e x t ( " " + v a l u e ) ; }
p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( V i e w v ) { v a l u e + + ; u p d a t e B u t t o n L a b e l ( ) ; }
}
}
3 . 11
Sauvegarde de l'état de l'application
3 . 12
Sauvegarde de l'état de l'application
3 . 13
Sauvegarde de l'état de l'application
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
/ * . . . * /
@ O v e r r i d e
p r o t e c t e d
v o i d o n R e s t o r e I n s t a n c e S t a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . o n R e s t o r e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ;
v a l u e = s a v e d I n s t a n c e S t a t e . g e t I n t ( " v a l u e " ) ;
u p d a t e B u t t o n L a b e l ( ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n S a v e I n s t a n c e S t a t e ( B u n d l e o u t S t a t e ) {
s u p e r . o n S a v e I n s t a n c e S t a t e ( o u t S t a t e ) ;
o u t S t a t e . p u t I n t ( " v a l u e " , v a l u e ) ;
}
}
3 . 14
Les Bundles
Les Bundles peuvent associer des chaînes de caractères à des :
des types simples : en ers, flo ants, caractères...
des chaînes de caractères
des tableaux et des listes
des objets Parcelable
Quelques remarques :
Un Bundle est Parcelable
Un objet Parcelable peut être écrit dans un objet Parcel
Un Parcel est un conteneur pour un message
3 . 15
Quelques méthodes de la classe Bundle
putInt(String key, int value)
Dans ce e exemple :
RelativeLayout étend ViewGroup
ViewGroup étend View
TextView étend View
4.2
Les classes View et ViewGroup
Une vue est une classe qui étend View
Une vue peut être dessinée à l'écran
Un groupe de vue étend ViewGroup et donc View
Un groupe de vues peut contenir d'autres vues
Un groupe de vues organise l'affichage des vues qu'il con ent
setContentView de Activity pour préciser la vue à afficher
4.3
Hiérarchie des vues
4.4
Construction d'une vue en Java
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
R e l a t i v e L a y o u t r e l a t i v e L a y o u t = c r e a t e R e l a t i v e L a y o u t ( ) ;
s e t C o n t e n t V i e w ( r e l a t i v e L a y o u t ) ;
}
p r i v a t e R e l a t i v e L a y o u t c r e a t e R e l a t i v e L a y o u t ( ) {
R e l a t i v e L a y o u t r e l a t i v e L a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ;
r e l a t i v e L a y o u t . s e t P a d d i n g ( 1 6 , 1 6 , 1 6 , 1 6 ) ;
r e l a t i v e L a y o u t . a d d V i e w ( c r e a t e V e r t i c a l L a y o u t ( ) ) ;
r e t u r n r e l a t i v e L a y o u t ;
}
p r i v a t e L i n e a r L a y o u t c r e a t e V e r t i c a l L a y o u t ( ) {
L i n e a r L a y o u t v e r t i c a l L a y o u t = n e w L i n e a r L a y o u t ( t h i s ) ;
v e r t i c a 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 . V E R T I C A L ) ;
v e r t i c a l L a y o u t . s e t L a y o u t P a r a m s (
n e w R e l a t i v
s ( V i e L a y o u t . L a y o u t P a r a m e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T ,
V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T ) ) ;
v e r t i c a l L a y o u t . a d d V i e w ( c r e a t e T e x t V i e w ( ) ) ;
v e r t i c a l L a y o u t . a d d V i e w ( c r e a t e H o r i z o n t a l L a y o u t ( ) ) ;
r e t u r n v e r t i c a l L a y o u t ;
}
}
4.5
Construction d'une vue en Java
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
/ * . . . * /
p r i v a t e T e x t V i e w c r e a t e T e x t V i e w ( ) {
T e x t V i e w t e x t V i e w = n e w T e x t V i e w ( t h i s ) ;
t e x t V i e w . s e t L a y o u t P a r a m s ( n e w L i n e a r L a y o u t . L a y o u t P a r a m s (
V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , 0 , 1 . 0 f ) ) ;
t e x t V i e w . s e t G r a v i t y ( G r a v i t y . C E N T E R ) ;
t e x t V i e w . s e t T e x t S i z e ( 5 0 ) ;
t e x t V i e w . s e t T e x t ( " T e x t V i e w " ) ;
r e t u r n t e x t V i e w ;
}
p r i v a t e L
i n e a r L a y o u t c r e a t e H o r i z o n t a l L a y o u t ( ) {
L i n e a r L
a y o u t h o r i z o n t a l L a y o u t = n e w L i n e a r L a y o u t ( t h i s ) ;
h o r i z o n
t a 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 . H O R I Z O N T A L ) ;
h o r i z o n
t a l L a y o u t . s e t L a y o u t P a r a m s (
n e w L
i n e a r L a y o u t . L a y o u t P a r a m s (
V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , 0 , 1 . 0 f ) ) ;
h o r i z o n t a l L a y o u t . a d d V i e w ( c r e a t e B u t t o n ( ) ) ;
h o r i z o n t a l L a y o u t . a d d V i e w ( c r e a t e B u t t o n ( ) ) ;
r e t u r n h o r i z o n t a l L a y o u t ;
}
4.6
Construction d'une vue en Java
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
/ * . . . * /
p r i v a t e B u
t t o n c r e a t e B u t t o n ( ) {
B u t t o n b
u t t o n = n e w B u t t o n ( t h i s ) ;
b u t t o n . s
e t L a y o u t P a r a m s ( n e w L i n e a r L a y o u t . L a y o u t P a r a m s (
0 , V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , 1 . 0 f ) ) ;
b u t t o n . s e t T e x t ( " B u t t o n " ) ;
r e t u r n b u t t o n ;
}
4.7
Les évènements
On ajoute des écouteurs aux vues pour écouter les évènements :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p u b l i c i n t c o u n t = 0 ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ;
b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w M y O n C l i c k L i s t e n e r ( t h i s ) ) ;
s e t C o n t e n t V i e w ( b u t t o n ) ;
}
}
4.8
Les écouteurs
La méthode setOnClickListener prend en paramètre un objet qui
implémente l'interface View.OnClickListener :
p u b l i c i n t e r f a c e O n C l i c k L i s t e n e r {
v o i d o n C l i c k ( V i e w v i e w ) ;
}
Une interface est associée à chaque type d'évènements
On observe les évènements en connectant des listeners
Pour cela, on u lise les méthodes setOn*Listener
Ensuite, un évènement entraîne l'appel d'une méthode de
l'interface sur l'objet que vous avez connecté à la vue
4.9
Implémentation avec une classe classique
c l a s s M y O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r {
p r i v a t e M a i n A c t i v i t y m a i n A c t i v i t y ;
p u b l i c M y O n C l i c k L i s t e n e r ( M a i n A c t i v i t y m a i n A c t i v i t y ) {
t h i s . m a i n A c t i v i t y = m a i n A c t i v i t y ;
}
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( V i e w v ) {
m a i n A c t i v i t y . c o u n t + + ;
}
}
4 . 10
Implémentation avec une classe interne
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p u b l i c i n t c o u n t = 0 ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
/ * . . . * /
b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w M y O n C l i c k L i s t e n e r ( ) ) ;
/ * . . . * /
}
c l a s s M y O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( V i e w v ) { c o u n t + + ; }
}
}
4 . 11
Implémentation avec une classe anonyme
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p u b l i c i n t c o u n t = 0 ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ;
b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w V i e w . O n C l i c k L i s t e n e r ( ) {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( V i e w v ) { c o u n t + + ; }
} ) ;
s e t C o n t e n t V i e w ( b u t t o n ) ;
}
}
4 . 12
Les ressources
elles sont en dehors du code et con ennent
les images
les chaînes de caractères
les modèles d'interfaces u lisateur
les anima ons...
elles sont choisies en fonc on de la configura on :
taille de l'écran
orienta on de l'écran
langue...
de maintenir ces éléments sans connaître Java.
5.1
Les ressources
Elles sont dans les sous‐répertoires du répertoire res
5.2
La classe R
Elle est génèrée automa quement par Android
Elle permet de désigner les ressources dans le code Java
Par exemple, activity_main.xml = R.layout.activity_main
5.3
Les layouts
La méthode setContentView peut prendre l'iden fiant d'un layout :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
}
}
Le contenu du fichier activity_main.xml :
< R e l a t i v e L a y o u t
x m l n s : a n d r o i d = " . . . "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " >
< T
e x t V i e w
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 = " w r a p _ c o n t e n t "
a n d r o i d : t e x t S i z e = " 1 0 0 d p "
a n d r o i d : t e x t = " H e l l o W o r l d ! " / >
< / R e l a t i v e L a y o u t >
5.4
Les layouts
Le contenu du fichier activity_main.xml :
< R e l a t i v e L a y o u t
x m l n s : a n d r o i d = " . . . "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " >
< T
e x t V i e w
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 = " w r a p _ c o n t e n t "
a n d r o i d : t e x t S i z e = " 1 0 0 d p "
a n d r o i d : t e x t = " H e l l o W o r l d ! " / >
< / R e l a t i v e L a y o u t >
5.5
Les chaînes de caractères
Pour faciliter la traduc on des applica ons, il est préférable d'u liser
des références à des chaînes de caractères dans les programmes ou
les layouts :
< R e l a t i v e L a y o u t
x m l n s : a n d r o i d = " . . . "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " >
< T e x t V i e w
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 = " w r a p _ c o n t e n t "
a n d r o i d : t e x t = " @ s t r i n g / h e l l o _ w o r l d " / >
< / R e l a t i v e L a y o u t >
5.6
Les chaînes de caractères
Elles se trouvent dans le fichier strings.xml :
< r e s o u r c e s >
< s t r i n g n a m e = " h e l l o _ w o r l d " > H e l l o w o r l d ! < / s t r i n g >
< / r e s o u r c e s >
Pour accéder aux chaînes de caractères en XML :
< R e l a t i v e L a y o u t . . . >
< T e x t V i e w . . .
a n d r o i d : t e x t = " @ s t r i n g / h e l l o _ w o r l d " / >
< / R e l a t i v e L a y o u t >
5.7
Les chaînes de caractères
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ;
T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ;
C o n t e x t c o n t e x t = t h i s ;
t e x t . s e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ;
/ * S t r i n g h e l l o W o r l d =
c o n t e x t . g e t R e s o u r c e s ( ) . g e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ;
t e x t . s e t T e x t ( h e l l o W o r l d ) ; * /
l a y o u t . a d d V i e w ( t e x t ) ;
s e t C o n t e n t V i e w ( l a y o u t ) ;
}
}
5.8
Les références
Syntaxe pour désigner une ressource dans un document XML
@ [ < p a c k a g e _ n a m e > : ] < r e s o u r c e _ t y p e > / < r e s o u r c e _ n a m e >
où
<package_name> est le nom du paquet
<resource_type> est le type de la ressource
<resource_name> est
le nom du fichier qui con ent la ressource
ou la valeur de l'a ribut android:name d'un élément XML
< I m a g e V i e w
a n d r o i d : c o n t e n t D e s c r i p t i o n = " @ a n d r o i d : s t r i n g / o k "
a n d r o i d : s r c = " @ d r a w a b l e / i c _ l a u n c h e r " / >
5.9
Les dimensions
< R e l a t i v e L a y o u t x m l n s : a n d r o i d = " . . . "
x m l n s : t o o l s = " h t t p : / / s c h e m a s . a n d r o i d . c o m / t o o l s "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t "
a n d r o i d : p a d d i n g L e f t = " @ d i m e n / a c t i v i t y _ h o r i z o n t a l _ m a r g i n "
a n d r o i d : p a d d i n g R i g h t = " @ d i m e n / a c t i v i t y _ h o r i z o n t a l _ m a r g i n "
a n d r o i d : p a d d i n g T o p = " @ d i m e n / a c t i v i t y _ v e r t i c a l _ m a r g i n "
a n d r o i d : p a d d i n g B o t t o m = " @ d i m e n / a c t i v i t y _ v e r t i c a l _ m a r g i n " >
< / R e l a t i v e L a y o u t >
Les dimensions sont définies dans le fichier dimens.xml :
< r e s o u r c e s >
< d i m e n n a m e = " a c t i v i t y _ h o r i z o n t a l _ m a r g i n " > 1 6 d p < / d i m e n >
< d i m e n n a m e = " a c t i v i t y _ v e r t i c a l _ m a r g i n " > 1 6 d p < / d i m e n >
< / r e s o u r c e s >
Il est également possible d'accéder aux dimensions en Java :
f l o a t d i m e n s i o n = g e t R e s o u r c e s ( ) . g e t D i m e n s i o n (
R . d i m e n . a c t i v i t y _ h o r i z o n t a l _ m a r g i n ) ;
5 . 10
Prise en charge des différentes configurations
Il est possible de définir des ressources en fonc on de :
l'orienta on du terminal
la résolu on
la taille de l'écran
la version de l'API
de la langue, etc.
Par exemple :
values/dimens.xml : dimensions par défaut
values-w820dp/dimens.xml : dim. pour des écrans de 820p
layout : les layouts par défaut
layout-land : les versions paysage des layouts
values-fr/strings.xml : chaînes en français
5 . 11
Les images
Il est possible de stocker des images dans les ressources
Les images peuvent être stockées sous différentes résolu ons
La résolu on est choisie en fonc on du terminal de l'u lisateur
5 . 12
Les images
< I m a g e B u t t o n
a n d r o i d : i d = " @ + i d / b u t t o n "
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 = " w r a p _ c o n t e n t "
a n d r o i d : c o n t e n t D e s c r i p t i o n = " @ s t r i n g / c o u n t "
a n d r o i d : s r c = " @ d r a w a b l e / i c _ l a u n c h e r "
a n d r o i d : o n C l i c k = " c o u n t " / >
5 . 13
Les images
On désigne une image par son iden fiant :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
g e t W i n d o w ( ) . s e t B a c k g r o u n d D r a w a b l e R e s o u r c e (
R . d r a w a b l e . i c _ l a u n c h e r ) ;
I m a g e V i e w i m a g e = ( I m a g e V i e w ) f i n d V i e w B y I d ( R . i d . i m a g e ) ;
i m a g e . s e t I m a g e R e s o u r c e ( R . d r a w a b l e . i c _ l a u n c h e r ) ;
}
5 . 14
Les images
un Drawable décrit par un fichier XML :
< r i p p l e x m l n s : a n d r o i d = " . . . "
a n d r o i d : c o l o r = " ? a n d r o i d : c o l o r C o n t r o l H i g h l i g h t " >
< i t e m >
< sh a p e a n d r o i d : s h a p e = " o v a l " >
< s o l i d a n d r o i d : c o l o r = " ? a n d r o i d : c o l o r A c c e n t " / >
< / s h a p e >
< / i t e m >
< / r i p p l e >
qui change avec l'état de l'élément sur lequel il est u lisé :
< s e l e c t o r x m l n s : a n d r o i d = " . . . " >
< i t e m
a n d r o i d : s t a t e _ s e l e c t e d = " t r u e "
a n d r o i d : d r a w a b l e = " @ d r a w a b l e / s e l e c t e d _ n o t e _ b a c k g r o u n d " / >
< i t e m
a n d r o i d : d r a w a b l e = " @ d r a w a b l e / n o r m a l _ n o t e _ b a c k g r o u n d " / >
< / s e l e c t o r >
5 . 15
Les couleurs
Contenu du fichier res/color/button_text.xml :
< s e l e c t o r
x m l n s : a n d r o i d = " . . . " >
< i t e m a n d r o i d : s t a t e _ p r e s s e d = " t r u e "
a n d r o i d : c o l o r = " # f f f f 0 0 0 0 " / > < ! - - p r e s s e d - - >
< i t e m a n d r o i d : s t a t e _ f o c u s e d = " t r u e "
a n d r o i d : c o l o r = " # f f 0 0 0 0 f f " / > < ! - - f o c u s e d - - >
< i t e m a n d r o i d : c o l o r = " # f f 0 0 0 0 0 0 " / > < ! - - d e f a u l t - - >
< / s e l e c t o r >
5 . 16
Les animations
< s e l e c t o r 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 . c o m / a p k / r e s / a n d r o i d " >
< i t e m a n d r o i d : s t a t e _ p r e s s e d = " t r u e " >
< o b j e c t A n i m a t o r
a n d r o i d : p r o p e r t y N a m e = " t r a n s l a t i o n Z "
a n d r o i d : d u r a t i o n = " @ a n d r o i d : i n t e g e r / c o n f i g _ s h o r t A n i m T i m e "
a n d r o i d : v a l u e F r o m = " @ d i m e n / e l e v a t i o n _ l o w "
a n d r o i d : v a l u e T o = " @ d i m e n / e l e v a t i o n _ h i g h "
a n d r o i d : v a l u e T y p e = " f l o a t T y p e " / >
< / i t e m >
< i t e m >
< o b j e c t A n i m a t o r
a n d r o i d : p r o p e r t y N a m e = " t r a n s l a t i o n Z "
a n d r o i d : d u r a t i o n = " @ a n d r o i d : i n t e g e r / c o n f i g _ s h o r t A n i m T i m e "
a n d r o i d : v a l u e F r o m = " @ d i m e n / e l e v a t i o n _ h i g h "
a n d r o i d : v a l u e T o = " @ d i m e n / e l e v a t i o n _ l o w "
a n d r o i d : v a l u e T y p e = " f l o a t T y p e " / >
< / i t e m >
< / s e l e c t o r >
5 . 17
Les styles
Défini on d'un style à par r d'un autre style :
< r e s o u r c e s >
< s t y l e n a m e = " A p p T h e m e "
p a r e n t = " a n d r o i d : T h e m e . M a t e r i a l . L i g h t . D a r k A c t i o n B a r " >
< i t e m n a m e = " a n d r o i d : c o l o r P r i m a r y " >
@ a n d r o i d : c o l o r / h o l o _ b l u e _ l i g h t
< / i t e m >
< i t e m n a m e = " a n d r o i d : c o l o r P r i m a r y D a r k " >
@ a n d r o i d : c o l o r / h o l o _ b l u e _ d a r k
< / i t e m >
< i t e m n a m e = " a n d r o i d : t e x t C o l o r " >
@ a n d r o i d : c o l o r / b l a c k
< / i t e m >
< ! - - . . . - - >
< / s t y l e >
< / r e s o u r c e s >
5 . 18
Les styles
U lisa on du style dans le manifeste de l'applica on :
< m a n i f e s 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 . c o m / a p k / r e s / a n d r o i d "
p a c k a g e = " c o m . u n i v _ a m u . c c i . n o t e s " >
< a p p l i c a t i o n
a n d r o i d : a l l o w B a c k u p = " t r u e "
a n d r o i d : i c o n = " @ d r a w a b l e / i c _ l a u n c h e r "
a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e "
a n d r o i d : t h e m e = " @ s t y l e / A p p T h e m e " >
< a c t i v i t y
a n d r o i d : n a m e = " . M a i n 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 / a p p _ n a m e " >
< i n t e n t - f i l t e r >
< 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 . M A I N " / >
< 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 . L A U N C H E R " / >
< / i n t e n t - f i l t e r >
< / a c t i v i t y >
< / a p p l i c a t i o n >
< / m a n i f e s t >
5 . 19
Les identifiants
Associa on des iden fiants aux membres d'un layout :
< R e l a t i v e 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 . c o m / a p k / r e s / a n d r o i d "
a n d r
o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " >
< T e x
t V i e w
a n d r o i d : i d = " @ + i d / t e x t "
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 = " w r a p _ c o n t e n t "
a n d r o i d : t e x t = " @ s t r i n g / h e l l o _ w o r l d " / >
< / R e l a t i v e L a y o u t >
Accès aux éléments d'un layout avec son iden fiant :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
T e x t V i e w t e x t = ( T e x t V i e w ) f i n d V i e w B y I d ( R . i d . t e x t ) ;
t e x t . s e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ;
}
}
5 . 20
Les fragments
Un fragment :
Une ac vité :
peut afficher plusieurs fragments
peut u liser une pile pour gérer la naviga on entre fragments
6.1
Une application avec deux fragments
6.2
Premier layout : le formulaire
Le layout correspondant au formulaire du premier écran :
< L i n e a r L a y o u t x m l n s : a n d r o i d = " . . . " >
< E d i t T e x t
a n d r o i d : i d = " @ + i d / e d i t T e x t 1 "
a n d r o i d : i n p u t T y p e = " n u m b e r " / >
< T e x t V i e w a n d r o i d : t e x t = " @ s t r i n g / p l u s " / >
< E d i t T e x t
a n d r o i d : i d = " @ + i d / e d i t T e x t 2 "
a n d r o i d : i n p u t T y p e = " n u m b e r " / >
< B u t t o n
a n d r o i d : i d = " @ + i d / b u t t o n "
a n d r o i d : t e x t = " @ s t r i n g / e q u a l s " / >
< / L i n e a r L a y o u t >
6.3
Deuxième layout : le resultat
< T e x t V i e w x m l n s : a n d r o i d = " . . . "
x m l n s : t o o l s = " . . . "
a n d r o i d : i d = " @ + i d / t e x t V i e w "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t "
a n d r o i d : g r a v i t y = " c e n t e r "
a n d r o i d : t e x t S i z e = " 1 0 0 d p "
a n d r o i d : t e x t = " + " / >
6.4
Le layout de l'activité principale
Le layout de l'ac vité principale :
< F r a m e L a y o u t x m l n s : a n d r o i d = " . . . "
x m l n s : t o o l s = " . . . "
a n d r o i d : i d = " @ + i d / c o n t a i n e r "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " / >
Le code de l'ac vité principale :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
i f ( s a v e d I n s t a n c e S t a t e = = n u l l ) {
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. a d d ( R . i d . c o n t a i n e r , n e w F o r m F r a g m e n t ( ) )
. c o m m i t ( ) ;
}
}
}
6.5
Création de la vue dans le premier fragment
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t {
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r ,
V i e w G r o u p c o n t a i n e r ,
B u n d l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ f o r m ,
c o n t a i n e r ,
f a l s e ) ;
r e t u r n v i e w ;
}
}
6.6
Cycle de vie d'un fragment
6.7
Notification entre le fragment et l'activité
Interface pour rendre le fragment réu lisable :
p u b l i c i n t e r f a c e F o r m F r a g m e n t L i s t e n e r {
v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) ;
}
6.8
Notification entre le fragment et l'activité
Nous conservons la référence de l'ac vité :
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ;
@ O v e r r i d e
p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) {
s u p e r . o n A t t a c h ( a c t i v i t y ) ;
t r y {
l i s t e n e r = ( F o r m F r a g m e n t L i s t e n e r ) a c t i v i t y ;
} c a t c h ( C l a s s C a s t E x c e p t i o n e ) {
t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( )
+ " m u s t i m p l e m e n t F o r m F r a g m e n t L i s t e n e r " ) ;
}
}
}
6.9
Notification entre le fragment et l'activité
Nous faisons en sorte d'écouter les clics sur le bouton :
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e E d i t T e x t e d i t T e x t 1 , e d i t T e x t 2 ;
p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ;
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r ,
V i e w G r o u p c o n t a i n e r ,
B u n d l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ f o r m ,
c o n t a i n e r , f a l s e ) ;
e d i t T e x t 1 = ( E d i t T e x t ) v i e w . f i n d V i e w B y I d ( R . i d . e d i t T e x t 1 ) ;
e d i t T e x t 2 = ( E d i t T e x t ) v i e w . f i n d V i e w B y I d ( R . i d . e d i t T e x t 2 ) ;
B u t t o n b u t t o n = ( B u t t o n ) v i e w . f i n d V i e w B y I d ( R . i d . b u t t o n ) ;
b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w O n C l i c k L i s t e n e r ( ) ) ;
r e t u r n v i e w ;
}
}
6 . 10
Notification entre le fragment et l'activité
Nous no fions l'ac vité si un clic se produit :
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e E d i t T e x t e d i t T e x t 1 , e d i t T e x t 2 ;
p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ;
p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( V i e w v ) {
d o u b l e v a l u e 1 = D o u b l e . p a r s e D o u b l e ( e d i t T e x t 1 . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
d o u b l e v a l u e 2 = D o u b l e . p a r s e D o u b l e ( e d i t T e x t 2 . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
l i s t e n e r . o n E q u a l s ( v a l u e 1 , v a l u e 2 ) ;
}
}
}
6 . 11
Notification entre le fragment et l'activité
Récep on de la no fica on par l'ac vité :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
i f ( s a v e d I n s t a n c e S t a t e = = n u l l ) {
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. a d d ( R . i d . c o n t a i n e r , n e w F o r m F r a g m e n t ( ) )
. c o m m i t ( ) ;
}
}
@ O v e r r i d e
p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) {
/ * T O D O : a f f i c h e r l e r é s u l t a t * /
}
}
6 . 12
Le deuxième fragment
p u b l i c c l a s s R e s u l t F r a g m e n t e x t e n d s F r a g m e n t {
p u b l i c s t a t i c R e s u l t F r a g m e n t g e t I n s t a n c e ( d o u b l e v a l u e ) {
R e s u l t F r a g m e n t f r a g m e n t = n e w R e s u l t F r a g m e n t ( ) ;
B u n d l e b u n d l e = n e w B u n d l e ( ) ;
b u n d l e . p u t D o u b l e ( " v a l u e " , v a l u e ) ;
f r a g m e n t . s e t A r g u m e n t s ( b u n d l e ) ;
r e t u r n f r a g m e n t ;
}
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r , V i e w G r o u p c o n t a i n e r ,
B u n d l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ r e s u l t ,
c o n t a i n e r , f a l s e ) ;
T e x t V i e w t e x t V i e w = ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t e x t V i e w ) ;
t e x t V i e w . s e t T e x t ( " " + v a l u e ( ) ) ;
r e t u r n v i e w ;
}
p u b l i c d o u b l e v a l u e ( ) {
r e t u r n g e t A r g u m e n t s ( ) . g e t D o u b l e ( " v a l u e " ) ;
}
}
6 . 13
Affichage du deuxième fragment par l'activité
p u b l i c c l a s s R e s u l t F r a g m e n t e x t e n d s F r a g m e n t
i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) {
d o u b l e v a l u e = v a l u e 1 + v a l u e 2 ;
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. r e p l a c e ( R . i d . c o n t a i n e r ,
R e s u l t F r a g m e n t . g e t I n s t a n c e ( v a l u e ) )
. a d d T o B a c k S t a c k ( " r e s u l t " )
. c o m m i t ( ) ;
}
6 . 14
Affichage de deux fragments par l'activité
6 . 15
Affichage de deux fragments par l'activité
Le layout de l'ac vité par défaut :
< L i n e a r L a y o u t x m l n s : a n d r o i d = " . . . "
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 = " m a t c h _ 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 = " m a t c h _ p a r e n t " >
< f
r a g m e n t c l a s s = " c o m . u n i v _ a m u . c c i . m y a p p l i c a t i o n . F o r m F r a g m e n t "
a n d r o i d : i d = " @ + i d / f o r m "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " w r a p _ c o n t e n t " / >
< F r a m e L a y o u t a n d r o i d : i d = " @ + i d / c o n t a i n e r "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " w r a p _ c o n t e n t "
a n d r o i d : b a c k g r o u n d = " ? a n d r o i d : a t t r / d e t a i l s E l e m e n t B a c k g r o u n d " / >
< / L i n e a r L a y o u t >
6 . 16
Affichage de deux fragments par l'activité
6 . 17
Affichage de deux fragments par l'activité
Le code de l'ac vité :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) {
d o u b l e v a l u e = v a l u e 1 + v a l u e 2 ;
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. r e p l a c e ( R . i d . c o n t a i n e r , R e s u l t F r a g m e n t . g e t I n s t a n c e ( v a l u e ) )
. a d d T o B a c k S t a c k ( " r e s u l t " )
. c o m m i t ( ) ;
}
}
6 . 18
Les boites de dialogue
6 . 19
Les boites de dialogue
Les boites de dialogue sont des fragments :
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t {
p r i v a t e E d i t T e x t e d i t T e x t ;
@ O v e r r i d e
p u b l i c D i a l o g o n C r e a t e D i a l o g ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
A l e r t D i a l o g . B u i l d e r b u i l d e r = n e w A l e r t D i a l o g . B u i l d e r ( g e t A c t i v i t y ( ) ) ;
L a y o u t I n f l a t e r i n f l a t e r = g e t A c t i v i t y ( ) . g e t L a y o u t I n f l a t e r ( ) ;
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . d i a l o g , n u l l ) ;
e d i t T e x t = ( E d i t T e x t ) v i e w . f i n d V i e w B y I d ( R . i d . e d i t T e x t ) ;
b u i l d e r . s e t V i e w ( v i e w )
. s e t P o
t t o n ( a s i t i v e B u n d r o i d . R . s t r i n g . o k ,
n e w O n P o s i t i v e B u t t o n C l i c k L i s t e n e r ( ) )
. s e t N e g a t i v e B u t t o n ( a n d r o i d . R . s t r i n g . c a n c e l ,
n e w O n N e g a t i v e B u t t o n C l i c k L i s t e n e r ( ) ) ;
r e t u r n b u i l d e r . c r e a t e ( ) ;
}
}
6 . 20
Les boites de dialogue
L'inferface de communica on :
p u b l i c i n t e r f a c e D i a l o g F r a g m e n t L i s t e n e r {
v o i d o n C h a n g e T e x t ( S t r i n g t e x t ) ;
}
On redéfinit ensuite la méthode onAttach :
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t {
p r i v a t e D i a l o g F r a g m e n t L i s t e n e r l i s t e n e r ;
@ O v e r r i d e
p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) {
s u p e r . o n A t t a c h ( a c t i v i t y ) ;
t r y { l i s t e n e r = ( D i a l o g F r a g m e n t L i s t e n e r ) a c t i v i t y ; }
c a t c h ( C l a s s C a s t E x c e p t i o n e ) {
t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( )
+ " m u s t i m p l e m e n t D i a l o g F r a g m e n t L i s t e n e r " ) ;
}
}
}
6 . 21
Les boites de dialogue
Les écouteurs des événements :
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t {
p r i v a t e c l a s s O n P o s i t i v e B u t t o n C l i c k L i s t e n e r
i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) {
l i s t e n e r . o n C h a n g e T e x t ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . d i s m i s s ( ) ;
}
}
p r i v a t e c l a s s O n N e g a t i v e B u t t o n C l i c k L i s t e n e r
i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r {
p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) {
D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . c a n c e l ( ) ;
}
}
}
6 . 22
Les boites de dialogue
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
p r i v a t e T e x t V i e w t e x t V i e w ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
t e x t V i e w = ( T e x t V i e w ) f i n d V i e w B y I d ( R . i d . t e x t V i e w ) ;
t e x t V i e w . s e t O n C l i c k L i s t e n e r ( n e w O n C l i c k L i s t e n e r ( ) ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n C h a n g e T e x t ( S t r i n g t e x t ) { t e x t V i e w . s e t T e x t ( t e x t ) ; }
p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( V i e w v ) {
D i a l o g F r a g m e n t n e w F r a g m e n t = n e w D i a l o g F r a g m e n t ( ) ;
n e w F r a g m e n t . s h o w ( g e t F r a g m e n t M a n a g e r ( ) , " d i a l o g " ) ;
}
}
}
6 . 23
Les menus
< m e n u x m l n s : a n d r o i d = " . . . . " >
< i t e m a n d r o i d : i d = " @ + i d / a c t i o n _ d e c r e m e n t "
a n d r o i d : t i t l e = " @ s t r i n g / i n c r e m e n t "
a n d r o i d : i c o n = " @ d r a w a b l e / p r e v i o u s "
a n d r o i d : s h o w A s A c t i o n = " i f R o o m " / >
< i t e m a n d r o i d : i d = " @ + i d / a c t i o n _ i n c r e m e n t "
a n d r o i d : t i t l e = " @ s t r i n g / d e c r e m e n t "
a n d r o i d : i c o n = " @ d r a w a b l e / n e x t "
a n d r o i d : s h o w A s A c t i o n = " i f R o o m " / >
< / m e n u >
7.1
Chargement et traitement des actions du menu
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p u b l i c b o o l e a n o n C r e a t e O p t i o n s M e n u ( M e n u m e n u ) {
g e t M e n u I n f l a t e r ( ) . i n f l a t e ( R . m e n u . m a i n , m e n u ) ;
r e t u r n t r u e ;
}
@ O v e r r i d e
p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( M e n u I t e m i t e m ) {
s w i t c h ( i t e m . g e t I t e m I d ( ) ) {
c a s e R . i d . a c t i o n _ d e c r e m e n t :
d e c r e m e n t ( ) ;
r e t u r n t r u e ;
c a s e R . i d . a c t i o n _ i n c r e m e n t :
i n c r e m e n t ( ) ;
r e t u r n t r u e ;
d e f a u l t :
r e t u r n s u p e r . o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ;
}
}
/ * l e s m é t h o d e s d e c r e m e n t , i n c r e m e n t e t o n C r e a t e * /
}
7.2
Chargement et traitement des actions du menu
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
/ * . . . * /
p r i v a t e T e x t V i e w c o u n t e r T e x t V i e w ;
p r i v a t e i n t c o u n t e r = 0 ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
c o u n t e r T e x t V i e w = ( T e x t V i e w ) f i n d V i e w B y I d ( R . i d . c o u n t e r ) ;
u p d a t e T e x t V i e w ( ) ;
}
p r i v a t e v o i d u p d a t e T e x t V i e w ( ) { c o u n t e r T e x t V i e w . s e t T e x t ( " " + c o u n t e r ) ; }
p r i v a t e v o i d i n c r e m e n t ( ) { c o u n t e r + + ; u p d a t e T e x t V i e w ( ) ; }
p r i v a t e v o i d d e c r e m e n t ( ) { c o u n t e r - - ; u p d a t e T e x t V i e w ( ) ; }
}
7.3
Sauvegarde de l'état de l'activité
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
/ * . . . * /
@ O v e r r i d e
p r o t e c t e d v o i d o n S a v e I n s t a n c e S t a t e ( B u n d l e o u t S t a t e ) {
s u p e r . o n S a v e I n s t a n c e S t a t e ( o u t S t a t e ) ;
o u t S t a t e . p u t I n t ( " c o u n t e r " , c o u n t e r ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n R e s t o r e I n s t a n c e S t a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . o n R e s t o r e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ;
c o u n t e r = s a v e d I n s t a n c e S t a t e . g e t I n t ( " c o u n t e r " ) ;
u p d a t e T e x t V i e w ( ) ;
}
7.4
Menus et fragments
< L i n e a r L a y o u t x m l n s : a n d r o i d = " . . . "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t "
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 " >
< f r a g m e n t
a n d r o i d : i d = " @ + i d / c o u n t e r F r a g m e n t "
a n d r o i d : n a m e = " . C o u n t e r F r a g m e n t "
a n d r o i d : l a y o u t _ w e i g h t = " 1 "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " 0 d p " / >
< f r a g m e n t
a n d r o i d : i d = " @ + i d / c o l o r F r a g m e n t "
a n d r o i d : n a m e = " . C o l o r F r a g m e n t "
a n d r o i d : l a y o u t _ w e i g h t = " 1 "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " 0 d p " / >
< / L i n e a r L a y o u t >
7.5
Menus et fragments
7.6
Menus et fragments
p u b l i c c l a s s C o u n t e r F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e T e x t V i e w c o u n t e r T e x t V i e w ;
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r , V i e w G r o u p c o n t a i n e r ,
B u n d l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ c o u n t e r , c o n t a i n e r , f a l s e ) ;
c o u n t e r T e x t V i e w = ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . c o u n t e r ) ;
u p d a t e T e x t V i e w ( ) ;
r e t u r n v i e w ;
}
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ; s e t H a s O p t i o n s M e n u ( t r u e ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e O p t i o n s M e n u ( M e n u m e n u , M e n u I n f l a t e r i n f l a t e r ) {
s u p e r . o n C r e a t e O p t i o n s M e n u ( m e n u , i n f l a t e r ) ;
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ c o u n t e r , m e n u ) ;
}
/ * . . . * /
}
7.7
Menus et fragments
7.8
Menus et fragments
p u b l i c c l a s s C o u n t e r F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e i n t c o u n t e r = 0 ;
/ * . . . * /
p r i v a t e v o i d u p d a t e T e x t V i e w ( ) { c o u n t e r T e x t V i e w . s e t T e x t ( " " + c o u n t e r ) ; }
@ O v e r r i d e
p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( M e n u I t e m i t e m ) {
s w i t c h ( i t e m . g e t I t e m I d ( ) ) {
c a s e R . i d . a c t i o n _ d e c r e m e n t :d e c r e m e n t ( ) ; r e t u r n t r u e ;
c a s e R . i d . a c t i o n _ i n c r e m e n t : i n c r e m e n t ( ) ; r e t u r n t r u e ;
d e f a u l t : r e t u r n s u p e r . o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ;
}
}
p r i v a t e v o i d i n c r e m e n t ( ) { c o u n t e r + + ; u p d a t e T e x t V i e w ( ) ; }
p r i v a t e v o i d d e c r e m e n t ( ) { c o u n t e r - - ; u p d a t e T e x t V i e w ( ) ; }
}
7.9
Menus et fragments
p u b l i c c l a s s C o l o r F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e i n t c o l o r = C o l o r . R E D ;
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o
u t I n f l a t e r i n f l a t e r ,
V i e w
G r o u p c o n t a i n e r ,
B u n d
l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a
t e ( R . l a y o u t . f r a g m e n t _ c o l o r ,
c o n t a i n e r , f a l s e ) ;
i m a g e V i e w = ( I m a g e V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . c o l o r ) ;
u p d a t e I m a g e V i e w ( ) ;
r e t u r n v i e w ;
}
p r i v a t e v o i d u p d a t e I m a g e V i e w ( ) { i m a g e V i e w . s e t B a c k g r o u n d C o l o r ( c o l o r ) ; }
}
7 . 10
Menus et fragments
7 . 11
Menus et fragments
p u b l i c c l a s s C o l o r F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e i n t c o l o r = C o l o r . R E D ;
/ * . . . * /
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t H a s O p t i o n s M e n u ( t r u e ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e O p t i o n s M e n u ( M e n u m e n u ,
M e n u I n f l a t e r i n f l a t e r ) {
s u p e r . o n C r e a t e O p t i o n s M e n u ( m e n u , i n f l a t e r ) ;
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ c o l o r , m e n u ) ;
}
}
7 . 12
Menus et fragments
p u b l i c c l a s s C o l o r F r a g m e n t e x t e n d s F r a g m e n t {
@ O v e r r i d e
p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( M e n u I t e m i t e m ) {
s w i t c h ( i t e m . g e t I t e m I d ( ) ) {
c a s e R . i d . a c t i o n _ r e d :
c h a n g e C o l o r ( C o l o r . R E D ) ; r e t u r n t r u e ;
c a s e R . i d . a c t i o n _ b l u e :
c h a n g e C o l o r ( C o l o r . B L U E ) ; r e t u r n t r u e ;
d e f a u l t : r e t u r n s u p e r . o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ;
}
}
p r i v a t e v o i d c h a n g e C o l o r ( i n t c o l o r ) {
t h i s . c o l o r = c o l o r ; u p d a t e I m a g e V i e w ( ) ;
}
}
7 . 13
Les listes
Dans le cours et les TP, nous allons u liser des RecyclerView :
8.1
Il est également possible d'u liser l'ancienne classe ListView.
Les listes
Un RecyclerView permet l'affichage d'un grand nombre de vues
Un LayoutManager permet de gérer la posi on des éléments
Un Adapter va adapter les données aux vues
RecyclerView
8.2
Le layout principal de l'application
< a n d r o i d . s u p p o r t . v 7 . w i d g e t . R e c y c l e r V i e w
x m l n s : a n d r o i d = " . . . "
a n d r o i d : i d = " @ + i d / r e c y c l e r V i e w "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t "
/ >
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e I t e m A d a p t e r a d a p t e r ;
p r i v a t e A r r a y L i s t < S t r i n g > d a t a s e t ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
R e c y c l e r V i e w r e c y c l e r V i e w = ( R e c y c l e r V i e w ) f i n d V i e w B y I d ( R . i d . r e c y c l e r V i e w ) ;
R e c y c l e r V i e w . L a y o u t M a n a g e r l a y o u t M a n a g e r = n e w G r i d L a y o u t M a n a g e r ( t h i s , 2 ) ;
r e c y c l e r V i e w . s e t L a y o u t M a n a g e r ( l a y o u t M a n a g e r ) ;
d a t a s e t = n e w A r r a y L i s t < > ( ) ;
a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t ) ;
r e c y c l e r V i e w . s e t A d a p t e r ( a d a p t e r ) ;
}
}
8.3
Code de l'adaptateur
p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
p r i v a t e f i n a l L i s t < S t r i n g > d a t a s e t ;
p u b l i c I t e m A d a p t e r ( L i s t < S t r i n g > d a t a s e t ) { t h i s . d a t a s e t = d a t a s e t ; }
@ O v e r r i d e
p u b l i c V i e w H o l d e r o n C r e a t e V i e w H o l d e r ( V i e w G r o u p g r o u p , i n t t y p e V i e w ) {
V i e w v i e w = L a y o u t I n f l a t e r . f r o m ( g r o u p . g e t C o n t e x t ( ) )
. i n f l a t e ( a n d r o i d . R . l a y o u t . s i m p l e _ l i s t _ i t e m _ 1 , g r o u p , f a l s e ) ;
V i e w H o l d e r v i e w H o l d e r = n e w V i e w H o l d e r ( v i e w ) ;
r e t u r n v i e w H o l d e r ;
}
p u b l i c c l a s s V i e w H o l d e r e x t e n d s R e c y c l e r V i e w . V i e w H o l d e r {
f i n a l T e x t V i e w t e x t V i e w ;
p u b l i c V i e w H o l d e r ( V i e w i t e m V i e w ) {
s u p e r ( i t e m V i e w ) ;
t e x t V i e w = ( T e x t V i e w ) i t e m V i e w . f i n d V i e w B y I d ( a n d r o i d . R . i d . t e x t 1 ) ;
}
p u b l i c v o i d b i n d ( i n t i n d e x ) { t e x t V i e w . s e t T e x t ( d a t a s e t . g e t ( i n d e x ) ) ; }
}
}
8.4
Code de l'adaptateur
p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
/ * . . . * /
@ O v e r r i d e
p u b l i c v o i d o n B i n d V i e w H o l d e r ( V i e w H o l d e r v i e w H o l d e r , i n t i n d e x ) {
v i e w H o l d e r . b i n d ( i n d e x ) ;
}
@ O v e r r i d e
p u b l i c i n t g e t I t e m C o u n t ( ) { r e t u r n d a t a s e t . s i z e ( ) ; }
8.5
Mise en place du dialogue d'ajout d'un item
Interface de communica on :
p u b l i c i n t e r f a c e D i a l o g F r a g m e n t L i s t e n e r {
v o i d o n A d d I t e m ( S t r i n g t e x t ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n A d d I t e m ( S t r i n g t e x t ) {
/ * T O D O * /
}
}
8.6
Notification de l'adaptateur de la modification du modèle
p r i v a t e I t e m A d a p t e r a d a p t e r ;
p r i v a t e A r r a y L i s t < S t r i n g > d a t a s e t ;
@ O v e r r i d e
p u b l i c v o i d o n A d d I t e m ( S t r i n g t e x t ) {
d a t a s e t . a d d ( t e x t ) ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
}
}
Il est possible de no fier l'adaptateur plus finement avec les
méthodes notifyItemChanged, notifyItemInserted,
notifyItemMoved, notifyItemRangeChanged, etc.
8.7
Ajout d'un menu à l'activité
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
@ O v e r r i d e
p u b l i c b o o l e a n o n C r e a t e O p t i o n s M e n u ( M e n u m e n u ) {
g e t M e n u I n f l a t e r ( ) . i n f l a t e ( R . m e n u . m e n u _ m a i n , m e n u ) ;
r e t u r n t r u e ;
}
@ O v e r r i d e
p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( M e n u I t e m i t e m ) {
i f ( i t e m . g e t I t e m I d ( ) = = R . i d . a c t i o n _ a d d ) {
D i a l o g F r a g m e n t n e w F r a g m e n t = n e w D i a l o g F r a g m e n t ( ) ;
n e w F r a g m e n t . s h o w ( g e t F r a g m e n t M a n a g e r ( ) , " d i a l o g " ) ;
r e t u r n t r u e ;
}
r e t u r n s u p e r . o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ;
}
}
8.8
Code de la boite de dialogue
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t {
p r i v a t e E d i t T e x t e d i t T e x t ;
@ O v e r r i d e
p u b l i c D i a l o g o n C r e a t e D i a l o g ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
A l e r t D i a l o g . B u i l d e r b u i l d e r =
n e w A l e r t D i a l o g . B u i l d e r ( g e t A c t i v i t y ( ) ) ;
L a y o u t I n f l a t e r i n f l a t e r = g e t A c t i v i t y ( ) . g e t L a y o u t I n f l a t e r ( ) ;
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . d i a l o g , n u l l ) ;
e d i t T e x t = ( E d i t T e x t ) v i e w . f i n d V i e w B y I d ( R . i d . e d i t T e x t ) ;
b u i l d e r . s e t V i e w ( v i e w )
. s e t P o s i t i v
u t t o n ( ae B n d r o i d . R . s t r i n g . o k ,
n e w O n P o s i t i v e B u t t o n C l i c k L i s t e n e r ( ) )
. s e t N e g a t i v e B u t t o n ( a n d r o i d . R . s t r i n g . c a n c e l ,
n e w O n N e g a t i v e B u t t o n C l i c k L i s t e n e r ( ) ) ;
r e t u r n b u i l d e r . c r e a t e ( ) ;
}
}
8.9
Code de la boite de dialogue
8 . 10
Code de la boite de dialogue
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t {
p r i v a t e E d i t T e x t e d i t T e x t ;
p r i v a t e D i a l o g F r a g m e n t L i s t e n e r l i s t e n e r ;
/ * . . . * /
@ O v e r r i d e
p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) {
s u p e r . o n A t t a c h ( a c t i v i t y ) ;
t r y {
l i s t e n e r = ( D i a l o g F r a g m e n t L i s t e n e r ) a c t i v i t y ;
} c a t c h ( C l a s s C a s t E x c e p t i o n e ) {
t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( )
+ " m u s t i m p l e m e n t D i a l o g F r a g m e n t L i s t e n e r " ) ;
}
}
}
8 . 11
Code de la boite de dialogue
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t {
/ * . . . * /
p r i v a t e c l a s s O n P o s i t i v e B u t t o n C l i c k L i s t e n e r
i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) {
l i s t e n e r . o n A d d I t e m ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . d i s m i s s ( ) ;
}
}
p r i v a t e c l a s s O n N e g a t i v e B u t t o n C l i c k L i s t e n e r
i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r {
p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) {
D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . c a n c e l ( ) ;
}
}
}
8 . 12
Sélection des éléments
Sélection des éléments
p u b l i c i n t e r f a c e O n I t e m C l i c k { v o i d o n C l i c k ( i n t i n d e x ) ; }
p u b l i c v o i d s e t O n I t e m C l i c k ( O n I t e m C l i c k l i s t e n e r ) {
l i s t e n e r s . a d d ( l i s t e n e r ) ;
}
p u b l i c v o i d n o t i f y O n I t e m C l i c k ( i n t i n d e x ) {
f o r ( O n I t e m C l i c k l i s t e n e r : l i s t e n e r s )
l i s t e n e r . o n C l i c k ( i n d e x ) ;
}
}
8 . 14
13
Sélection des éléments
p u b l i c V i e w H o l d e r ( V i e w i t e m V i e w ) {
/ * . . . * / i t e m V i e w . s e t O n C l i c k L i s t e n e r ( n e w O n C l i c k L i s t e n e r ( ) ) ;
}
p u b l i c v o i d b i n d ( i n t i n d e x ) { t h i s . i n d e x = i n d e x ; / * . . . * / }
p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( V i e w v i e w ) { n o t i f y O n I t e m C l i c k ( i n d e x ) ; }
}
}
}
8 . 15
Sélection des éléments
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
/ * . . . * /
a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t , s e l e c t e d I t e m s ) ;
a d a p t e r . s e t O n I t e m C l i c k ( n e w O n I t e m C l i c k ( ) ) ;
}
p r i v a t e c l a s s O n I t e m C l i c k i m p l e m e n t s I t e m A d a p t e r . O n I t e m C l i c k {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( i n t i n d e x ) { / * T O D O * / }
}
}
8 . 16
Sélection des éléments
Méthodes pour gérer les sélec ons :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
p r i v a t e S p a r s e B o o l e a n A r r a y s e l e c t e d I t e m s = n e w S p a r s e B o o l e a n A r r a y ( ) ;
p r i v a t e i n t n u m b e r O f S e l e c t e d I t e m s ;
p r i v a t e v o i d s w a p I t e m S e l e c t i o n ( i n t i n d e x ) {
s e l e c t e d I t e m s . p u t ( i n d e x , ! s e l e c t e d I t e m s . g e t ( i n d e x ) ) ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
n u m b e r O f S e l e c t e d I t e m s + = s e l e c t e d I t e m s . g e t ( i n d e x ) ? 1 : - 1 ;
}
p r i v a t e v o i d c l e a r S e l e c t i o n ( ) {
s e l e c t e d I t e m s . c l e a r ( ) ;
n u m b e r O f S e l e c t e d I t e m s = 0 ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
}
}
8 . 17
Sélection des éléments
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
p r i v a t e I t e m A d a p t e r a d a p t e r ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
/ * . . . * /
a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t , s e l e c t e d I t e m s ) ;
a d a p t e r . s e t O n I t e m C l i c k ( n e w O n I t e m C l i c k ( ) ) ;
}
p r i v a t e c l a s s O n I t e m C l i c k i m p l e m e n t s I t e m A d a p t e r . O n I t e m C l i c k {
@ O v e r r i d e
p u b l i c v o i d o n C l i c k ( i n t i n d e x ) { s w a p I t e m S e l e c t i o n ( i n d e x ) ; }
}
}
8 . 18
Sélection des éléments
item_background.xml :
< s e l e c t o r x m l n s : a n d r o i d = " . . . " >
< i t e m a n d r o i d : s t a t e _ s e l e c t e d = " t r u e "
a n d r o i d : d r a w a b l e = " @ d r a w a b l e / s e l e c t e d _ i t e m _ b a c k g r o u n d " / >
< i t e m a n d r o i d : d r a w a b l e = " @ d r a w a b l e / n o r m a l _ i t e m _ b a c k g r o u n d " / >
< / s e l e c t o r >
selected_item_background.xml :
< r i p p l e x m l n s : a n d r o i d = " . . . "
a n d r o i d : c o l o r = " ? a n d r o i d : c o l o r M u l t i S e l e c t H i g h l i g h t " >
< i t e m a n d r o i d : i d = " @ a n d r o i d : i d / m a s k "
a n d r o i d : d r a w a b l e = " @ a n d r o i d : c o l o r / w h i t e " / >
< / r i p p l e >
8 . 19
Sélection des éléments
normal_item_background.xml :
< r i p p l e x m l n s : a n d r o i d = " . . . "
a n d r o i d : c o l o r = " @ a n d r o i d : c o l o r / w h i t e " >
< i t e m a n d r o i d : d r a w a b l e = " ? a n d r o i d : c o l o r M u l t i S e l e c t H i g h l i g h t " / >
< / r i p p l e >
layout_item.xml :
< R e l a t i v e L
a y o u t x m l n s : a n d r o i d = " . . . "
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 "
a n d r
o i d : b a c k g r o u n d = " @ d r a w a b l e / i t e m _ b a c k g r o u n d " >
< T e x
t V i e w
a n d r o i d : i d = " @ + i d / t e x t "
a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " / >
< / R e l a t i v e L a y o u t >
8 . 20
Sélection des éléments
Communica on des éléments sélec onnés à l'adaptateur :
p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
p r i v a t e f i n a l L i s t < S t r i n g > d a t a s e t ;
p r i v a t e f i n a l S p a r s e B o o l e a n A r r a y s e l e c t e d I t e m s ;
p u b l i c I t e m A d a p t e r ( L i s t < S t r i n g > d a t a s e t ,
S p a r s e B o o l e a n A r r a y s e l e c t e d I t e m s ) {
t h i s . d a t a s e t = d a t a s e t ; t h i s . s e l e c t e d I t e m s = s e l e c t e d I t e m s ;
}
}
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
/ * . . . * / a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t , s e l e c t e d I t e m s ) ; / * . . . * /
}
}
8 . 21
Sélection des éléments
Mise en place du nouveau layout :
p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
@ O v e r r i d e
p u b l i c V i e w H o l d e r o n C r e a t e V i e w H o l d e r ( V i e w G r o u p v i e w G r o u p ,
i n t i n d e x ) {
V i e w v i e w = L a y o u t I n f l a t e r . f r o m ( v i e w G r o u p . g e t C o n t e x t ( ) )
. i n f l a t e ( R . l a y o u t . l a y o u t _ i t e m , v i e w G r o u p , f a l s e ) ;
V i e w H o l d e r v i e w H o l d e r = n e w V i e w H o l d e r ( v i e w ) ;
v i e w H o l d e r . b i n d ( i n d e x ) ;
r e t u r n v i e w H o l d e r ;
}
8 . 22
Sélection des éléments
p u b l i c c l a s s V i e w H o l d e r e x t e n d s R e c y c l e r V i e w . V i e w H o l d e r {
i n t i n d e x ;
p u b l i c v o i d b i n d ( i n t i n d e x ) {
/ * . . . * /
i t e m V i e w . s e t S e l e c t e d ( s e l e c t e d I t e m s . g e t ( i n d e x ) ) ;
}
/ * . . . * /
}
}
8 . 23
Le mode "action"
Nous souhaitons pouvoir supprimer les éléments sélec onnés :
8 . 24
Le mode "action"
< m e n u x m l n s : a n d r o i d = " . . . " >
< i t e m a n d r o i d : i d = " @ + i d / a c t i o n _ d e l e t e "
a n d r o i d : t i t l e = " @ s t r i n g / d e l e t e "
a n d r o i d : i c o n = " @ a n d r o i d : d r a w a b l e / i c _ m e n u _ d e l e t e "
a n d r o i d : s h o w A s A c t i o n = " i f R o o m " / >
< / m e n u >
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
/ * . . . * /
p r i v a t e v o i d s w a p I t e m S e l e c t i o n ( i n t i n d e x ) {
/ * . . . * / u p d a t e A c t i o n M o d e ( ) ;
}
p r i v a t e v o i d u p d a t e A c t i o n M o d e ( ) {
b o o l e a n o l d S e l e c t i o n M o d e A c t i v a t e d = a c t i o n M o d e ! = n u l l ;
b o o l e a n s e l e c t i o n M o d e A c t i v a t e d = n u m b e r O f S e l e c t e d I t e m s > 0 ;
i f ( s e l e c t i o n M o d e A c t i v a t e d = = o l d S e l e c t i o n M o d e A c t i v a t e d ) r e t u r n ;
i f ( s e l e c t i o n M o d e A c t i v a t e d ) {
a c t i o n M o d e = s t a r t A c t i o n M o d e ( a c t i o n M o d e C a l l b a c k ) ;
r e t u r n ;
} e l s e a c t i o n M o d e . f i n i s h ( ) ;
}
}
8 . 25
Le mode "action"
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
p r i v a t e A c t i o n M o d e . C a l l b a c k a c t i o n M o d e C a l l b a c k
= n e w A c t i o n M o d e C a l l b a c k ( ) ;
p r i v a t e c l a s s A c t i o n M o d e C a l l b a c k i m p l e m e n t s A c t i o n M o d e . C a l l b a c k {
@ O v e r r i d e
p u b l i c b o o l e a n o n C r e a t e A c t i o n M o d e ( A c t i o n M o d e m o d e , M e n u m e n u ) {
M e n u I n f l a t e r i n f l a t e r = m o d e . g e t M e n u I n f l a t e r ( ) ;
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ a c t i o n m o d e , m e n u ) ;
r e t u r n t r u e ;
}
/ * . . . * /
}
}
8 . 26
Le mode "action"
8 . 27
Le mode "action"
@ O v e r r i d e
p u b l i c b o o l e a n o n P r e p a r e A c t i o n M o d e ( A c t i o n M o d e m o d e , M e n u m e n u ) {
r e t u r n f a l s e ;
}
@ O v e r r i d e
p u b l i c v o i d o n D e s t r o y A c t i o n M o d e ( A c t i o n M o d e m o d e ) {
c l e a r S e l e c t i o n ( ) ;
a c t i o n M o d e = n u l l ;
}
}
}
8 . 28
Le mode "action"
Suppression des éléments du modèle :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r {
p r i v a t e v o i d d e l e t e S e l e c t e d I t e m s ( ) {
f o r ( i n t i n d e x = s e l e c t e d I t e m s . s i z e ( ) - 1 ; i n d e x > = 0 ; i n d e x - - )
i f ( s e l e c t e d I t e m s . v a l u e A t ( i n d e x ) )
d a t a s e t . r e m o v e ( s e l e c t e d I t e m s . k e y A t ( i n d e x ) ) ;
c l e a r S e l e c t i o n ( ) ;
u p d a t e A c t i o n M o d e ( ) ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
}
}
8 . 29
Exemple d'utilisation des préférences
9.1
Exemple d'utilisation des préférences
9.2
Exemple d'utilisation des préférences
9.3
Structure des préférences
Un fichier XML décrit la structure des péférences :
< P r e f e r e n c e S c r e e n x m l n s : a n d r o i d = " . . . " >
< C h e c k B o x P r e f e r e n c e
a n d r o i d : k e y = " p r e f _ c h e c k b o x "
a n d r o i d : t i t l e = " @ s t r i n g / c h e c k b o x _ t i t l e "
a n d r o i d : d e f a u l t V a l u e = " t r u e " / >
< E d i t T e x t P r e f e r e n c e
a n d r o i d : k e y = " p r e f _ t e x t "
a n d r o i d : d e p e n d e n c y = " p r e f _ c h e c k b o x "
a n d r o i d : t i t l e = " @ s t r i n g / t e x t _ t i t l e " / >
< L i s t P r e f e r e n c e
a n d r o i d : k e y = " p r e f _ l i s t "
a n d r o i d : t i t l e = " @ s t r i n g / l i s t _ t i t l e "
a n d r o i d : e n t r i e s = " @ a r r a y / l i s t _ e n t r i e s "
a n d r o i d : e n t r y V a l u e s = " @ a r r a y / l i s t _ v a l u e s "
a n d r o i d : d e f a u l t V a l u e = " @ s t r i n g / l i s t _ d e f a u l t " / >
< / P r e f e r e n c e S c r e e n >
9.4
Les tableaux de chaînes de caractères
Les tableaux de valeurs pour la liste (fichier values/arrays.xml) :
< s o u r c e s >
< s t r i n g - a r r a y n a m e = " l i s t _ e n t r i e s " >
< i t e m > v a l u e A < / i t e m >
< i t e m > v a l u e B < / i t e m >
< i t e m > v a l u e C < / i t e m >
< / s t r i n g - a r r a y >
< s t r i n g - a r r a y n a m e = " l i s t _ v a l u e s " >
< i t e m > A < / i t e m >
< i t e m > B < / i t e m >
< i t e m > C < / i t e m >
< / s t r i n g - a r r a y >
< / r e s o u r c e s >
9.5
Création du Fragment Préférences
Le code d'un Fragment affichant les préférences :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t {
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
a d d P r e f e r e n c e s F r o m R e s o u r c e ( R . x m l . s e t t i n g s ) ;
}
Les préférences sont automa quement sauvegardées
9.6
Mise à jour du Fragment
Mise en jour du Fragment en fonc on des changements :
9.7
Écouter les changements
Mise en jour du Fragment en fonc on des changements :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ;
g e t P r e f e r e n c e S c r e e n ( ) . g e t S h a r e d P r e f e r e n c e s ( )
. r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n P a u s e ( ) {
s u p e r . o n P a u s e ( ) ;
g e t P r e f e r e n c e S c r e e n ( ) . g e t S h a r e d P r e f e r e n c e s ( )
. u n r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
}
}
9.8
Écouter les changements
Implémenta on de la méthode du Listener et mise à jour de la vue :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n S h a r e d P r e f e r e n c e C h a n g e d ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ,
S t r i n g k e y ) {
u p d a t e S u m m a r y ( p r e f e r e n c e s , k e y ) ;
}
p r i v a t e v o i d u p d a t e S u m m a r y ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ,
S t r i n g k e y ) {
i f ( k e y . e q u a l s ( " p r e f _ t e x t " ) | | k e y . e q u a l s ( " p r e f _ l i s t " ) ) {
P r e f e r e n c e p r e f e r e n c e = f i n d P r e f e r e n c e ( k e y ) ;
p r e f e r e n c e . s e t S u m m a r y ( p r e f e r e n c e s . g e t S t r i n g ( k e y , " " ) ) ;
}
}
}
9.9
Écouter les changements
Mise à jour de la vue à la créa on :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
a d d P r e f e r e n c e s F r o m R e s o u r c e ( R . x m l . s e t t i n g s ) ;
S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s =
g e t P r e f e r e n c e S c r e e n ( ) . g e t S h a r e d P r e f e r e n c e s ( ) ;
u p d a t e S u m m a r y ( s h a r e d P r e f e r e n c e s , " p r e f _ t e x t " ) ;
u p d a t e S u m m a r y ( s h a r e d P r e f e r e n c e s , " p r e f _ l i s t " ) ;
}
}
9 . 10
Écouter les changements
Mise à jour de la vue à la créa on :
p u b l i c c l a s s M a i n F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e T e x t V i e w t e x t V i e w ;
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r ,
V i e w G r o u p c o n t a i n e r ,
B u n d l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ m a i n , c o n t a i n e r , f a l s e ) ;
t e x t V i e w = ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t e x t V i e w ) ;
S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s =
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) ;
u p d a t e V i e w W i t h S e t t i n g s ( s h a r e d P r e f e r e n c e s ) ;
r e t u r n v i e w ;
}
p r i v a t e v o i d u p d a t e V i e w W i t h S e t t i n g s ( S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s ) {
b o o l e a n c h e c k b o x V a l u e = s h a r e d P r e f e r e n c e s . g e t B o o l e a n ( " p r e f _ c h e c k b o x " , t r u e ) ;
S t r i n g t e x t V a l u e = s h a r e d P r e f e r e n c e s . g e t S t r i n g ( " p r e f _ t e x t " , " " ) ;
S t r i n g l i s t V a l u e = s h a r e d P r e f e r e n c e s . g e t S t r i n g ( " p r e f _ l i s t " , " " ) ;
t e x t V i e w . s e t T e x t ( c h e c k b o x V a l u e + " \ n " + t e x t V a l u e + " \ n " + l i s t V a l u e ) ;
}
}
9 . 11
Vue du fragment principal
Créa on de la vue :
p u b l i c c l a s s M a i n F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e T e x t V i e w t e x t V i e w ;
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r ,
V i e w G r o u p c o n t a i n e r ,
B u n d l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ m a i n ,
c o n t a i n e r , f a l s e ) ;
t e x t V i e w = ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t e x t V i e w ) ;
S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s =
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) ;
u p d a t e V i e w ( s h a r e d P r e f e r e n c e s ) ;
r e t u r n v i e w ;
}
p r i v a t e v o i d u p d a t e V i e w ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ) { / * . . . * / }
}
9 . 12
Récupération des préférences
Récupéra on des valeurs des préférences :
p u b l i c c l a s s M a i n F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e T e x t V i e w t e x t V i e w ;
p r i v a t e v o i d u p d a t e V i e w ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ) {
b o o l e a n c h e c k b o x V a l u e =
p r e f e r e n c e s . g e t B o o l e a n ( " p r e f _ c h e c k b o x " , t r u e ) ;
S t r i n g t e x t V a l u e =
p r e f e r e n c e s . g e t S t r i n g ( " p r e f _ t e x t " , " " ) ;
S t r i n g l i s t V a l u e =
p r e f e r e n c e s . g e t S t r i n g ( " p r e f _ l i s t " , " " ) ;
t e x t V i e w . s e t T e x t ( c h e c k b o x V a l u e +
" \ n " + t e x t V a l u e +
" \ n " + l i s t V a l u e ) ;
}
}
9 . 13
Écoute des changements de préférences
Écoute du changement de préférences :
p u b l i c c l a s s M a i n F r a g m e n t e x t e n d s F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ;
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) .
r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n P a u s e ( ) {
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) .
r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
s u p e r . o n P a u s e ( ) ;
}
}
9 . 14
Écoute des changements de préférences
Modifica on de la vue lorsque les préférences changent :
p u b l i c c l a s s M a i n F r a g m e n t e x t e n d s F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n S h a r e d P r e f e r e n c e C h a n g e d ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ,
S t r i n g k e y ) {
u p d a t e V i e w ( p r e f e r e n c e s ) ;
}
}
9 . 15
Mise en place du menu
Inser on du menu dans le Fragment principal :
p u b l i c c l a s s M a i n F r a g m e n t e x t e n d s F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t H a s O p t i o n s M e n u ( t r u e ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e O p t i o n s M e n u ( M e n u m e n u , M e n u I n f l a t e r i n f l a t e r ) {
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ m a i n , m e n u ) ;
}
}
9 . 16
Mise en place du menu
< m e n u x m l n s : a n d r o i d = " . . . " >
< i t e m
a n d r o i d : i d = " @ + i d / a c t i o n _ s e t t i n g s "
a n d r o i d : t i t l e = " @ s t r i n g / a c t i o n _ s e t t i n g s "
a n d r o i d : o r d e r I n C a t e g o r y = " 1 0 0 "
a n d r o i d : i c o n = " @ a n d r o i d : d r a w a b l e / i c _ m e n u _ p r e f e r e n c e s "
a n d r o i d : s h o w A s A c t i o n = " a l w a y s " / >
< / m e n u >
}
9 . 17
L'activité principale
Créa on de la vue :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
i f ( s a v e d I n s t a n c e S t a t e = = n u l l ) {
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. a d d ( R . i d . c o n t a i n e r , n e w M a i n F r a g m e n t ( ) )
. c o m m i t ( ) ;
}
}
}
9 . 18
L'activité principale
Traitement des événements du menu :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( M e n u I t e m i t e m ) {
i f ( i t e m . g e t I t e m I d ( ) = = R . i d . a c t i o n _ s e t t i n g s ) {
o p e n S e t t i n g s ( ) ;
r e t u r n t r u e ;
}
r e t u r n s u p e r . o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ;
}
}
9 . 19
L'activité principale
Ouverture du Fragment Préférences :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e v o i d o p e n S e t t i n g s ( ) {
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. r e p l a c e ( R . i d . c o n t a i n e r , n e w S e t t i n g s F r a g m e n t ( ) )
. a d d T o B a c k S t a c k ( " r e s u l t " )
. c o m m i t ( ) ;
}
}
9 . 20
Les fichiers
Stockage interne :
Toujours disponible
Par défaut, accessible uniquement par votre applica on
Fichiers Supprimés à la désinstalla on de l'applica on
Sockage externe :
Pas toujours disponible (USB, etc.)
Fichiers Accessibles et modifiables par tout le monde
Seuls les fichiers du répertoire getExternalFilesDir() sont
supprimés à la désinstalla on de l'applica on
Nécessite des permissions
U le pour partager des données entre applica ons
10 . 1
Créer un fichier dans le stockage interne
Deux répertoires :
getFilesDir() : Le répertoire interne de votre applica on
getCacheDir() : le cache interne de votre applica on
Pour créer un fichier dans l'un de ces répertoires :
F i l e f i l e = n e w F i l e ( c o n t e x t . g e t F i l e s D i r ( ) , " f i c h i e r . t x t " ) ;
ou
F i l e O u t p u t S t r e a m o u t p u t S t r e a m
= o p e n F i l e O u t p u t ( " f i c h i e r . t x t " , C o n t e x t . M O D E _ P R I V A T E ) ;
ou
F i l e f i l e
= F i l e . c r e a t e T e m p F i l e ( " f i c h i e r " , " t m p " , c o n t e x t . g e t C a c h e D i r ( ) ) ;
10 . 2
Écrire et lire des données dans un fichier
Nous souhaitons écrire un éditeur de fichier :
10 . 3
Écrire et lire des données dans un fichier
Supposons que nous ayons l'ac vité suivante :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e E d i t T e x t e d i t T e x t ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
e d i t T e x t = ( E d i t T e x t ) f i n d V i e w B y I d ( R . i d . e d i t T e x t ) ;
}
}
10 . 4
Écrire et lire des données dans un fichier
Déclenchement de l'écriture et de la lecture du fichier :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e E d i t T e x t e d i t T e x t ;
@ O v e r r i d e
p r o t e c t e d v o i d o n S t a r t ( ) {
s u p e r . o n R e s u m e ( ) ;
e d i t T e x t . s e t T e x t ( l o a d ( ) ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n S t o p ( ) {
s u p e r . o n P a u s e ( ) ;
s a v e ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
}
}
10 . 5
Écrire et lire des données dans un fichier
La sauvegarde :
p r i v a t e v o i d s a v e ( S t r i n g s t r i n g ) {
F i l e f i l e = n e w F i l e ( g e t F i l e s D i r ( ) , f i l e n a m e ) ;
t r y ( B u f f e r e d W r i t e r w r i t e r =
n e w B u f f e r e d W r i t e r ( n e w F i l e W r i t e r ( f i l e ) ) ) {
w r i t e r . w r i t e ( s t r i n g ) ;
} c a t c h ( I O E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s ,
g e t S t r i n g ( R . s t r i n g . r e a d _ e r r o r ) ,
T o a s t . L E N G T H _ L O N G ) ;
}
}
10 . 6
Écrire et lire des données dans un fichier
La lecture :
p r i v a t e S t r i n g l o a d ( ) {
F i l e f i l e = n e w F i l e ( g e t F i l e s D i r ( ) , f i l e n a m e ) ;
i f ( ! f i l
e . e x i s t s ( ) ) r e t u r n " " ;
t r y ( B u f
f e r e d R e a d e r r e a d e r =
n e w B u f f e r e d R e a d e r ( n e w F i l e R e a d e r ( f i l e ) ) ) {
r e t u r n l o a d ( r e a d e r ) ;
} c a t c h ( I O E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s ,
g e t S t r i n g ( R . s t r i n g . r e a d _ e r r o r ) ,
T o a s t . L E N G T H _ L O N G ) ;
r e t u r n " " ;
}
}
10 . 7
Écrire et lire des données dans un fichier
La lecture :
p r i v a t e S t r i n g l o a d ( B u f f e r e d R e a d e r r e a d e r ) t h r o w s I O E x c e p t i o n {
S t r i n g B u i l d e r b u i l d e r = n e w S t r i n g B u i l d e r ( ) ;
f o r ( ; ; ) {
S t r i n g l i n e = r e a d e r . r e a d L i n e ( ) ;
i f ( l i n e = = n u l l ) b r e a k ;
b u i l d e r . a p p e n d ( l i n e ) . a p p e n d ( " \ n " ) ;
}
r e t u r n b u i l d e r . t o S t r i n g ( ) ;
}
10 . 8
Permissions pour le stockage externe
Il suffit d'ajouter les permissions dans le manifeste de l'applica on :
Pour l'écriture :
< m a n i f e s t >
< u s e s - p e r m i s s i o n
a n d r o i d : n a m e = " a n d r o i d . p e r m i s s i o n . W R I T E _ E X T E R N A L _ S T O R A G E " / >
< / m a n i f e s t >
Pour la lecture :
< m a n i f e s t >
< u s e s - p e r m i s s i o n
a n d r o i d : n a m e = " a n d r o i d . p e r m i s s i o n . R E A D _ E X T E R N A L _ S T O R A G E " / >
< / m a n i f e s t >
10 . 9
Un exemple d'application
Nous souhaitons parcourir et lire les fichiers du stockage externe :
Deux types de fragments :
Affichage d'un répertoire : DirectoryFragment
Affichage du contenu d'un fichier : FileFragment
Affichage du contenu d'un fichier
10
10 .. 11
10
Affichage du contenu d'un fichier
p u b l i c s t a t i c F i l e F r a g m e n t n e w I n s t a n c e ( S t r i n g f i l e n a m e ) {
F i l e F r a g m e n t f r a g m e n t = n e w F i l e F r a g m e n t ( ) ;
B u n d l e a r g s = n e w B u n d l e ( ) ;
a r g s . p u t S t r i n g ( " p a t h " , f i l e n a m e ) ;
f r a g m e n t . s e t A r g u m e n t s ( a r g s ) ;
r e t u r n f r a g m e n t ;
}
p r i v a t e S t r i n g p a t h ( ) { r e t u r n g e t A r g u m e n t s ( ) . g e t S t r i n g ( " p a t h " ) ; }
10 . 12
Affichage du contenu d'un fichier
Créa on de la vue et ges on du cycle de vie :
p u b l i c c l a s s F i l e F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e T e x t V i e w t e x t V i e w ;
p u b l i c V i e w o n C r e a t e V i e w ( L a y o
u t I n f l a t e r i n f l a t e r ,
V i e w
G r o u p c o n t a i n e r ,
B u n d
l e s a v e d I n s t a n c e S t a t e ) {
V i e w v i e w = i n f l a t e r . i n f l a t
e ( R . l a y o u t . f r a g m e n t _ f i l e ,
c o n t a i n e r , f a l s e ) ;
t e x t V i e w = ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t e x t V i e w ) ;
r e t u r n v i e w ;
}
p u b l i c v o i d o n R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ; t e x t V i e w . s e t T e x t ( l o a d ( ) ) ;
g e t A c t i v i t y ( ) . s e t T i t l e ( p a t h ( ) ) ;
}
}
10 . 13
Affichage du contenu d'un fichier
Chargement du contenu du fichier :
p u b l i c c l a s s F i l e F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e S t r i n g l o a d ( ) {
F i l e f i l e = n e w F i l e ( p a t h ( ) ) ;
i f ( ! f i l e . e x i s t s ( ) ) r e t u r n " " ;
t r y ( B u f f e r e d R e a d e r r e a d e r =
n e w B u f f e r e d R e a d e r ( n e w F i l e R e a d e r ( f i l e ) ) ) {
r e t u r n l o a d ( r e a d e r ) ;
} c a t c h ( I O E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s . g e t A c t i v i t y ( ) ,
g e t S t r i n g ( R . s t r i n g . r e a d _ e r r o r ) ,
T o a s t . L E N G T H _ L O N G ) ;
r e t u r n " " ;
}
}
}
10 . 14
Affichage du contenu d'un fichier
Chargement du contenu du fichier :
p u b l i c c l a s s F i l e F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e S t r i n g l o a d ( B u f f e r e d R e a d e r r e a d e r ) t h r o w s I O E x c e p t i o n {
S t r i n g B u i l d e r b u i l d e r = n e w S t r i n g B u i l d e r ( ) ;
f o r ( ; ; ) {
S t r i n g l i n e = r e a d e r . r e a d L i n e ( ) ;
i f ( l i n e = = n u l l ) b r e a k ;
b u i l d e r . a p p e n d ( l i n e ) . a p p e n d ( " \ n " ) ;
}
r e t u r n b u i l d e r . t o S t r i n g ( ) ;
}
}
10 . 15
Affichage du contenu d'un répertoire
Créa on de l'instance :
p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p u b l i c s t a t i c D i r e c t o r y F r a g m e n t n e w I n s t a n c e ( S t r i n g p a t h ) {
D i r e c t o r y F r a g m e n t f r a g m e n t = n e w D i r e c t o r y F r a g m e n t ( ) ;
B u n d l e a r g s = n e w B u n d l e ( ) ;
a r g s . p u t S t r i n g ( " p a t h " , p a t h ) ;
f r a g m e n t . s e t A r g u m e n t s ( a r g s ) ;
r e t u r n f r a g m e n t ;
}
p r i v a t e S t r i n g p a t h ( ) { r e t u r n g e t A r g u m e n t s ( ) . g e t S t r i n g ( " p a t h " ) ; }
}
10 . 16
Affichage du contenu d'un répertoire
Créa on de la vue et ges on du cycle de vie :
p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p r i v a t e S t r i n g [ ] f i l e s ;
v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
F i l e d i r e c t o r y = n e w F i l e ( p a t h ( ) ) ;
f i l e s = d i r e c t o r y . l i s t ( ) ;
s e t L i s t A d a p t e r ( n e w A r r a y A d a p t e r < > ( g e t A c t i v i t y ( ) ,
a n d r o i d . R . l a y o u t . s i m p l e _ l i s t _ i t e m _ 1 ,
a n d r o i d . R . i d . t e x t 1 , f i l e s ) ) ;
}
p u b l i c v o i d o n R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ;
g e t A c t i v i t y ( ) . s e t T i t l e ( p a t h ( ) ) ;
}
}
10 . 17
Affichage du contenu d'un répertoire
p u b l i c i n t e r f a c e O n D i r e c t o r y F r a g m e n t L i s t e n e r {
p u b l i c v o i d o n C h a n g e P a t h ( S t r i n g p a t h ) ;
}
}
10 . 18
Affichage du contenu d'un répertoire
Mise en place des no fica ons de l'ac vité :
p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p r i v a t e O n D i r e c t o r y F r a g m e n t L i s t e n e r l i s t e n e r ;
@ O v e r r i d e
p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) {
s u p e r . o n A t t a c h ( a c t i v i t y ) ;
t r y {
l i s t e n e r = ( O n D i r e c t o r y F r a g m e n t L i s t e n e r ) a c t i v i t y ;
} c a t c h ( C l a s s C a s t E x c e p t i o n e ) {
t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( )
+ " m u s t i m p l e m e n t O n D i r e c t o r y F r a g m e n t L i s t e n e r " ) ;
}
}
@ O v e r r i d e
p u b l i c v o i d o n D e t a c h ( ) { s u p e r . o n D e t a c h ( ) ; l i s t e n e r = n u l l ; }
}
10 . 19
Affichage du contenu d'un répertoire
@ O v e r r i d e
p u b l i c v o i d o n L i s t I t e m C l i c k ( L i s t V i e w l i s t ,
V i e w v i e w ,
i n t p o s i t i o n , l o n g i d ) {
s u p e r . o n L i s t I t e m C l i c k ( l i s t , v i e w , p o s i t i o n , i d ) ;
i f ( n u l l ! = l i s t e n e r ) {
S t r i n g p a t h = p a t h ( ) . e q u a l s ( " / " ) ? " " : p a t h ( ) ;
l i s t e n e r . o n C h a n g e P a t h ( p a t h + " / " + f i l e s [ p o s i t i o n ] ) ;
}
}
}
10 . 20
L'activité principale
Créa on de le la vue :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
i f ( s a v e d I n s t a n c e S t a t e = = n u l l ) {
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. a d d ( R . i d . c o n t a i n e r , D i r e c t o r y F r a g m e n t . n e w I n s t a n c e ( " / " ) )
. c o m m i t ( ) ;
}
}
}
10 . 21
L'activité principale
Récep on des no fica ons des fragments :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y
i m p l e m e n t s D i r e c t o r y F r a g m e n t . O n D i r e c t o r y F r a g m e n t L i s t e n e r {
@ O v e r r i d e
p u b l i c v o i d o n C h a n g e P a t h ( S t r i n g p a t h ) {
F i l e f i l e = n e w F i l e ( p a t h ) ;
F r a g m e n t f r a g m e n t =
( f i l e . i s D i r e c t o r y ( ) )
? D i r e c t o r y F r a g m e n t . n e w I n s t a n c e ( p a t h )
: F i l e F r a g m e n t . n e w I n s t a n c e ( p a t h ) ;
g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( )
. r e p l a c e ( R . i d . c o n t a i n e r , f r a g m e n t )
. a d d T o B a c k S t a c k ( p a t h )
. c o m m i t ( ) ;
}
10 . 22
Bases de données SQLite
Comment stocker des infos structurées dans base de données ?
Pour cela, nous allons :
définir un modèle de données (les tables) ;
représenter ce modèle sous la forme de classes ;
définir un SQL Helper pour faciliter la créa on des tables ;
voir comment modifier, consulter les données.
11 . 1
Définition du modèle
Défini on du modèle de données, c'est‐à‐dire, les tables :
p u b l i c c l a s s D a t a b a s e C o n t r a c t {
p u b l i c i n t e r f a c e A r t i c l e e x s t e n d s B a s e C o l u m n s {
S t r i n g t a b l e N a m e = " a rt i c l e s " ;
S t r i n g c o l u m n G u i d = " gu i d " ;
S t r i n g c o l u m n G u i d T y p e = " T E X T " ;
S t r i n g c o l u m n T i t l e = "
t i t l e " ;
S t r i n g c o l u m n T i t l e T y p e= " T E X T " ;
S t r i n g c o l u m n C o n t e n t = " c o n t e n t " ;
S t r i n g c o l u m n C o n t e n t T y p e = " T E X T " ;
}
}
11 . 2
Définition du SQLiteOpenHelper
Instruc ons SQL à par r de la défini on du modèle :
p u b l i c c l a s s D a t a b a s e O p e n H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {
p r i v a t e s t a t i c f i n a l S t r i n g S Q L C r e a t e T a b l e A r t i c l e s =
" C R E A T E T A B L E " + D a t a b a s e C o n t r a c t . A r t i c l e s. t a b l e N a m e + " ( " +
D a t a b a s e C o n t r a c t . A r t i c l e s . _ I D + " I N T E G E R P R I M A R Y K E Y , " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d + " " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d T y p e + " , " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e + "
" +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e T y p e+ " , " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n C o n t e n t + " " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n C o n t e n t T y p e +
" ) " ;
p r i v a t e s t a t i c f i n a l S t r i n g S Q L D e l e t e T a b l e A r t i c l e s =
" D R O P T A B L E I F E X I S T S " ` D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e ;
}
11 . 3
Définition du SQLiteOpenHelp
Créa on de la base de données :
p u b l i c c l a s s D a t a b a s e O p e n H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {
p u b l i c s t a t i c f i n a l i n t d a t a b a s e V e r s i o n = 1 ;
p u b l i c s t a t i c f i n a l S t r i n g d a t a b a s e N a m e = " a r t i c l e s . d b " ;
p u b l i c D a t a b a s e O p e n H e l p e r ( C o n t e x t c o n t e x t ) {
s u p e r ( c o n t e x t , d a t a b a s e N a m e , n u l l , d a t a b a s e V e r s i o n ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( S Q L i t e D a t a b a s e d a t a b a s e ) {
d a t a b a s e . e x e c S Q L ( S Q L C r e a t e T a b l e A r t i c l e s ) ;
}
}
11 . 4
Définition du SQLiteOpenHelper
Mise à jour de la base de données lors d'un changement de version :
p u b l i c c l a s s D a t a b a s e O p e n H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {
p u b l i c s t a t i c f i n a l i n t d a t a b a s e V e r s i o n = 1 ;
@ O v e r r i d e
p u b l i c v o i d o n U p g r a d e ( S Q L i t e D a t a b a s e d a t a b a s e , i n t o l d V e r s i o n ,
i n t n e w V e r s i o n ) {
d a t a b a s e . e x e c S Q L ( S Q L D e l e t e T a b l e A r t i c l e s ) ;
o n C r e a t e ( d a t a b a s e ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n D o w n g r a d e ( S Q L i t e D a t a b a s e d a t a b a s e , i n t o l d V e r s i o n ,
i n t n e w V e r s i o n ) {
o n U p g r a d e ( d a t a b a s e , o l d V e r s i o n , n e w V e r s i o n ) ;
}
}
11 . 5
Utilisation du SQLiteOpenHelper
Avant d'u liser le SQLiteOpenHelper, il faut l'instancier :
d a t a b a s e O p e n H e l p e r = n e w D a t a b a s e O p e n H e l p e r ( c o n t e x t ) ;
11 . 6
Utilisation du SQLiteOpenHelper
Mise en jour ( UPDATE) :
p u b l i c v o i d u p d a t e ( A r t i c l e a r t i c l e ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ;
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n C o n t e n t , a r t i c l e . c o n t e n t ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e , a r t i c l e . t i t l e ) ;
S t r i n g s e l e c t i o n = D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d ` " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { a r t i c l e . g u i d } ;
d a t a b a s e . u p d a t e ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e , v a l u e s ,
s e l e c t i o n , s e l e c t i o n A r g s ) ;
}
11 . 7
Utilisation du SQLiteOpenHelper
Suppression ( DELETE) :
p u b l i c v o i d d e l e t e ( S t r i n g g u i d ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ;
S t r i n g s e l e c t i o n = D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d ` " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { g u i d } ;
d a t a b a s e . d e l e t e ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e ,
s e l e c t i o n ,
s e l e c t i o n A r g s ) ;
}
11 . 8
Utilisation du SQLiteOpenHelper
SELECT * FROM articles :
p u b l i c C u r s o r g e t A r t i c l e s ( ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t R e a d a b l e D a t a b a s e ( ) ;
r e t u r n d a t a b a s e . q u e r y ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e ,
n u l l , n u l l , n e w S t r i n g [ ] { } , n u l l , n u l l , n u l l ) ;
}
11 . 9
Les curseurs
Les curseurs perme ent de parcourir le résultat d'une requête :
int getCount();
boolean moveToFirst();
boolean moveToNext();
void close();
...
11 . 10
Exemple d'application
11 . 11
Les tables
La structure de la base de données :
p u b l i c c l a s s D a t a b a s e C o n t r a c t {
p u b l i c i n t e r f a c e I t e m s e x t e n d s B a s e C o l u m n s {
S t r i n g t a b l e N a m e = " i t e m s " ;
S t r i n g c o l u m n T e x t = " t e x t " ;
S t r i n g c o l u m n T e x t T y p e = " T E X T " ;
}
11 . 12
Le code de l'activité principale
En supposant que nous avons écrit le SQLiteOpenHelper :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e D a t a b a s e O p e n H e l p e r d a t a b a s e O p e n H e l p e r ;
p r i v a t e I t e m A d a p t e r a d a p t e r ;
p r i v a t e E d i t T e x t e d i t T e x t ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
d a t a b a s e O p e n H e l p e r = n e w D a t a b a s e O p e n H e l p e r ( t h i s ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
r e c y c l e r V i e w = ( R e c y c l e r V i e w ) f i n d V i e w B y I d ( R . i d . r e c y c l e r V i e w ) ;
r e c y c l e r V i e w . s e t L a y o u t M a n a g e r ( n e w L i n e a r L a y o u t M a n a g e r ( t h i s ) ) ;
a d a p t e r = n e w I t e m A d a p t e r ( g e t I t e m s ( ) ) ;
r e c y c l e r V i e w . s e t A d a p t e r ( a d a p t e r ) ;
e d i t T e x t = ( E d i t T e x t ) f i n d V i e w B y I d ( R . i d . e d i t T e x t ) ;
}
}
11 . 13
Le code de l'activité principale
Les méthodes qui interagissent avec la base de données :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e D a t a b a s e O p e n H e l p e r d a t a b a s e O p e n H e l p e r ;
p r i v a t e C u r s o r g e t I t e m s ( ) {
S Q L i t e D a t a b a s e d a t a b a s e =
d a t a b a s e O p e n H e l p e r . g e t R e a d a b l e D a t a b a s e ( ) ;
r e t u r n d a t a b a s e . q u e r y ( D a t a b a s e C o n t r a c t . I t e m s . t a b l e N a m e ,
n u l l , n u l l , n e w S t r i n g [ ] { } , n u l l , n u l l , n u l l ) ;
}
p r i v a t e v o i d i n s e r t I t e m ( S t r i n g t e x t ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ;
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . I t e m s . c o l u m n T e x t , t e x t ) ;
d a t a b a s e . i n s e r t ( D a t a b a s e C o n t r a c t . I t e m s . t a b l e N a m e , n u l l , v a l u e s ) ;
}
}
11 . 14
Le code de l'activité principale
Traitement des clics sur le bouton "Ajouter" :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e I t e m A d a p t e r a d a p t e r ;
p r i v a t e E d i t T e x t e d i t T e x t ;
p u b l i c v o i d o n A d d I t e m ( V i e w v i e w ) {
i n s e r t I t e m ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
a d a p t e r . c h a n g e C u r s o r ( g e t I t e m s ( ) ) ;
e d i t T e x t . s e t T e x t ( " " ) ;
}
}
11 . 15
Le code de l'adaptateur
Créa on des vues :
p u b l i c c l a s s I t e m A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;
p u b l i c I t e m A d a p t e r ( C u r s o r c u r s o r ) {
t h i s . c u r s o r = c u r s o r ;
}
@ O v e r r i d e
p u b l i c V i e w H o l d e r o n C r e a t e V i e w H o l d e r ( V i e w G r o u p p a r e n t , i n t v i e w T y p e ) {
V i e w v i e w = L a y o u t I n f l a t e r . f r o m ( p a r e n t . g e t C o n t e x t ( ) )
. i n f l a t e ( R . l a y o u t . i t e m , p a r e n t , f a l s e ) ;
V i e w H o l d e r v i e w H o l d e r = n e w V i e w H o l d e r ( v i e w ) ;
r e t u r n v i e w H o l d e r ;
}
11 . 16
Le code de l'adaptateur
Mise à jour des vues et nombre d'éléments dans le curseur :
p u b l i c c l a s s I t e m A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;
@ O v e r r i d e
p u b l i c v o i d o n B i n d V i e w H o l d e r ( V i e w H o l d e r h o l d e r , i n t p o s i t i o n ) {
c u r s o r . m o v e T o P o s i t i o n ( p o s i t i o n ) ;
i n t i n d e x =
c u r s o r . g e t C o l u m n I n d e x ( D a t a b a s e C o n t r a c t . I t e m s . c o l u m n T e x t ) ;
S t r i n g t e x t = c u r s o r . g e t S t r i n g ( i n d e x ) ;
h o l d e r . b i n d ( t e x t ) ;
}
@ O v e r r i d e
p u b l i c i n t g e t I t e m C o u n t ( ) { r e t u r n c u r s o r . g e t C o u n t ( ) ; }
11 . 17
Le code de l'adaptateur
Changement de curseur :
p u b l i c c l a s s I t e m A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;
p u b l i c v o i d c h a n g e C u r s o r ( C u r s o r c u r s o r ) {
t h i s . c u r s o r . c l o s e ( ) ;
t h i s . c u r s o r = c u r s o r ;
n o t i f y D a t a S e t C h a n g e d ( ) ;
}
11 . 18
Le code de ViewHolder
p u b l i c c l a s s V i e w H o l d e r e x t e n d s R e c y c l e r V i e w . V i e w H o l d e r {
p r i v a t e f i n a l T e x t V i e w t e x t V i e w ;
p u b l i c V i e w H o l d e r ( V i e w i t e m V i e w ) {
s u p e r ( i t e m V i e w ) ;
t e x t V i e w = ( T e x t V i e w ) i t e m V i e w . f i n d V i e w B y I d ( R . i d . t e x t ) ;
}
p u b l i c v o i d b i n d ( S t r i n g t e x t ) {
t e x t V i e w . s e t T e x t ( t e x t ) ;
}
}
11 . 19
Fournisseur de contenu
Un fournisseur de contenu est un composant d'une applica on
Il permet l'accès à des données
Il présente les données sous la forme d'une ou plusieurs tables
Chaque ligne possède un iden fiant
12 . 1
Fournisseur de contenu
On accède à un fournisseur de contenu via un ContentResolver
C o n t e n t R e s o l v e r c o n t e n t R e s o l v e r = c o n t e x t . g e t C o n t e n t R e s o l v e r ( ) ;
Il permet les quatres opéra ons de base (CRUD) :
Create : contentResolver.insert
Read : contentResolver.query
Update : contentResolver.update
Delete : contentResolver.delete
12 . 2
Content URIs
Un URI (Uniform Resource Iden fier) iden fie une donnée
La classe Uri va nous perme re de manipuler des URI
S t r i n g a u t h o r i t y = " c o m . u n i v _ a m u . c c i " ;
S t r i n g u s e r s = " u s e r s " ;
U r i c o n t e n t U r i = U r i . p a r s e ( " c o n t e n t : / / " + a u t h o r i t y + " / " + u s e r s ) ;
/ / - > c o n t e n t : / / c o m . u n i v _ a m u . c c i / u s e r s
U r i u s e r 2 U r i = C o n t e n t U r i s . w i t h A p p e n d e d I d ( c o n t e n t U r i , 2 ) ;
/ / - > c o n t e n t : / / c o m . u n i v _ a m u . c c i / u s e r s / 2
Pour faire une requête, il faut un Uri :
c u r s o r = c o n t e n t R e s o l v e r . q u e r y ( c o n t e n t U r i , / * . . . * / ) ;
c o n t e n t R e s o l v e r . i n s e r t ( c o n t e n t U r i , / * . . . * / ) ;
c o n t e n t R e s o l v e r . d e l e t e ( u s e r 2 U r i , / * . . . * / ) ;
12 . 3
Schéma de la base de données
p u b l i c c l a s s C o n t r a c t {
p u b l i c s t a t i c f i n a l S t r i n g A U T H O R I T Y = " c o m . u n i v _ a m u . c c i " ;
p u b l i c s t a t i c f i n a l S t r i n g U S E R S = " u s e r s " ;
p u b l i c s t a t i c f i n a l U r i C O N T E N T _ U R I =
U r i . p a r s e ( " c o n t e n t : / / " + A U T H O R I T Y + " / " + U S E R S ) ;
p u b l i c i n t e r f a c e U s e r s e x t e n d s B a s e C o l u m n s {
S t r i n g F I R S T N A M E = " F I R S T N A M E " ;
S t r i n g L A S T N A M E = " L A S T N A M E " ;
}
}
12 . 4
Effectuer d'une requête
c u r s o r = c o n t e n t R e s o l v e r . q u e r y ( C o n t r a c t . C O N T E N T _ U R I ,
p r o j e c t i o n , s e l e c t i o n , s e l e c t i o n A r g s , s o r t O r d e r ) ;
Selec on des colonnes
S t r i n g [ ] p r o j e c t i o n = { C o n t r a c t . U s e r s . _ I D ,
C o n t r a c t . U s e r s . F I R S T N A M E ,
C o n t r a c t . U s e r s . L A S T N A M E } ;
Ajout d'une clause "where"
S t r i n g s e l e c t i o n = C o n t r a c t . U s e r s . F I R S T N A M E + " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { " B o b " } ;
Ajout d'un "order by"
S t r i n g s o r t O r d e r = C o n t r a c t . U s e r s . L A S T N A M E + " A S C " ;
S e l e c t _ I D , F I R S T N A M E , L A S T N A M E
F R O M U S E R S W H E R E F I R S T N A M E = ' b o b ' O R D E R B Y L A S T N A M E A S C ;
12 . 5
Insérer des données
n e w U r i = c o n t e n t R e s o l v e r . i n s e r t ( C o n t r a c t . C O N T E N T _ U R I , v a l u e s ) ;
Les valeurs à ajouer
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( C o n t r a c t . U s e r s . F I R S T N A M E , " B o b " ) ;
v a l u e s . p u t ( C o n t r a c t . U s e r s . L A S T N A M E , " M a c h i n " ) ;
Uri retourné
c o n t e n t : / / c o m . u n i v _ a m u . c c i / u s e r s / [ i d e n t i f i a n t d e l a n o u v e l l e l i g n e ]
12 . 6
Modifier des données
r o w s U p d a t e d C o u n t = c o n t e n t R e s o l v e r . u p d a t e ( C o n t r a c t . C O N T E N T _ U R I ,
v a l u e s , s e l e c t i o n , s e l e c t i o n A r g s ) ;
Données à me re à jour
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( C o n t r a c t . U s e r s . L A S T N A M E , " T r u c " ) ;
Ajout d'une clause "where"
S t r i n g s e l e c t i o n = C o n t r a c t . U s e r s . F I R S T N A M E + " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { " B o b " } ;
12 . 7
Supprimer des données
r o w s D e l e t e d C o u n t = c o n t e n t R e s o l v e r . d e l e t e ( C o n t r a c t . C O N T E N T _ U R I ,
s e l e c t i o n , s e l e c t i o n A r g s ) ;
Ajout d'une clause "where"
S t r i n g s e l e c t i o n = C o n t r a c t . U s e r s . F I R S T N A M E + " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { " B o b " } ;
D E L E T E F R O M U S E R S W H E R E F I R S T N A M E = " B o b " ;
12 . 8
Implémentation d'un fournisseur de contenu
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
@ O v e r r i d e
p u b l i c b o o l e a n o n C r e a t e ( ) { / * . . . * / }
@ O v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i ,
S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) { / * . . . * / }
@ O v e r r i d e
p u b l i c C u r s o r i n s e r t ( U r i u r i , C o n t e n t V a l u e s v a l u e s ) { / * . . . * / }
@ O v e r r i d e
p u b l i c C u r s o r u p d a t e ( U r i u r i , C o n t e n t V a l u e s v a l u e s ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) { / * . . . * / }
@ O v e r r i d e
p u b l i c C u r s o r d e l e t e ( U r i u r i ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) { / * . . . * / }
@ O v e r r i d e
p u b l i c S t r i n g g e t T y p e ( U r i u r i ) { / * . . . * / }
}
12 . 9
Déclaration du fournisseur de contenu
Dans le manifeste de l'applica on :
< m a n i f e s t . . . >
< a p p l i c a t i o n . . . >
. . .
< pr o v i d e r
a n d r o i d : a u t h o r i t i e s = " c o m . u n i v _ a m u . c c i "
a n d r o i d : n a m e = " . U s e r s P r o v i d e r "
a n d r o i d : e x p o r t e d = " t r u e " / >
< a p p l i c a t i o n >
< / m a n i f e s t >
12 . 10
DatabaseHelper pour SQLite
p u b l i c c l a s s U s e r D a t a b a s e H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {
p r i v a t e s t a t i c f i n a l i n t D A T A B A S E _ V E R S I O N = 1 ;
p u b l i c s t a t i c f i n a l S t r i n g D A T A B A S E _ N A M E = " u s e r s . d b " ;
p u b l i c U s e r D a t a b a s e H e l p e r ( C o n t e x t c o n t e x t ) {
s u p e r ( c o n t e x t , D A T A B A S E _ N A M E , n u l l , D A T A B A S E _ V E R S I O N ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( S Q L i t e D a t a b a s e d b ) { c r e a t e T a b l e ( d b ) ; }
@ O v e r r i d e
p u b l i c v o i d o n U p g r a d e ( S Q L i t e D a t a b a s e d b , i n t o l d V e r s i o n , i n t n e w V e r s i o n ) {
d r o p T a b l e ( d b ) ; o n C r e a t e ( d b ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n D o w n g r a d e ( S Q L i t e D a t a b a s e d b , i n t o l d V e r s i o n , i n t n e w V e r s i o n ) {
o n U p g r a d e ( d b , o l d V e r s i o n , n e w V e r s i o n ) ;
}
p r i v a t e s t a t i c v o i d c r e a t e T a b l e ( S Q L i t e D a t a b a s e d b ) { / * . . * / }
p r i v a t e s t a t i c v o i d d r o p T a b l e ( S Q L i t e D a t a b a s e d b ) { / * . . . * / }
}
12 . 11
Utilisation du DatabaseHelper
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
p r i v a t e U s e r D a t a b a s e H e l p e r o p e n H e l p e r ;
@ O v e r r i d e
p u b l i c b o o l e a n o n C r e a t e ( ) {
o p e n H e l p e r = n e w U s e r D a t a b a s e H e l p e r ( g e t C o n t e x t ( ) ) ;
}
@ O v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i ,
S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) {
S Q L i t e D a t a b a s e d a t a b a s e = o p e n H e l p e r . g e t R e a d a b l e D a t a b a s e ( ) ; / * . . . * /
}
@ O v e r r i d e
p u b l i c C u r s o r u p d a t e ( U r i u r i , C o n t e n t V a l u e s v a l u e s ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) {
S Q L i t e D a t a b a s e d a t a b a s e = o p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; / * . . . * /
}
/ * . . . * /
}
12 . 12
Détection du type d'URI
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
p r i v a t e s t a t i c f i n a l i n t U S E R S = 1 ;
p r i v a t e s t a t i c f i n a l i n t U S E R S _ I D = 2 ;
p r i v a t e s t a t i c f i n a l U r i M a t c h e r u r i M a t c h e r =
n e w U r i M a t c h e r ( U r i M a t c h e r . N O _ M A T C H ) ;
s t a t i c {
u r i M a t c h e r . a d d U R I ( C o n t r a c t . A U T H O R I T Y , C o n t r a c t . U S E R S , U S E R S ) ;
u r i M a t c h e r . a d d U R I ( C o n t r a c t . A U T H O R I T Y , C o n t r a c t . U S E R S + " / # " , U S E R S _ I D ) ;
}
@ O v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i , S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) {
s w i t c h ( u r i M a t c h e r . m a t c h ( u r i ) ) {
c a s e A L A R M S : / * . . . * / b r e a k ;
c a s e A L A R M S _ I D :
S t r i n g i d = u r i . g e t L a s t P a t h S e g m e n t ( ) ;
/ * . . . * / b r e a k ;
d e f a u l t : t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( " U n k n o w n U R I " + u r i ) ;
} / * . . . * /
}
12 . 13
Type MIME (Multipurpose Internet Mail Extensions)
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
/ * . . . * /
@ O v e r r i d e
p u b l i c S t r i n g g e t T y p e ( U r i u r i ) {
s w i t c h ( u r i M a t c h e r . m a t c h ( u r i ) ) {
c a s e U S E R S :
r e t u r n " v n d . a n d r o i d . c u r s o r . d i r / v n d . c o m . u n i v _ a m u . c c i . u s e r s " ;
c a s e U S E R S _ I D :
r e t u r n " v n d . a n d r o i d . c u r s o r . i t e m / v n d . c o m . u n i v _ a m u . c c i . u s e r s " ;
d e f a u l t :
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( " U n k n o w n U R I " + u r i ) ;
}
}
}
Descrip on du type des données retournées par un URI
Format : vnd.android.cursor.[dir|item]/vnd.<name>.<type>
12 . 14
Adaptateur utilisant un fournisseur de contenu
p u b l i c c l a s s U s e r s A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < U s e r V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;
@ O v e r r i d e
p u b l i c v o i d o n B i n d V i e w H o l d e r ( U s e r V i e w H o l d e r v i e w H o l d e r , i n t p o s i t i o n ) {
i f ( ! c u r s o r . m o v e T o P o s i t i o n ( p o s i t i o n ) ) { r e t u r n ; }
v i e w H o l d e r . b i n d ( c u r s o r ) ;
}
@ O v e r r i d e
p u b l i c i n t g e t I t e m C o u n t ( ) {
r e t u r n c u r s o r = = n u l l ? 0 : c u r s o r . g e t C o u n t ( ) ;
}
p u b l i c v o i d s w a p C u r s o r ( C u r s o r c u r s o r ) {
i f ( t h i s . c u r s o r = = c u r s o r ) { r e t u r n ; }
i f ( t h i s . c u r s o r ! = n u l l ) { t h i s . c u r s o r . c l o s e ( ) ; }
t h i s . c u r s o r = c u r s o r ;
n o t i f y D a t a S e t C h a n g e d ( ) ;
}
/ * . . . * /
}
12 . 15
Chargement des curseurs
p u b l i c c l a s s U s e r F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e U s e r s A d a p t e r a d a p t e r ;
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
g e t L o a d e r M a n a g e r ( ) . i n i t L o a d e r ( 0 , n u l l , n e w L o a d e r C a l l b a c k s ( ) ) ;
}
@ O v e r r i d e
p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r , V i e w G r o u p c o n t a i n e r ,
B u n d l e s a v e d I n s t a n c e S t a t e ) {
a d a p t e r = n e w U s e r s A d a p t e r ( ) ;
/ * . . . * /
}
p r i v a t e c l a s s L o a d e r C a l l b a c k s
i m p l e m e n t s L o a d e r M a n a g e r . L o a d e r C a l l b a c k s < C u r s o r > {
/ * . . . * /
}
12 . 16
Chargement des curseurs
p u b l i c c l a s s U s e r F r a g m e n t e x t e n d s F r a g m e n t {
p r i v a t e U s e r s A d a p t e r a d a p t e r ;
/ * . . . * /
p r i v a t e c l a s s L o a d e r C a l l b a c k s
i m p l e m e n t s L o a d e r M a n a g e r . L o a d e r C a l l b a c k s < C u r s o r > {
@ O v e r r i d e
p u b l i c L o a d e r o n C r e a t e L o a d e r ( i n t i d , B u n d l e a r g s ) {
r e t u r n n e w C u r s o r L o a d e r ( g e t A c t i v i t y ( ) , C o n t r a c t . C O N T E N T _ U R I ,
n u l l , n u l l , n u l l , n u l l ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n L o a d F i n i s h e d ( L o a d e r l o a d e r , C u r s o r d a t a ) {
a d a p t e r . s w a p C u r s o r ( d a t a ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n L o a d e r R e s e t ( L o a d e r l o a d e r ) { a d a p t e r . s w a p C u r s o r ( n u l l ) ; }
}
12 . 17
Notification des modifications
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
@ O v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i , S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) {
C u r s o r c u r s o r = / * . . . . * /
c u r s o r . s e t N o t i f i c a t i o n U r i ( g e t C o n t e x t ( ) . g e t C o n t e n t R e s o l v e r ( ) , u r i ) ;
r e t u r n c u r s o r ;
}
@ O v e r r i d e
p u b l i c C u r s o r u p d a t e ( U r i u r i , C o n t e n t V a l u e s v a l u e s ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) {
g e t C o n t e x t ( ) . g e t C o n t e n t R e s o l v e r ( ) . n o t i f y C h a n g e ( u r i , n u l l ) ;
}
/ * . . . * /
Le curseur sera redemandé à chaque modifica on
12 . 18
Animation dans les RecyclerView
p u b l i c c l a s s U s e r s A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < U s e r V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;
p u b l i c U s e r s A d a p t e r ( ) { s e t H a s S t a b l e I d s ( t r u e ) ; }
@ O v e r r i d e
p u b l i c l o n g g e t I t e m I d ( i n t p o s i t i o n ) {
i f ( c u r s o r = = n u l l | | ! c u r s o r . m o v e T o P o s i t i o n ( p o s i t i o n ) ) {
r e t u r n R e c y c l e r V i e w . N O _ I D ;
}
r e t u r n c u r s o r . g e t L o n g ( c u r s o r . g e t C o l u m n I n d e x ( C o n t r a c t . U s e r s . _ I D ) ) ;
}
/ * . . . * /
}
Les RecyclerView peuvent animer la modifica on de la liste :
Les iden fiants doivent être stables
Il faut implémenter la méthode getItemId
12 . 19
Services
Un service est un composant
Il ne fournit pas d'interface u lisateur
Il peut exécuter des tâches de fond
Un service peut être démarré par une autre applica on
Un composant peut s'a acher (bind) à un service
Cela lui permet de communiquer avec le service
Entre applica ons, communica ons inter‐processus (IPC)
13 . 1
Les deux types de service
"Started"
Le service est démarré en u lisant startService :
I n t e n t i n t e n t = n e w I n t e n t ( c o n t e x t , D o w n l o a d S e r v i c e . c l a s s ) ;
i n t e n t . s e t D a t a ( U r i . p a r s e ( u r l ) ) ;
c o n t e x t . s t a r t S e r v i c e ( d o w n l o a d I n t e n t ) ;
"Bound"
Le service est a aché au composant en u lisant bindService :
I n t e n t i n t e n t = n e w I n t e n t ( t h i s , L o c a l S e r v i c e . c l a s s ) ;
c o n n e c t i o n = n e w S e r v i c e C o n n e c t i o n ( ) {
@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e C o n n e c t e d ( C o m p o n e n t N a m e n a m e , I B i n d e r s e r v i c e ) { . . . }
@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e D i s c o n n e c t e d ( C o m p o n e n t N a m e n a m e ) { . . . }
} ;
c o n t e x t . b i n d S e r v i c e ( i n t e n t , c o n n e c t i o n , C o n t e x t . B I N D _ A U T O _ C R E A T E ) ;
13 . 2
Création d'un service
p u b l i c c l a s s M y S e r v i c e e x t e n d s S e r v i c e {
@ O v e r r i d e
p u b l i c v o i d o n C r e a t e ( ) { . . . }
@ O v e r r i d e
p u b l i c i n t o n S t a r t C o m m a n d ( I n t e n t i n t e n t , i n t f l a g s , i n t s t a r t I d ) {
/ / P o u r r e d é m a r r e r a u t o m a t i q u e m e n t s i l e s e r v i c e e s t t u é :
r e t u r n S T A R T _ S T I C K Y ;
}
@ O v e r r i d e
p u b l i c I B i n d e r o n B i n d ( I n t e n t i n t e n t ) { . . . }
@ O v e r r i d e
p u b l i c b o o l e a n o n U n b i n d ( I n t e n t i n t e n t ) { . . . }
@ O v e r r i d e
p u b l i c v o i d o n R e b i n d ( I n t e n t i n t e n t ) { . . . }
@ O v e r r i d e
p u b l i c b o o l e a n s t o p S e r v i c e ( I n t e n t i n t e n t ) {
. . .
r e t u r n s u p e r . s t o p S e r v i c e ( i n t e n t ) ;
}
@ O v e r r i d e
p u b l i c v o i d o n D e s t r o y ( ) { . . . } 13 . 3
}
< m a n i f e s t . . . >
< a p p l i c a t i o n . . . >
. . .
< s e r v i c e a n d r o i d : n a m e = " . M y S e r v i c e " a n d r o i d : e x p o r t e d = " f a l s e " / >
< / a p p l i c a t i o n >
< / m a n i f e s t >
13 . 4
Cycle de vie d'un service
Work created and shared by the Android Open Source Project and used according to terms described in the Crea ve Commons 2.5 A ribu on License
13 . 5
Arrêt d'un service "started"
Le système peut arrêter le service s'il a besoin de mémoire
Le système peut s'arrêter lui‐même en u lisant stopSelf()
Un composant peut demander l'arrêt du service :
I n t e n t i n t e n t = n e w I n t e n t ( c o n t e x t , M y S e r v i c e . c l a s s ) ;
c o n t e x t . s t o p S e r v i c e ( i n t e n t ) ;
stopService(Intent intent) du service est alors appelée
Il est important de ne pas arrêter un service qui travaille
Les startId de onStartCommand peuvent être conservés :
p u b l i c i n t o n S t a r t C o m m a n d ( I n t e n t i n t e n t , i n t f l a g s , i n t s t a r t I d )
p u b l i c c l a s s L o c a l S e r v i c e e x t e n d s S e r v i c e {
p r i v a t e f i n a l I B i n d e r b i n d e r = n e w L o c a l B i n d e r ( ) ;
p r i v a t e f i n a l R a n d o m g e n e r a t o r = n e w R a n d o m ( ) ;
p u b l i c c l a s s L o c a l B i n d e r e x t e n d s B i n d e r {
L o c a l S e r v i c e g e t S e r v i c e ( ) {
r e t u r n L o c a l S e r v i c e . t h i s ;
}
}
@ O v e r r i d e
p u b l i c I B i n d e r o n B i n d ( I n t e n t i n t e n t ) {
r e t u r n b i n d e r ;
}
p u b l i c i n t g e t R a n d o m N u m b e r ( ) {
r e t u r n g e n e r a t o r . n e x t I n t ( 1 0 0 ) ;
}
}
13 . 7
Connexion à un service de la même application
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
L o c a l S e r v i c e s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
@ O v e r r i d e
p r o t e c t e d v o i d o n S t a r t ( ) {
s u p e r . o n S t a r t ( ) ;
I n t e n t i n t e n t = n e w I n t e n t ( t h i s , L o c a l S e r v i c e . c l a s s ) ;
b i n d S e r v i c e ( i n t e n t , c o n n e c t i o n , C o n t e x t . B I N D _ A U T O _ C R E A T E ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n S t o p ( ) {
s u p e r . o n S t o p ( ) ;
i f ( b o u n d ) { u n b i n d S e r v i c e ( c o n n e c t i o n ) ; b o u n d = f a l s e ; }
}
/ * . . . * /
}
13 . 8
Connexion à un service de la même application
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
L o c a l S e r v i c e s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
/ * . . . * /
p r i v a t e S e r v i c e C o n n e c t i o n c o n n e c t i o n = n e w S e r v i c e C o n n e c t i o n ( ) {
@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e C o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ,
I B i n d e r i B i n d e r ) {
L o c a l S e r v i c e . L o c a l B i n d e r b i n d e r =
( L o c a l S e r v i c e . L o c a l B i n d e r ) i B i n d e r ;
M y A c t i v i t y . t h i s . s e r v i c e = b i n d e r . g e t S e r v i c e ( ) ;
b o u n d = t r u e ;
}
@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e D i s c o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ) {
b o u n d = f a l s e ;
}
} ;
}
13 . 9
Utilisation du service
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
L o c a l S e r v i c e s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
/ * . . . * /
p u b l i c i n t g e t N u m b e r F r o m S e r v i c e ( ) {
r e t u r n ( b o u n d ) ? s e r v i c e . g e t R a n d o m N u m b e r ( ) : 0 ;
}
/ * . . . * /
}
13 . 10
Création d'un service "bound" accessible d'une autre application
p u b l i c c l a s s M e s s e n g e r S e r v i c e e x t e n d s S e r v i c e {
p r i v a t e f i n a l R a n d o m g e n e r a t o r = n e w R a n d o m ( ) ;
c l a s s I n c o m i n g H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
i n t n u m b e r = g e n e r a t o r . n e x t I n t ( m s g . a r g 2 - m s g . a r g 1 + 1 ) + m s g . a r g 1 ;
/ * T O D O : e n v o y e r l a r é p o n s e * /
}
}
f i n a l M e s s e n g e r m e s s e n g e r = n e w M e s s e n g e r ( n e w I n c o m i n g H a n d l e r ( ) ) ;
@ O v e r r i d e
p u b l i c I B i n d e r o n B i n d ( I n t e n t i n t e n t ) {
r e t u r n m e s s e n g e r . g e t B i n d e r ( ) ;
}
}
13 . 11
Connexion au service
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
@ O v e r r i d e
p r o t e c t e d v o i d o n S t a r t ( ) {
s u p e r . o n S t a r t ( ) ;
I n t e n t i n t e n t = n e w I n t e n t ( t h i s , M e s s e n g e r S e r v i c e . c l a s s ) ;
b i n d S e r v i c e ( i n t e n t , c o n n e c t i o n , C o n t e x t . B I N D _ A U T O _ C R E A T E ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n S t o p ( ) {
s u p e r . o n S t o p ( ) ;
i f ( b o u n d ) { u n b i n d S e r v i c e ( c o n n e c t i o n ) ; b o u n d = f a l s e ; }
}
/ * . . . * /
}
13 . 12
Connexion au service
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
/ * . . . * /
p r i v a t e S e r v i c e C o n n e c t i o n c o n n e c t i o n = n e w S e r v i c e C o n n e c t i o n ( ) {
@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e C o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ,
I B i n d e r i B i n d e r ) {
M y A c t i v i t y . t h i s . s e r v i c e = n e w M e s s e n g e r ( i B i n d e r ) ;
b o u n d = t r u e ;
}
@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e D i s c o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ) {
b o u n d = f a l s e ;
}
} ;
}
13 . 13
Communication avec le service
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
/ * . . . * /
p u b l i c v o i d g e t N u m b e r F r o m S e r v i c e ( ) {
i f ( b o u n d ) {
M e s s a g e m s g = M e s s a g e . o b t a i n ( n u l l , 0 , 2 0 , 1 0 0 ) ;
t r y { s e r v i c e . s e n d ( m s g ) ; }
c a t c h ( R e m o t e E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) ; }
}
}
/ * . . . * /
}
p u b l i c c l a s s M e s s e n g e r S e r v i c e e x t e n d s S e r v i c e {
c l a s s I n c o m i n g H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
i n t n u m b e r = g e n e r a t o r . n e x t I n t ( m s g . a r g 2 - m s g . a r g 1 + 1 ) + m s g . a r g 1 ;
/ * T O D O : e n v o y e r l a r é p o n s e * /
}
}
}
13 . 14
Ajout d'un replyTo pour recevoir la réponse
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
/ * . . . * /
p u b l i c v o i d g e t N u m b e r F r o m S e r v i c e ( ) {
i f ( b o u n d ) {
M e s s a g e m s g = M e s s a g e . o b t a i n ( n u l l , 0 , 2 0 , 1 0 0 ) ;
t r y { m s g . r e p l y T o = m e s s e n g e r ; s e r v i c e . s e n d ( m s g ) ; }
c a t c h ( R e m o t e E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) ; }
}
}
c l a s s R e s u l t H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
L o g . d ( " M y A c t i v i t y " , " R e s u l t : " + m s g . a r g 1 ) ;
}
}
f i n a l M e s s e n g e r m e s s e n g e r = n e w M e s s e n g e r ( n e w R e s u l t H a n d l e r ( ) ) ;
}
13 . 15
Communication de la réponse par le service
p u b l i c c l a s s M e s s e n g e r S e r v i c e e x t e n d s S e r v i c e {
p r i v a t e f i n a l R a n d o m g e n e r a t o r = n e w R a n d o m ( ) ;
c l a s s I n c o m i n g H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
i n t n u m b e r = g e n e r a t o r . n e x t I n t ( m s g . a r g 2 - m s g . a r g 1 + 1 ) + m s g . a r g 1 ;
M e s s a g e r e s u l t M e s s a g e = M e s s a g e . o b t a i n ( n u l l , 0 , n u m b e r , 0 ) ;
t r y {
m s g . r e p l y T o . s e n d ( r e s u l t M e s s a g e ) ;
} c a t c h ( R e m o t e E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
}
}
/ * . . . * /
}
13 . 16
Service en premier plan
13 . 17
Service en premier plan
Passage en premier plan :
N o t i f i c a t i o n n o t i f i c a t i o n = n e w N o t i f i c a t i o n . B u i l d e r ( t h i s )
. s e t C o n t e n t T i t l e ( " M y n o t i f i c a t i o n " )
. s e t C o n t e n t T e x t ( " C o n t e n t t e x t " )
. s e t S m a l l I c o n ( R . d r a w a b l e . i c o n )
. b u i l d ( ) ;
I n t e n t n o t i f i c a t i o n I n t e n t = n e w I n t e n t ( t h i s , M y A c t i v i t y . c l a s s ) ;
P e n d i n g I n t e n t p e n d i n g I n t e n t =
P e n d i n g I n t e n t . g e t A c t i v i t y ( t h i s , 0 , n o t i f i c a t i o n I n t e n t , 0 ) ;
s t a r t F o r e g r o u n d ( N O T I F I C A T I O N _ I D , n o t i f i c a t i o n ) ;
Sor e du premier plan :
s t o p F o r e g r o u n d ( t r u e / * p o u r s u p p r i m e r l a n o t i f i c a t i o n * / ) ;
13 . 18
Cycle de vie des processus
Android classe les processus par ordre d'importance :
1. Foreground process
Ac vité en cours d'u lisa on par l'u lisateur
Service connecté à une ac vité en cours d'u lisa on
Service qui a appelé startForeground()
Service qui exécute une de ses callbacks
BroadcastReceiver qui exécute onReceive
2. Visible process
Ac vité visible
Service connecté à une ac vité visible
13 . 19
Cycle de vie des processus
3. Service process
Service qui a été démarré avec startService
4. Background process
Con ent des composants
5. Empty process
Ne con ent rien
13 . 20
Les threads
Les threads sont des processus léger ou fils d'exécu on
Les threads s'exécutent (ou semblent s'exécuter) en parallèle
Les threads d'un même processus partagent une zone mémoire
Sous Android, une applica on n'u lise qu'un thread principal
Seul le thread principal peut modifier les vues de l'interface
Le thread principal gère la queue d'événements
14 . 1
Un exemple
Client Server
Main Thread
draw UI
Download Thread
onClick
Connection
...
Download
...
Notify UI
UpdateView
draw UI
...
14 . 2
L'interface Runnable et la classe Thread
L'interface Runnable :
p u b l i c i n t e r f a c e R u n n a b l e { v o i d r u n ( ) ; }
Défini on d'une tâche à exécuter :
p u b l i c c l a s s D o w n l o a d T a s k i m p l e m e n t s R u n n a b l e {
p u b l i c v o i d r u n ( ) { / * T O D O D o w n l o a d * / }
}
Créa on d'un nouveau thread :
T h r e a d t h r e a d = n e w T h r e a d ( n e w D o w n l o a d T a s k ( ) ) ;
Exécu on du thread :
t h r e a d . s t a r t ( ) ;
14 . 3
Synchronisation avec le thread principal
Seul le thread principal peut modifier les vues de l'interface :
p u b l i c c l a s s D o w n l o a d T a s k i m p l e m e n t s R u n n a b l e {
p r i v a t e f i n a l I m a g e V i e w i m a g e V i e w ;
p u b l i c D o w n l o a d T a s k ( I m a g e V i e w i m a g e V i e w ) {
t h i s . i m a g e V i e w = i m a g e V i e w ;
}
p u b l i c v o i d r u n ( ) {
B i t m a p b i t m a p = l o a d I m a g e ( " h t t p : / / e x a m p l e . c o m / a . j p g " ) ;
/ * I N T E R D I T : i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ; * /
}
}
14 . 4
Synchronisation avec le thread principal
Réintégra on dans le thread principal :
p u b l i c v o i d r u n ( ) {
B i t m a p b i t m a p = l o a d I m a g e ( " h t t p : / / e x a m p l e . c o m / a . j p g " ) ;
i m a g e V i e w . p o s t ( n e w R u n n a b l e ( ) {
p u b l i c v o i d r u n ( ) { i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ; }
} ) ;
}
Pour exécuter des tâches dans le thread principal :
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
14 . 5
La classe AsyncTask
p u b l i c I m a g e D o w n l o a d e r ( I m a g e V i e w i m a g e V i e w ) { t h i s . v i e w = i m a g e V i e w ; }
@ O v e r r i d e
p r o t e c t e d B i t m a p d o I n B a c k g r o u n d ( U R L . . . u r l s ) {
r e t u r n d o w n l o a d I m a g e ( u r l s [ 0 ] ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n P o s t E x e c u t e ( B i t m a p b i t m a p ) {
v i e w . s e t I m a g e B i t m a p ( b i t m a p ) ;
}
}
14 . 6
La classe AsyncTask
Les autres méthodes de AsyncTask :
void onPreExecute()
void onProgressUpdate(Progress... values)
void publishProgress(Progress... values)
void onCancelled(Result result)
boolean cancel(boolean mayInterruptIfRunning)
boolean isCancelled()
14 . 7
Exemple - Connexion réseau
14 . 8
Exemple - Connexion réseau
Nous devons :
Ajouter une permission à l'applica on
Créer un thread
Ouvrir une connexion
Lire les données provenant d'un flux
Injecter les données téléchargées dans l'applica on
14 . 9
Exemple - Connexion réseau
Ajout des droits dans le manifeste de l'applica on :
< m a n i f e s t
x m l n s : a n d r o i d = " . . . . "
p a c k a g e = " c o m . u n i v _ a m u . c c i . i m a g e d o w n l o a d e r " >
< u s e s - p e r m i s s i o n
a n d r o i d : n a m e = " a n d r o i d . p e r m i s s i o n . I N T E R N E T " / >
< ! - - . . . . - - >
< / m a n i f e s t >
14 . 10
Exemple - Connexion réseau
Créa on de la tâche perme ant le téléchargement de l'image :
p u b l i c c l a s s I m a g e D o w n l o a d e r e x t e n d s A s y n c T a s k < U R L , I n t e g e r , B i t m a p > {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p u b l i c I m a g e D o w n l o a d e r ( I m a g e V i e w i m a g e V i e w ) {
t h i s . i m a g e V i e w = i m a g e V i e w ;
}
@ O v e r r i d e
p r o t e c t e d B i t m a p d o I n B a c k g r o u n d ( U R L . . . u r l s ) {
U R L u r l = u r l s [ 0 ] ;
t r y ( I n p u t S t r e a m s t r e a m = u r l . o p e n C o n n e c t i o n ( ) . g e t I n p u t S t r e a m ( ) ) {
B i t m a p b i t m a p = B i t m a p F a c t o r y . d e c o d e S t r e a m ( s t r e a m ) ;
r e t u r n b i t m a p ;
} c a t c h ( I O E x c e p t i o n e ) { r e t u r n n u l l ; }
}
/ * . . . * /
14 . 11
Exemple - Connexion réseau
Créa on de la tâche perme ant le téléchargement de l'image :
p u b l i c c l a s s I m a g e D o w n l o a d e r e x t e n d s A s y n c T a s k < U R L , I n t e g e r , B i t m a p > {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p u b l i c I m a g e D o w n l o a d e r ( I m a g e V i e w i m a g e V i e w ) {
t h i s . i m a g e V i e w = i m a g e V i e w ;
}
@ O v e r r i d e
p r o t e c t e d B i t m a p d o I n B a c k g r o u n d ( U R L . . . u r l s ) {
/ * . . . * /
}
@ O v e r r i d e
p r o t e c t e d v o i d o n P o s t E x e c u t e ( B i t m a p b i t m a p ) {
i f ( b i t m a p ! = n u l l )
i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ;
}
}
14 . 12
Exemple - Connexion réseau
L'ac vité principale :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e E d i t T e x t u r l E d i t T e x t ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ;
i m a g e V i e w = ( I m a g e V i e w ) f i n d V i e w B y I d ( R . i d . i m a g e V i e w ) ;
u r l E d i t T e x t = ( E d i t T e x t ) f i n d V i e w B y I d ( R . i d . u r l E d i t T e x t ) ;
}
}
14 . 13
Exemple - Connexion réseau
L'ac vité principale :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e E d i t T e x t u r l E d i t T e x t ;
/ * . . . * /
p u b l i c v o i d o n C l i c k ( V i e w v i e w ) {
I m a g e D o w n l o a d e r i m a g e D o w n l o a d e r = n e w I m a g e D o w n l o a d e r ( i m a g e V i e w ) ;
t r y {
U R L u r l = n e w U R L ( u r l E d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
i m a g e D o w n l o a d e r . e x e c u t e ( u r l ) ;
} c a t c h ( M a l f o r m e d U R L E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s ,
g e t S t r i n g ( R . s t r i n g . m a l f o r m e d _ u r l ) ,
T o a s t . L E N G T H _ L O N G ) . s h o w ( ) ;
}
}
}
14 . 14
Services et threads
Nous voulons créer un service pour télécharger des images
Ce service doit :
14 . 15
IntentService
La classe IntentService étend Service et permet de réaliser cela :
p u b l i c c l a s s M y I n t e n t S e r v i c e e x t e n d s I n t e n t S e r v i c e {
p u b l i c M y I n t e n t S e r v i c e ( ) {
s u p e r ( " M y I n t e n t S e r v i c e " ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n H a n d l e I n t e n t ( I n t e n t i n t e n t ) {
t r y {
T h r e a d . s l e e p ( 5 0 0 0 ) ;
} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {
T h r e a d . c u r r e n t T h r e a d ( ) . i n t e r r u p t ( ) ;
}
}
}
Le service est arrêté quand tous les traitements ont été effectués
14 . 16
Communication de l'URL à télécharger
p u b l i c c l a s s D o w n l o a d e r S e r v i c e e x t e n d s I n t e n t S e r v i c e {
p u b l i c s t a t i c f i n a l S t r i n g U R L = " u r l " ;
p u b l i c s t a t i c f i n a l S t r i n g F I L E N A M E = " f i l e n a m e " ;
p u b l i c D o w n l o a d e r S e r v i c e ( ) {
s u p e r ( " D o w n l o a d e r S e r v i c e " ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n H a n d l e I n t e n t ( I n t e n t i n t e n t ) {
S t r i n g i n t e n t U r l = i n t e n t . g e t S t r i n g E x t r a ( U R L ) ;
S t r i n g i n t e n t F i l e n a m e = i n t e n t . g e t S t r i n g E x t r a ( F I L E N A M E ) ;
d o w n l o a d ( i n t e n t U r l , i n t e n t F i l e n a m e ) ;
}
I n t e n t i n t e n t = n e w I n t e n t ( t h i s , D o w n l o a d e r S e r v i c e . c l a s s ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . U R L , " h t t p : / / . . . . " ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . F I L E N A M E , " i m a g e . j p g " ) ;
s t a r t S e r v i c e ( i n t e n t ) ;
14 . 17
Téléchargement
p r i v a t e v o i d d o w n l o a d ( S t r i n g i n t e n t U r l , S t r i n g i n t e n t F i l e n a m e ) {
t r y {
U R L i n p u t U r l = n e w U R L ( i n t e n t U r l ) ;
F i l e o u t p u t F i l e = n e w F i l e (
E n v i r o n m e n t . g e t E x t e r n a l S t o r a g e P u b l i c D i r e c t o r y (
E n v i r o n m e n t . D I R E C T O R Y _ D O W N L O A D S
) ,
i n t e n t F i l e n a m e ) ;
t r y ( I n p u t S t r e a m i n p u t S t r e a m =
i n p u t U r l . o p e n C o n n e c t i o n ( ) . g e t I n p u t S t r e a m ( ) ;
O u t p u t S t r e a m o u t p u t S t r e a m = n e w F i l e O u t p u t S t r e a m ( o u t p u t F i l e )
) {
c o p y ( i n p u t S t r e a m , o u t p u t S t r e a m ) ;
b r o a d c a s t S u c c e s s ( i n t e n t U r l , o u t p u t F i l e . g e t A b s o l u t e P a t h ( ) ) ;
}
} c a t c h ( I O E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
b r o a d c a s t E r r o r ( ) ;
}
}
14 . 18
Téléchargement
p r i v a t e v o i d c o p y ( I n p u t S t r e a m i n p u t S t r e a m ,
O u t p u t S t r e a m o u t p u t S t r e a m ) t h r o w s I O E x c e p t i o n {
b y t e [ ] b u f f e r = n e w b y t e [ 1 0 2 4 ] ;
f o r ( ; ; ) {
i n t b y t e s C o u n t = i n p u t S t r e a m . r e a d ( b u f f e r ) ;
i f ( b y t e s C o u n t = = - 1 ) b r e a k ;
o u t p u t S t r e a m . w r i t e ( b u f f e r , 0 , b y t e s C o u n t ) ;
}
}
14 . 19
Téléchargement
p u b l i c s t a t i c f i n a l i n t D O W N L O A D _ S U C C E S S = 1 ;
p u b l i c s t a t i c f i n a l i n t D O W N L O A D _ E R R O R = 2 ;
p u b l i c s t a t i c f i n a l S t r i n g U R L = " u r l " ;
p u b l i c s t a t i c f i n a l S t r i n g F I L E N A M E = " f i l e n a m e " ;
p u b l i c s t a t i c f i n a l S t r i n g R E S U L T _ C O D E = " r e s u l t _ c o d e " ;
p u b l i c s t a t i c f i n a l S t r i n g D O N E _ A C T I O N =
" c o m . u n i v _ a m u . c c i . d o w n l o a d e r . D O N E _ A C T I O N " ;
p r i v a t e v o i d b r o a d c a s t S u c c e s s ( S t r i n g u r l , S t r i n g f i l e n a m e ) {
I n t e n t i n t e n t = n e w I n t e n t ( D O N E _ A C T I O N ) ;
i n t e n t . p u t E x t r a ( U R L , u r l ) ;
i n t e n t . p u t E x t r a ( F I L E N A M E , f i l e n a m e ) ;
i n t e n t . p u t E x t r a ( R E S U L T _ C O D E , D O W N L O A D _ S U C C E S S ) ;
s e n d B r o a d c a s t ( i n t e n t ) ;
}
p r i v a t e v o i d b r o a d c a s t E r r o r ( ) {
I n t e n t i n t e n t = n e w I n t e n t ( D O N E _ A C T I O N ) ;
i n t e n t . p u t E x t r a ( R E S U L T _ C O D E , D O W N L O A D _ E R R O R ) ;
s e n d B r o a d c a s t ( i n t e n t ) ;
}
14 . 20
Le manifeste de l'application
< m a n i f e s t . . . >
< a p p l i c a t i o n . . . >
< s e r v i c e a n d r o i d : n a m e = " f r . u n i v _ a m u . c c i . d o w n l o a d e r . D o w n l o a d e r S e r v i c e "
a n d r o i d : e x p o r t e d = " t r u e " / >
< / a p p l i c a t i o n >
< / m a n i f e s t >
14 . 21
Appel au service dans la même application
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e E d i t T e x t e d i t T e x t ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . m a i n _ a c t i v i t y ) ;
i m a g e V i e w = ( I m a g e V i e w ) f i n d V i e w B y I d ( R . i d . i m a g e _ v i e w ) ;
e d i t T e x t = ( E d i t T e x t ) f i n d V i e w B y I d ( R . i d . e d i t _ t e x t ) ;
}
p u b l i c v o i d o n C
i e l i c k ( V w v i e w ) {
U r i u r i = U
s e r i . p a r ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
I n t e n t i n t e
e w n t = n I n t e n t ( t h i s , D o w n l o a d e r S e r v i c e . c l a s s ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . U R L , u r i . t o S t r i n g ( ) ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . F I L E N A M E ,
u r i . g e t L a s t P a t h S e g m e n t ( ) ) ;
s t a r t S e r v i c e ( i n t e n t ) ;
}
}
14 . 22
Appel au service dans la même application
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e E d i t T e x t e d i t T e x t ;
@ O v e r r i d e
p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) {
s u p e r . 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 ) ;
s e t C o n t e n t V i e w ( R . l a y o u t . m a i n _ a c t i v i t y ) ;
i m a g e V i e w = ( I m a g e V i e w ) f i n d V i e w B y I d ( R . i d . i m a g e _ v i e w ) ;
e d i t T e x t = ( E d i t T e x t ) f i n d V i e w B y I d ( R . i d . e d i t _ t e x t ) ;
}
p u b l i c v o i d o n C
i e l i c k ( V w v i e w ) {
U r i u r i = U
s e r i . p a r ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
I n t e n t i n t e
e w n t = n I n t e n t ( t h i s , D o w n l o a d e r S e r v i c e . c l a s s ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . U R L , u r i . t o S t r i n g ( ) ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . F I L E N A M E ,
u r i . g e t L a s t P a t h S e g m e n t ( ) ) ;
s t a r t S e r v i c e ( i n t e n t ) ;
}
}
14 . 23
Écoute des "broadcasts" du service
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
@ O v e r r i d e
p r o t e c t e d v o i d o n R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ;
I n t e n t F i l t e r f i l t e r = n e w I n t e n t F i l t e r ( ) ;
f i l t e r . a d d A c t i o n ( D o w n l o a d e r S e r v i c e . D O N E _ A C T I O N ) ;
r e g i s t e r R e c e i v e r ( r e c e i v e r , f i l t e r ) ;
}
@ O v e r r i d e
p r o t e c t e d v o i d o n P a u s e ( ) {
s u p e r . o n P a u s e ( ) ;
u n r e g i s t e r R e c e i v e r ( r e c e i v e r ) ;
}
f i n a l p r i v a t e B r o a d c a s t R e c e i v e r r e c e i v e r = n e w B r o a d c a s t R e c e i v e r ( ) {
@ O v e r r i d e
p u b l i c v o i d o n R e c e i v e ( C o n t e x t c o n t e x t , I n t e n t i n t e n t ) {
/ * T O D O * /
}
} ;
}
14 . 24
Implémentation de la méthode onReceive
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
f i n a l p r i v a t e B r o a d c a s t R e c e i v e r r e c e i v e r = n e w B r o a d c a s t R e c e i v e r ( ) {
@ O v e r r i d e
p u b l i c v o i d o n R e c e i v e ( C o n t e x t c o n t e x t , I n t e n t i n t e n t ) {
s w i t c h ( i n t e n t . g e t I n t E x t r a ( D o w n l o a d e r S e r v i c e . R E S U L T _ C O D E , 0 ) ) {
c a s e D o w n l o a d e r S e r v i c e . D O W N L O A D _ S U C C E S S :
S t r i n g u r l =
i n t e n t . g e t S t r i n g E x t r a ( D o w n l o a d e r S e r v i c e . U R L ) ;
S t r i n g f i l e n a m e =
i n t e n t . g e t S t r i n g E x t r a ( D o w n l o a d e r S e r v i c e . F I L E N A M E ) ;
s e t B a c k g r o u n d I m a g e ( u r l , f i l e n a m e ) ;
b r e a k ;
c a s e D o w n l o a d e r S e r v i c e . D O W N L O A D _ E R R O R :
T o a s t . m a k e T e x t ( g e t A p p l i c a t i o n C o n t e x t ( ) ,
R . s t r i n g . d o w n l o a d _ e r r o r , T o a s t . L E N G T H _ L O N G ) . s h o w ( ) ;
b r e a k ;
}
}
} ;
14 . 25
Changement de l'image de fond de la vue
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p r i v a t e v o i d s e t B a c k g r o u n d I m a g e ( S t r i n g u r l , S t r i n g f i l e n a m e ) {
i f ( ! e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) . e q u a l s ( u r l ) ) r e t u r n ;
B i t m a p b i t m a p = B i t m a p F a c t o r y . d e c o d e F i l e ( f i l e n a m e ) ;
i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ;
}
}
14 . 26
Utilisation du service de l'extérieur de l'application
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y {
p u b l i c v o i d o n C l i c k ( V i e w v i e w ) {
U r i u r i= U r i . p a r s e ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
I n t e n t in t e n t = n e w I n t e n t ( ) ;
i n t e n t . s
e t C o m p o n e n t ( n e w C o m p o n e n t N a m e ( " f r . u n i v _ a m u . c c i . d o w n l o a d e r " ,
" f r . u n i v _ a m u . c c i . d o w n l o a d e r . D o w n l o a d e r S e r v i c e " ) ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . U R L , u r i . t o S t r i n g ( ) ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . F I L E N A M E , u r i . g e t L a s t P a t h S e g m e n t ( ) ) ;
s t a r t S e r v i c e ( i n t e n t ) ;
}
< m a n i f e s t . . . >
< a p p l i c a t i o n . . . >
< s e r v i c e a n d r o i d : n a m e = " f r . u n i v _ a m u . c c i . d o w n l o a d e r . D o w n l o a d e r S e r v i c e "
a n d r o i d : e x p o r t e d = " t r u e " / >
< / a p p l i c a t i o n >
< / m a n i f e s t >
14 . 27