Université du Littoral - Côte d'Opaleramat/downloads/android.pdf · Université du Littoral -...
Transcript of Université du Littoral - Côte d'Opaleramat/downloads/android.pdf · Université du Littoral -...
Développement mobile sous Android
E. RAMAT
Université du Littoral - Côte d'Opale
7 septembre 2013
E. Ramat (ULCO) Android 7 septembre 2013 1 / 207
Plan1 Introduction
2 Environnement de développement
3 Structure d'un programme Android
4 Activité
5 Ressources
6 Interface utilisateurVues et widgetsInteractions
7 Préférences
8 Stockage de données
9 Graphique
10 Processus et �threads�
11 Service
12 Communication
13 Noti�cation
E. Ramat (ULCO) Android 7 septembre 2013 2 / 207
Introduction
E. Ramat (ULCO) Android 7 septembre 2013 3 / 207
IntroductionPourquoi le développement d'applications mobiles ?
Les �devices�
Apparition de périphériques mobiles connectés au réseau : ultraportables,smartphones, tablettes, . . .
Le Nokia série 9000
E. Ramat (ULCO) Android 7 septembre 2013 4 / 207
IntroductionPourquoi le développement d'applications mobiles ?
Qu'est ce qu'un �smartphone� ?
C'est plus qu'un téléphone, il permet :
d'envoyer des e-mails
de prendre des photos
d'écouter de la musique
. . .
Technique
Un smartphone possède :
un système d'exploitation complet
un environnement de développement d'applications
E. Ramat (ULCO) Android 7 septembre 2013 5 / 207
IntroductionLes faits
L'état actuel
en 2006, 2,75 milliards d'abonnés aux téléphones mobiles (dans le monde)
en 2013, 6,84 milliards !!!
dont 1,1 milliard de smartphones �n 2012 dans le monde
Progression
+300 % de smartphones en 3 ans !
E. Ramat (ULCO) Android 7 septembre 2013 6 / 207
IntroductionLes chi�res en août 2013
Les smartphones en France et dans le monde
GS Statcounter
Mesure d'audience : répartition des OS mobiles détectés sur un ensemble de sites
E. Ramat (ULCO) Android 7 septembre 2013 7 / 207
IntroductionLes solutions de développement mobile
Les environnements à base de �Virtual Machines�
Java ME (Java Micro Edition)
BREW (Binary Runtime Environment for Wireless)
Les systèmes d'exploitation minimalistes
Symbian (UIQ - User Interface Quartz - et Nokia S60 User Interface commeinterface utilisateur)
LiMo (basé sur Linux)
Angström distribution (Linux minimaliste pour système embarqué)
OpenMoko (spéci�cations matérielles et logicielles ; basé sur Linux ; libre)
E. Ramat (ULCO) Android 7 septembre 2013 8 / 207
IntroductionLes solutions de développement mobile
Les systèmes d'exploitation enrichis
Android
iOS (iPhone)
Windows Phone
BlackBerry OS (BlackBerry)
Palm OS (Garnet OS, Cobalt OS)
HP/Palm WebOS (Mojo)
Les autres
OVI (ensemble de services par Nokia)
Adobe Flash Lite (version légère de Flash pour mobile)
E. Ramat (ULCO) Android 7 septembre 2013 9 / 207
IntroductionProblématiques
Distribution des applications
dépôt centralisé ou décentralisé
depuis un PC
Hardware
hétérogénéité du matériel
puissance et mémoire limitées
connectivité à Internet (disponibilité, rapidité, . . . )
dispositif d'a�chage divers (et réduit dans le cas des téléphones)
di�culté de pointage (touch ou stylet) et de saisie (clavier physique ouvirtuel)
E. Ramat (ULCO) Android 7 septembre 2013 10 / 207
IntroductionProblématiques
Système d'exploitation
Quel système d'exploitation ?
iOS d'Apple
Android de Google
BlackBerry OS sur Blackberry
Windows Phone de Microsoft
Développement
quel langage ?
quel IDE / environnement de développement ?
émulation ou/et non pour le �debugging� des applications ?
E. Ramat (ULCO) Android 7 septembre 2013 11 / 207
IntroductionQu'est-ce qu'Android ?
Dé�nition
android est la première plateforme ouverte, gratuite et compléte pour des�devices� mobiles
développé par �Open Hanset Alliance�
sous licence �Apache Software License 2.0�
Dé�nition
Android est un ensemble de logiciels incluant :
un système d'exploitation basé sur Linux
un �middleware�
des applications clés (téléphone, contacts, navigateur, . . . )
et un ensemble d'API avancées
E. Ramat (ULCO) Android 7 septembre 2013 12 / 207
IntroductionQu'est-ce qu'Android ?
SDK
Le SDK (�Software Development Kit�) est :
un ensemble d'outils
un ensemble d'API spécialisées
basé sur un sous-ensemble du langage Java
SDK en C/C++
il existe aussi un SDK en C/C++ : le NDK (�Native Development Kit�)
utilisé pour les applications critiques
E. Ramat (ULCO) Android 7 septembre 2013 13 / 207
IntroductionQu'est-ce qu'Android ?
Android n'est pas Linux !
Android est basé sur un noyau Linux MAIS ce n'est pas GNU/Linux !
pas de système de fenêtres
pas de glibc
pas d'utilitaire GNU/Linux
E. Ramat (ULCO) Android 7 septembre 2013 14 / 207
IntroductionQu'est-ce qu'Android ?
Android n'est pas Java !
Android n'est pas une implémentation de tout le langage Java !
utilise le langage Java
implémente une partie de la spéci�cation de Java5 SE
s'éxecute sur une machine virtuelle dalvik au lieu de la JVM
Machine à piles / Machine à registres
La JVM est basée sur une machine à piles alors que la machine virtuelle dalvik estbasée sur une machine à registres
E. Ramat (ULCO) Android 7 septembre 2013 15 / 207
IntroductionQu'est-ce qu'Android ?
Le noyau Linux d'Android
Android est basé sur le noyau 2.6 de Linux et fournit :
la couche sécurité
la gestion de la mémoire et des processus
la pile réseau
le modèle de driver
et la couche d'abstraction
Les sources du noyau
source.android.com
E. Ramat (ULCO) Android 7 septembre 2013 16 / 207
IntroductionQu'est-ce qu'Android ?
L'architecture d'Android
E. Ramat (ULCO) Android 7 septembre 2013 17 / 207
IntroductionQu'est-ce qu'Android ?
Améliorations
Android a ajouté plusieurs patchs au noyau :
alarm : ajout de �timers� pour réveiller le système
ashmen : mémoire partagée entre processus
pmen : allocation mémoire des processus
binder : mécanisme de communication inter-processus (n'utilise pas SysVIPC) et d'invocation de méthodes distantes
power management : gestion de l'énergie
low memory killer (pas d'espace de swap disponible) : �tueur� de processus encas de mémoire insu�sante
logger : gestion des logs ("main", "events", "radio" - sms/voix - et "system")
E. Ramat (ULCO) Android 7 septembre 2013 18 / 207
IntroductionQu'est-ce qu'Android ?
Autres caractéristiques
nagivateur web intégré basé sur le moteur �WebKit OSS� (utilisé danschrome et safari)
graphique 3D basé sur OpenGL ES (�Open Graphics Library for EmbeddedSystem�)
SQLite pour le stockage des données en base de données (utilisation de SQL)
prise en charge des formats courants multimédia : audio, video et image
prise en charge de camera, GPS, compas et accéleromètre
E. Ramat (ULCO) Android 7 septembre 2013 19 / 207
IntroductionQu'est-ce qu'Android ?
Les versions
E. Ramat (ULCO) Android 7 septembre 2013 20 / 207
IntroductionQu'est-ce qu'Android ?
La suivante 4.4 : Kit Kat
E. Ramat (ULCO) Android 7 septembre 2013 21 / 207
IntroductionQu'est-ce qu'Android ?
Les versions
1.0 : Apple Pie (septembre 2008)
1.1 : Banana Bread (février 2009)
1.5 : Cupcake (avril 2009) - API 3
1.6 : Donut (septembre 2009) - API 4
2.0/2.1 : Eclair (octobre 2009) - API 7
2.2 : FroYo (mai 2010) - API 8
2.3 : Gingerbread (décembre 2010) - API 9-10
3.0 : Honeycomb (février 2011) - API 11-13
4.0 : Ice Cream Sandwich (ICS) (octobre 2011) - API 14-15
4.1/4.2/4.3 : Jelly Bean (juillet 2012 au juillet 2013) - API 16-18
Sortie des versions très rapides → problème de déploiement !
E. Ramat (ULCO) Android 7 septembre 2013 22 / 207
IntroductionQu'est-ce qu'Android ?
Déploiement - juin 2013
Répartition
Eclair (2.1) et versions antérieures : 1,3 %
FroYo (2.2) : 2,5 %
Gingerbread (2.3) : 33,1 %
Honeycomb (3.x) : 0,1 %
Ice Cream Sandwich (4.0.x) : 22,5 %
Jelly Bean (4.1/4.2) : 40,5 %
E. Ramat (ULCO) Android 7 septembre 2013 23 / 207
IntroductionQu'est-ce qu'Android ?
version 1.0 : Apple Pie
création d'Android Market (le modèle de di�usion des applications)
navigateur Web (HTML/XHTML)
accès aux services POP3, IMAP4 et SMTP
synchronisation avec les services Google (mail, agenda, contact, chat)
localisation avec GPS et Google Maps
support des SMS et MMS
support des appareils photo
lecture multimédia
support du Wi� et du Bluetooth
noti�cations (barre de status, personnalisation des sonneries, vibreur et LED)
Youtube et quelques applications
E. Ramat (ULCO) Android 7 septembre 2013 24 / 207
IntroductionQu'est-ce qu'Android ?
version 1.1 : Banana Bread
améliorations de Maps
pièce attachée au MMS
support des �marquee� dans les layouts
version 1.5 : Cupcake
basé sur le noyau Linux 2.6.27
support pour les claviers virtuels + prédiction des mots
support pour les Widgets (miniatures sur le bureau)
enregistrement vidéo (format MPEG-4 et 3GP)
support du Bluetooth A2DP et AVRCP
ajout de la fonction copier/coller dans le navigateur
ajout de photos pour les contacts enregistrés comme favoris
ajout de date/heure des appels / ajout accès rapide aux contacts
animations lors d'un changement d'écran
E. Ramat (ULCO) Android 7 septembre 2013 25 / 207
IntroductionQu'est-ce qu'Android ?
version 1.6 : Donut
basé sur le noyau Linux 2.6.29
possibilité de recherche dans les favoris, l'historique, les contacts et Internetdepuis l'écran d'accueil
mise à jour de la recherche vocale et meilleure intégration avec lesapplications natives
interface de l'Android Market améliorée
interface native pour l'appareil photo, la camera et la galerie ;
mise à jour du support pour CDMA/EVDO, 802.1x, VPNs et une synthèsevocale
support des écrans avec une résolution WVGA
framework de reconnaissance de gestes (GestureBuilder)
Google Navigation (GPS Gratuit)
E. Ramat (ULCO) Android 7 septembre 2013 26 / 207
IntroductionQu'est-ce qu'Android ?
version 2.0/2.1 : Eclair
vitesse hardware optimisée
support de plus de taille d'écran et résolutions
réorganisation de l'interface utilisateur
nouvelle interface du navigateur et support de l'HTML5
nouvelle liste de contact
amélioration de Google Maps 3.1.2
support de Microsoft Exchange Server par Exchange ActiveSync 2.5
support de nouvelles fonctions pour l'appareil photo (�ash, zoom digital,balance de blancs, e�ets de couleurs et focus macro)
meilleure gestion des évènements multipoints
amélioration du clavier virtuel
Bluetooth 2.1
fonds d'écran animés
E. Ramat (ULCO) Android 7 septembre 2013 27 / 207
IntroductionQu'est-ce qu'Android ?
version 2.2 : Froyo
basé sur le noyau Linux 2.6.32
optimisations générales de la vitesse, de la mémoire et des performances del'OS
intégration du JIT
intégration du moteur JavaScript V8 de Chrome
Hotspot Wi-Fi et USB Tethering
possibilité de désactiver l'accès aux données sur réseau mobile
amélioration et renommage de l'Android Market (Google Play)
support de l'installation d'applications sur la mémoire extensible
support d'Adobe Flash Player 10.1
support des écrans à haute densité de pixels (320 dpi)
E. Ramat (ULCO) Android 7 septembre 2013 28 / 207
IntroductionQu'est-ce qu'Android ?
version 2.3 : Gingerbread
basé sur le noyau Linux 2.6.35
passage au système de �chiers ext4
support des grands écrans à résolutions extra-larges (WXGA et plus)
support du NFC
support de la VoIP et SIP
refonte du clavier virtuel (multi-touch) et de l'autocomplétion
�garbage collector� pour de meilleures performances
support de nouveaux capteurs (gyroscope et baromètre)
support natif de plusieurs caméras (dont frontale) ;
support du chat vocal et vidéo sur Google Talk ;
E. Ramat (ULCO) Android 7 septembre 2013 29 / 207
IntroductionQu'est-ce qu'Android ?
version 3 : Honeycomb
basé sur le noyau Linux 2.6.36
interface entièrement retravaillée et optimisée pour les tablettes tactiles
bureau tridimensionnel avec widgets améliorés
support des processeurs multi-coeur
USB Host et Accessories Developer Kit
support des proxys HTTP pour les points d'accès Wi-Fi
support des tablettes tactiles de 7 pouces
support des processeurs Qualcomm
E. Ramat (ULCO) Android 7 septembre 2013 30 / 207
IntroductionQu'est-ce qu'Android ?
version 4.0 : Ice Cream Sandwich
basé sur le noyau Linux 3.0.1
boutons virtuels intégrés à l'interface, en remplacement des boutonsphysiques
capture d'écran native ;
déverrouillage par reconnaissance faciale
Wi-Fi Direct
enregistrement vidéo en 1080p
nouveau menu Power
E. Ramat (ULCO) Android 7 septembre 2013 31 / 207
IntroductionQu'est-ce qu'Android ?
version 4.1 : Jelly Bean
Google Now
Google Chrome, navigateur par défaut
amélioration de la synchronisation
amélioration de la rapidité et de la �uidité de l'interface
support de nouvelles langues
widgets �intelligents� : redimensionnement automatiquement
système audio multi-canal
transfert de données Bluetooth pour Android Beam
amélioration de l'appareil photo
photo des contacts en haute résolution
amélioration de la barre de noti�cations
recherche vocale améliorée à la façon de Siri sur iOS
E. Ramat (ULCO) Android 7 septembre 2013 32 / 207
IntroductionQu'est-ce qu'Android ?
version 4.2 : Jelly Bean - suite
améliorations diverses
support du multi-utilisateur sur les tablettes
nouvelle application et widget horloge
résolution de problèmes Bluetooth
E. Ramat (ULCO) Android 7 septembre 2013 33 / 207
IntroductionQu'est-ce qu'Android ?
version 4.3 : Jelly Bean - suite et �n
son : Virtual Surround Sound
autocomplétion (Téléphone)
amélioration de la saisie du texte et du clavier Google
support du Bluetooth Smart (Low Energy) et du Bluetooth AVRCP 1.3
ajout de l'OpenGL ES 3.0
simpli�cation de l'assistant d'installation
ajout de nouvelles langues
E. Ramat (ULCO) Android 7 septembre 2013 34 / 207
IntroductionAndroid Market / Google Play
Dé�nition
système standard de téléchargement des applications
renommé en Google Play
pas de véri�cation des applications
navigation laborieuse : par catégorie / payant/gratuit / par mot clé
gestion des autorisations avant téléchargement / installation
des centaines de milliers d'applications
existence de �markets� alternatifs
Développeur
25$ pour s'inscrire en tant que développeur (à payer une seule fois)
modèle économique :I 70% pour le développeurI 30% pour Google
gestion des revenus via Google Checkout
57% des applications sont gratuitesE. Ramat (ULCO) Android 7 septembre 2013 35 / 207
Environnement de développement
E. Ramat (ULCO) Android 7 septembre 2013 36 / 207
Environnement de développementL'environnement idéal
Le système d'exploitation
Ubuntu est un excellent choix :
pris en charge et testé par Google
tous les outils sont disponibles
l'installation en 32 bits est vivement recommandée
L'EDI
Eclipse est une plateforme de développement extensible :
Eclipse est plus qu'un IDE
un plugin ADT (Android Development Tools) pour Android est disponible
E. Ramat (ULCO) Android 7 septembre 2013 37 / 207
Environnement de développementInstallation
Processus d'installation sous Ubuntu
installer Eclipse :→ sudo apt-get install eclipse ou via le site web d'Eclipse(http://www.eclipse.org/downloads
openjdk-6 / openjdk-7 est installé en même temps que le paquet Eclipse
installer le sdk d'Android :→ aller sur la page http://developer.android.com/sdk/index.html→ télécharger la version Linux (i386)→ décompresser le �chier tgz dans /opt (sudo tar zxvf
android-sdk_r22.0.5-linux.tgz puis sudo mv
android-sdk-linux_x86 android-sdk)
E. Ramat (ULCO) Android 7 septembre 2013 38 / 207
Environnement de développementInstallation
Processus d'installation sous Ubuntu - suite
installer le plugin ADT :→ lancer Eclipse→ puis sélectionner �Help� puis �Intall New Software ...�→ cliquer sur le bouton �Add...� en haut à droite de la fenêtre→ entrer �ADT Plugin� comme nom ethttps://dl-ssl.google.com/android/eclipse comme �Location� puisvalider
En cas de problème réseau
Il est probablement qu'il faille utiliser l'url en mode http au lieu de https.
E. Ramat (ULCO) Android 7 septembre 2013 39 / 207
Environnement de développementInstallation
Processus d'installation sous Ubuntu - suite
Dans la boîte de dialogue �Available Softwares�,
cocher �Developer Tools� puis cliquer sur �Next�
la liste des �softwares� apparait, cliquer sur �Next�
lire la licence Apache et accepter la licence puis cliquer sur ��nish�
pour �nir l'installation, redémarrer Eclipse
E. Ramat (ULCO) Android 7 septembre 2013 40 / 207
Environnement de développementInstallation
Processus d'installation sous Ubuntu - �n
Il reste à lier Eclipse au SDK d'Android
sélectionner �Window� puis �Preferences�
choisir �Android� puis dé�nir le chemin du SDK ( /opt/android-sdk)
Statistiques Google
Lors de la sélection d'Android, une fenêtre s'est ouverte et vous pouvez valider lefait que vous envoyez vos statistiques d'utilisation des outils Android.
E. Ramat (ULCO) Android 7 septembre 2013 41 / 207
Environnement de développementInstallation
Les nouveautés
Plusieurs éléments sont maintenant accessibles :
dans le menu �Window�, un accès aux outils du SDK d'Android
dans le menu �File� puis �New Project�, un wizard Android qui donne lapossibilité de créer un projet Android ou un projet de tests d'une applicationAndroid
Installation des API et des émulations
Il faut maintenant installer les API Android et dé�nir une émulation d'unemachine Android via AVD Manager.
E. Ramat (ULCO) Android 7 septembre 2013 42 / 207
Environnement de développementInstallation
Installation des API
dans le menu �Window�, sélectionner �Android SDK and AVD Manager�
sélectionner �Available packages� puis ouvrir la branche �Android Repository�(la liste des packages Android est téléchargée)
si vous voulez développer pour Android 3.2 :I cocher �SDK Platform Android 3.2, API 13, revision 1�I cocher �Samples for SDK API 13, revision 1� (si vous désirez les exemples)I cocher �Documentation for Android SDK, API 13, revision 1� (si vous désirez
installer la documentation)
cliquer sur �Install Selected� et véri�er que tous les packages sont �Accept�puis cliquer sur �Install�
E. Ramat (ULCO) Android 7 septembre 2013 43 / 207
Environnement de développementInstallation
Droits
Si vous n'avez pas les droits sur /opt :
soit exécutez en console l'utilitaire android en mode sudo :$ sudo /opt/android-sdk/tools/android
soit donner les droits à l'utilisateur d'Eclipse sur le répertoire/opt/android-sdk :$ sudo chown -R toto:toto /opt/android-sdk
La deuxième solution est à privilégier car la dé�nition des émulations va poser lesmêmes problèmes de droits.
E. Ramat (ULCO) Android 7 septembre 2013 44 / 207
Environnement de développementInstallation
Mise au point du code
La mise au point du code peut être réalisée selon deux méthodes :
l'exécution sur un matériel sous Android
l'exécution via une émulation
Exécution sur un matériel sous Android
Lors de l'exécution de l'application depuis Eclipse, une fenêtre propose desélectionner un matériel connecté via USB (s'il est reconnu) ou une émulation.
E. Ramat (ULCO) Android 7 septembre 2013 45 / 207
Environnement de développementInstallation
Dé�nition d'une émulation
lancer l'application �android� du répertoire /opt/android-sdk/tools ousélectionner �Android SDK and AVD Manager� du menu �Window� sousEclipse
sélectionner �Virtual devices� puis cliquer sur �New...�
saisir un nom de �Virtual Device�
choisir une cible (target) parmi la liste des API que vous avez installés
le �CPU/ABI� est automatiquement �xé à ARM qui est l'architecture -processeur standard
E. Ramat (ULCO) Android 7 septembre 2013 46 / 207
Environnement de développementInstallation
Autres paramètres
on peut dé�nir une carte SD en spé�ciant la taille
on peut changer le skin de l'émulateur ; on peut installer des skins demachines existantes (Samsung, HTC, Sony Ericson, . . . ) pour obtenir lemême rendu que sur la machine réelle
il est possible de dé�nir des paramètres au matériel (par exemple, la taille dela RAM)
E. Ramat (ULCO) Android 7 septembre 2013 47 / 207
Structure d'un programme Android
E. Ramat (ULCO) Android 7 septembre 2013 48 / 207
Structure d'un programme AndroidCréation d'un projet Android sous Eclipse
Nouveau projet
sélectionner �New� dans le menu �File� puis �Project...�
ouvrir la branche �Android� et sélectionner �Android Project�
cliquer sur �Next >� et saisir un nom de projet (par défaut, l'applicationpossédera le même nom)
sélectionner l'API cible
saisir un nom de package (toutes les classes doivent appartenir à un package)
par défaut, une activité sera créée avec pour nom le nom du projet auquel estconcaténé le mot �Activity� (on peut désactiver cette option)
E. Ramat (ULCO) Android 7 septembre 2013 49 / 207
Structure d'un programme AndroidCréation d'un projet Android sous Eclipse
Nouveau projet - suite
la version minimale du SDK est mise automatiquement en fonction de l'APIcible (si vous n'utilisez pas d'éléments spéci�ques à l'API cible, vous pouvezspéci�er une version inférieure)
cliquer sur �Finish�
Localisation
Par défaut, le projet va se créér dans le workspace ouvert au démarrage d'Eclipse.On peut aussi �cloner� un exemple ou réutiliser un code existant.
E. Ramat (ULCO) Android 7 septembre 2013 50 / 207
Structure d'un programme AndroidCréation d'un projet Android
Création sans Eclipse
Il est possible de créér un projet Android sans Eclipse via l'outil android durépertoire tools :android create project �target <target_ID> �name
<your_project_name> �path path/to/your/project �activity
<your_activity_name> �package <your_package_namespace>
E. Ramat (ULCO) Android 7 septembre 2013 51 / 207
Structure d'un programme AndroidStructure d'un projet Android
Arborescence
Cinq répertoires sont générés :
assets : des �chiers chargés sur le périphérique comme des �chiers audio,vidéo, texte (par exemple, la licence)
bin : les résultats de la compilation (les �chiers .class) et de la génération del'application (.dex, .apk et resources)
gen : les �chiers générés par Android (en particulier, le �chier R.java)
res : toutes les ressources nécessaires à l'application (icones, chaînes decaractères constantes, layout, . . . )
src : les �chiers sources Java du projet placés dans un sous-répertoireconforme au nom de package déclaré
E. Ramat (ULCO) Android 7 septembre 2013 52 / 207
Structure d'un programme AndroidStructure d'un projet Android
Les �chiers .dex
La compilation des �chiers Java produit des �chiers .dex (Dalvik Executable).
Les �chiers .apk
Les �chiers .apk sont des �chiers compressés contenant les éléments d'uneapplication Android : les �chiers .dex, les ressources, les assets , le �chier�manifest�, . . .
E. Ramat (ULCO) Android 7 septembre 2013 53 / 207
Structure d'un programme AndroidStructure d'un projet Android
Le �chier R.java
il contient en fait l'ensemble des références vers les ressources du projet (lienentre un attribut statique d'une classe statique et un nombre en hexadécimal)
par exemple, l'accès à l'icone de l'application est possible grâce à l'attributicon de la classe drawable de la classe R
Le �chier main.xml
L'interface principale est dé�nie dans un �layout� principal stocké dans un �chierxml (main.xml). Par défaut, l'application démarre avec cette interface(R.layout.main).
E. Ramat (ULCO) Android 7 septembre 2013 54 / 207
Structure d'un programme AndroidStructure d'un projet Android
Le �chier strings.xml
au lieu d'utiliser des chaînes de caractères constantes dans le code, il fautdéporter ces chaînes dans le �chier strings.xml qui fait le lien entre unidenti�ant et une chaîne de caractères
ces ressources de type String sont alors utilisés dans les messages
le mécanisme multilangue se base sur une arborescence de �chiersstrings.xml
E. Ramat (ULCO) Android 7 septembre 2013 55 / 207
Structure d'un programme AndroidStructure d'un projet Android
Le �chier AndroidManifest.xml
Toutes les applications Android disposent d'un �chier de description(AndroidManifest.xml) contenant :
le nom du package de l'application (ce nom doit être unique dans le mondeAndroid)
le niveau minimal d'API
la liste des librairies nécessaires à l'application
la description des composants de l'application (activités, services, récepteurde �ux, fournisseur de contenu, . . . )
les permissions nécessaires pour interagir avec l'application
. . .
E. Ramat (ULCO) Android 7 septembre 2013 56 / 207
Structure d'un programme AndroidArchitecture d'une application Android
�Sandbox�
Une application Android s'exécute son �sandbox� (bac à sable). Elle possède :
son propre �ID user� pour isoler en terme de droit d'accès les �chiers utiliséspar l'application
sa propre machine virtuelle (dans un processus Linux) a�n d'isoler lesapplications entre elles
son propre processus Linux, un processus est lancé dès qu'un des composantsd'une application est lancée et arrêté dès que l'application est arrêtée oulorque le système a besoin de libérer de la mémoire
E. Ramat (ULCO) Android 7 septembre 2013 57 / 207
Structure d'un programme AndroidArchitecture d'une application Android
Une architecture basée sur les composants
les activités : un simple écran avec une interface graphique avec laquell'utilisateur peut interagir
les services : un composant qui permet d'exécuter en tâche de fond untraitement long ou se connecter à un service distant (pas d'interfacegraphique)
les récepteurs de �ux/évenement : un composant à l'écoute d'événements eta�che une noti�cation ou exécute une activité
les fournisseurs de contenu : un composant de gestion des données quidonnent accès à des données
E. Ramat (ULCO) Android 7 septembre 2013 58 / 207
Structure d'un programme AndroidArchitecture d'une application Android
�Intent�
les �intents� (intentions) permet d'envoyer des messages asynchrones à desactivités ou services ou récepteurs, pour les activer
un �intent� peut être implicite (activation d'un type de composants) ouexplicite (activation d'un composant)
�Intent� et les activités/services
une �intent� dé�nit une action à réaliser (�view�, �send�, . . . )
des données peuvent accompagner la demande via une URI
�Intent� et les récepteurs
Les �intents� permettent d'annoncer les événements.
E. Ramat (ULCO) Android 7 septembre 2013 59 / 207
Activité
E. Ramat (ULCO) Android 7 septembre 2013 60 / 207
ActivitéDé�nitions
Dé�nition - activité
une activité est un composant d'une application qui fournit un écran aveclequel l'utilisateur peut interagir
en général, la zone d'interaction remplie la totalité de l'écran
mais, possibilité de dé�nir des fenêtres ��ottantes�
une application se compose de plusieurs activités
Organisation
les activités sont �empilées� comme un tas de cartes
les nouvelles activités sont placées au sommet du tas (l'application active estmise en pause)
une et une seule activité est visible au même instant
une et une seule activité est active au même instant
lorsque l'utilisateur appuie sur �black� alors l'activité courante est détruite etla précédente est �réactivée� (resume)
E. Ramat (ULCO) Android 7 septembre 2013 61 / 207
ActivitéCycle de vie
E. Ramat (ULCO) Android 7 septembre 2013 62 / 207
ActivitéDé�nitions
Dé�nition - vue
l'interface utilisateur d'une activité est fournie par une hiérarchie de vues
chaque partie de l'interface (zone rectangulaire) est gérée par une vue etl'utilisateur peut interagir avec
E. Ramat (ULCO) Android 7 septembre 2013 63 / 207
ActivitéCycle de vie
E. Ramat (ULCO) Android 7 septembre 2013 64 / 207
ActivitéCycle de vie - les phases
onCreate
lorsque l'activité est lancée pour la première fois ou après un redémarragetotal du système
lorsque l'activité est relancée après une destruction totale de l'activité ou del'application
lorsque le terminal changé d'état (mode portrait / mode paysage, parexemple) et que l'activité utilise des ressources di�érentes en fonction del'état
E. Ramat (ULCO) Android 7 septembre 2013 65 / 207
ActivitéCycle de vie - les phases
Redémarrage
lors du redémarrage d'une activité, un objet Bundle est passé en paramètre
cet objet contient la sauvegarde de l'état de l'activité
si votre activité contient des attributs spéci�ques, il est nécessaire desurcharger
I la méthode onSaveInstanceState() pour sauvegarder ces attributsI la méthode onRestoreInstanceState() pour restaurer les attributs lors du
redémarrageI l'objet Bundle est un map
Sauvegarde
Par défaut, la plupart des états des widgets sont sauvegardés ... mais pas tous !Par exemple, si un bouton est actif ou non.
E. Ramat (ULCO) Android 7 septembre 2013 66 / 207
ActivitéCycle de vie
E. Ramat (ULCO) Android 7 septembre 2013 67 / 207
ActivitéCycle de vie - les phases
onDestroy
lorsque la méthode finish est appelée (la méthode isFinish permet desavoir s'il s'agit de cette méthode)
lorsque le système a besoin de mémoire
Attention !
Il n'y a pas d'appel à onSaveInstanceState() dans le cas d'une termination par laméthode finish.
E. Ramat (ULCO) Android 7 septembre 2013 68 / 207
ActivitéCycle de vie - les phases
onPause/onResume
onPause est appelée lorsque l'activité est en train de réaliser un traiement(sauvegarde de données, par exemple, ou tout traitement utilisant le CPU) etune autre activité est activée
onResume fait suite à la réactivation de l'activité mise en pause
Attention !
Si une activité mise en pause ne revient pas au premier plan alors elle est stoppée.
E. Ramat (ULCO) Android 7 septembre 2013 69 / 207
ActivitéCycle de vie - les phases
onStart/onRestart/onStop
onStart est appelée soit lorsque l'activité est lancée (juste après onCreate)soit lorqu'elle revient au premier plan
onStop est invoquée lorque l'activité n'a pas été visible à l'utilisateur depuistrop longtemps alors qu'elle était en pause (l'activité peut être détruiteensuite - onDestroy)
onRestart fait suite à une réactivation d'une activité dans un état stop
E. Ramat (ULCO) Android 7 septembre 2013 70 / 207
ActivitéDéclaration des activités
Hormis la déclaration de la classe Java représentant l'activité, elle doit être déclarédans le �chier Manifest de l'application
<manifest ... ><application ... >
<activity android:name=".MyActivity" />...
</application ... >...
</manifest >
E. Ramat (ULCO) Android 7 septembre 2013 71 / 207
ActivitéDéclaration des activités
Attributs
l'attribut name désigne la classe Java MyActivity comme une activité del'application
il existe d'autres attributs dé�nissant les propriétés de l'activité (le thème oul'orientation de la vue, par exemple)
les attributs permettent aussi de dé�nir les permissions, les événementscapturés (par exemple, si l'écran change d'orientation)
E. Ramat (ULCO) Android 7 septembre 2013 72 / 207
ActivitéLancement d'une activité
Deux scénarios
une activité lance une autre activité sans se préoccuper du résultat del'activité lancée
on attend un résultat de l'activité lancée
Intention
pour démarrer une activité, il faut dé�nir une intention
une intention est une requête s'adressant à une activité ou une demande àdestination d'un récepteur
pour le lancement d'une activité depuis une activité d'une application, onutilise un nommage direct de l'activité (en oppostion au intention via desURI)
Création d'une intention
new Intent(this , MyActivity.class );
E. Ramat (ULCO) Android 7 septembre 2013 73 / 207
ActivitéLancement d'une activité
Lancement
Deux méthodes possibles : startActivity et startActivityForResult
startActivity(new Intent(this , MyActivity.class ));startActivityForResult(new Intent(this , MyActivity.class), RETURN_CODE );
Lancement avec résultat
le code de retour (second paramètre de la méthodestartActivityForResult) permet à une activité de savoir quelle activitévient de prendre �ni
la méthode onActivityResult est appelée et les 3 paramètres(requestCode, resultCode et data) permet :
I de savoir quelle activité vient de �nirI si l'activité s'est terminée correctement (Activity.RESULT_OK ou
Activity.RESULT_CANCELED)I de récupérer les données de retour (les données sont sous forme d'un URI)
E. Ramat (ULCO) Android 7 septembre 2013 74 / 207
ActivitéL'activité principale d'une application
Activité principale
pour le lancement d'une application, une activité doit dé�nir une intention decatégorie LAUNCHER
android.intent.action.MAIN indique que c'est l'activité initiale et qu'elleest lancée sans donnée d'entrée et sans donnée de retour
une icône doit être spéci�ée a�n que l'application apparaisse dans le menuprincipal du système (la taille de l'icône est �xée à 72 x 72 pixels)
<activity android:name=".MyActivity" android:icon="@drawable/app_icon"><intent -filter >
<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
</intent -filter ></activity >
E. Ramat (ULCO) Android 7 septembre 2013 75 / 207
Ressources
E. Ramat (ULCO) Android 7 septembre 2013 76 / 207
RessourcesDé�nitions
Dé�nition
informations statiques,
stockées en dehors du code Java,
plusieurs types :I des imagesI des valeurs (chaînes, couleurs, tableaux, dimensions) associés à des noms
symboliquesI des �chiers XML statiquesI des objets bruts (�chiers quelconques, par exemple)
Valeurs
Utilisées pour l'internationalisation et la localisation
Il faut ABSOLUMENT éviter les chaînes de caractères constantes dans le codeJava !
E. Ramat (ULCO) Android 7 septembre 2013 77 / 207
Ressources
Structure
la dé�nition des ressources est disponible dans le répertoire res/
les di�érents types de ressources sont regroupés dans des répertoires :I animator pour la dé�nition des animations (succession d'images avec des
délais et des transitions)I anim pour la dé�nition des animations des vuesI color pour les listes de couleurs liées à un étatI drawable pour les images,I layout pour la description XML des éléments d'interfaceI menu pour la description XML des menusI raw pour les �chiers de l'application (�chiers audios, �chiers de données de
type CSV, par exemple)I values pour les messages, les dimensions, les couleurs, les tableaux de
constantes, . . .I xml pour les �chiers XML
E. Ramat (ULCO) Android 7 septembre 2013 78 / 207
RessourcesUtilisation
Deux besoins
depuis une autre ressource : une ressource a besoin d'une autre ressource
@string/hello
dans le code Java : toutes les ressources sont identi�ées par des entiers etaccessible via des constantes de sous-classe de la classe R
R.string.helloR.layout.main
Il ne faut surtout pas modi�er le �chier R.java à la main ! Les entiers sont générésde manière automatique.
E. Ramat (ULCO) Android 7 septembre 2013 79 / 207
RessourcesUtilisation - exemples courants
Assignation d'une nouvelle vue à une activité
Un �chier XML main_screen est disponible dans le répertoire layout
setContentView(R.layout.main_screen );
A�ectation d'un texte à une zone de texte
Dans un �chier de type Layout, un élément de type TextView est dé�ni avecl'identi�ant msg (android:id="@+id/msg")
TextView msgTextView = (TextView) findViewById(R.id.msg);msgTextView.setText(R.string.hello_message );
Unicité des identi�ants
La déclaration des id (@+id/...) doit être unique dans l'ensemble du layout.
E. Ramat (ULCO) Android 7 septembre 2013 80 / 207
RessourcesUtilisation - exemples courants
Dé�nition du texte d'un bouton
Une constante string nommée submit est dé�nie et un bouton est dé�ni dans unlayout
<Button ... android:text="@string/submit" />
E. Ramat (ULCO) Android 7 septembre 2013 81 / 207
RessourcesLes images
Dé�nition
par défaut, les images sont stockées dans le répertoire res/drawable ;
trois formats d'images sont reconnus : PNG, JPEG et GIF
le format conseillé est PNG et GIF est o�ciellement déconseillé
La ressource de type image (drawable) ic_launcher est dé�nie comme l'icône del'application.
<applicationandroid:icon="@drawable/ic_launcher"...
/>
E. Ramat (ULCO) Android 7 septembre 2013 82 / 207
RessourcesLes couleurs
Dé�nition
il est possible de dé�nir sous forme de constantes les couleurs utilisées dansune application
les couleurs sont dé�nies res/values/colors.xml
plusieurs formes pour exprimer les couleurs :I #RGB : un seul digit hexadécimal est utilisé pour exprimer chaque
composante de la couleur (#000 désigne le noir, c'est équivalent à #000000) ;I #ARGB : la valeur du canal alpha est ajoutée à la dé�nition de la couleur (le
canal alpha désigne le niveau de transparence par défaut, A = #FF càdtotalement opaque)
I #RRGGBB et #AARRGGBB : formats à deux digits héxadécimaux par couleur
<resources ><color name="textColor">#000</color><color name="btnBackground">#fff</color>
</resources >
E. Ramat (ULCO) Android 7 septembre 2013 83 / 207
RessourcesLes styles
Dé�nition
un style est un assemblage de plusieurs attributs utilisés plusieurs fois dansl'applications
les style sont dé�nis res/values/styles.xml
Dé�ntion d'un nouveau style
la couleur, la dimension, le style et la police de caractères sont modi�és
la couleur et la dimension font référence à des constantes.
<resources ><style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/textColor </item><item name="android:textSize">@dimen/textSize </item><item name="android:textStyle">italic </item><item name="android:typeface">serif</item>
</style ></resources >
E. Ramat (ULCO) Android 7 septembre 2013 84 / 207
RessourcesRessources alternatives
Dé�nition des alternatives
les alternatives sont utilisées pour répondre aux problèmes d'hétérogéniété dumatériel, à l'orientation de l'écran, à la langue, du mode jour/nuit, . . .
par exemple :I plusieurs versions d'une même image peut être proposées en fonction de la
résolution de l'écranI plusieurs répertoires drawable sont alors disponibles : drawable (pour la taille
par défaut), drawable-hdpi (pour les grandes résolutions), . . . (ldpi, mdpi, hdpi,xhdpi, nodpi et tvdpi)
Orientation de l'écran
Pour les éléments d'interface, deux répertoires sont nécessaires :
layout-port pour le mode portrait (vertical)
layout-land pour le mode paysage (horizontal)
Tous les éléments d'interface ne nécessitent pas obligatoirement une doubledé�nition.
E. Ramat (ULCO) Android 7 septembre 2013 85 / 207
Interface utilisateur
E. Ramat (ULCO) Android 7 septembre 2013 86 / 207
Interface utilisateurIntroduction générale
Ergonomie
concevoir votre application pour un périphérique mobile avec toutes sescontraintes
la référence pour Android :http://developer.android.com/design/index.html
Ce qu'il ne faut pas faire !
un simple portage de votre application développée sous un autre système(multifenêtré, saisie clavier et souris, . . . )
ne pas abuser des fenêtres modales et des boites de con�rmation
ne créer pas d'interface �xe et ne positionner pas les élements de manière �xe
ne pas utiliser les dimensions px mais dpi (ou sp pour le texte)
ne pas utiliser les polices de caractères trop petites
E. Ramat (ULCO) Android 7 septembre 2013 87 / 207
Interface utilisateurIntroduction générale
Ce qu'il faut faire !
créer des versions pour les écrans de grande densité
mettre des éléments grands et évidents (boutons, . . . )
suivre le guide Android pour les icônes(http://developer.android.com/design/index.html)
gérer proprement la pile d'activités
gérer le changement d'orientation
utiliser les thèmes, les couleurs, . . . , dé�nis sous forme de ressources a�n delimiter les recondances
Il est important de suivre les di�érents guides de conception d'Androidpour obtenir une applications �conformes� aux attentes des utilisateurs
E. Ramat (ULCO) Android 7 septembre 2013 88 / 207
Interface utilisateurIntroduction générale
Préceptes
beauté : même l'icône de l'application est importante
simplicité : l'utilisation doit être intuitiveI introduiser des dessins explicites, intégrer des actions de navigation simple
(balayage du doigt, par exemple)I faites des messages les plus courts possiblesI les choses importantes doivent être rapide d'accèsI décomposer les tâches complexes en petites étapesI informer l'utilisateur lors des actions (même sous forme �ash)
E. Ramat (ULCO) Android 7 septembre 2013 89 / 207
Interface utilisateurIntroduction générale
Organisation
un écran de démarrage (ou écran principal) :I l'identité de votre applicationI doit contenir une grande partie de la navigationI à adapter à la taille des écransI l'écran principal peut être divisé en plusieurs écrans pour les di�érentes
fonctionnalités de l'application
des écrans de détail ou d'édition de données
Organisation - barre d'actions
chaque écran doit possèder une barre d'actions
pour la navigation et les actions de premier niveau
attention, disponible qu'à partir de Android 3.0
E. Ramat (ULCO) Android 7 septembre 2013 90 / 207
Interface utilisateurVues et widgets
Dé�nitions - Vue
chaque activité possède une fenêtre graphique pour interagir avec elle
il existe 2 stratégies de construction :I totalement en Java par instantation des widgetsI à l'aide de �chiers XML de dé�nition des widgets composants l'interface
l'interface graphique d'une activité est construite à partir de View (classeandroid.view.View) et de ViewGroup
la vue est le concept de base ; les composants utilisables sont les �widgets�
de même, le groupe de vues est un concept de base dérivé en �layout� quipermet d'agencer les widgets
L'utilisation des �chiers de dé�nition XML est fortement conseillé.
E. Ramat (ULCO) Android 7 septembre 2013 91 / 207
Interface utilisateurLayout XML
Dé�nitions
un layout XML est une réprésentation XML de l'organisation des widgetsd'une interface graphique
les éléments de l'interface sont agencés selon di�érents modèles (Linear, Grid,Absolute, Relative, . . . )
il est possible de dé�nir des hiérarchies de layouts
Eclipse
Eclipse o�re des outils de dé�nition graphique.
E. Ramat (ULCO) Android 7 septembre 2013 92 / 207
Interface utilisateurLinearLayout
Dé�nition d'un layout
Deux widgets (une zone de texte et un bouton) placés l'un en dessous de l'autre(en mode portrait/vertical)
<?xml version="1.0" encoding="utf -8"?><LinearLayout xmlns:android="http: // schemas.android.com/apk/res/android"
android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" >
<TextView android:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello , I am a TextView" />
<Button android:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello , I am a Button" />
</LinearLayout >
les 2 widgets sont identi�és via la création de 2 identi�ants (@+id/...)
en revanche, les textes ne sont pas génériques (dé�ni directement)
E. Ramat (ULCO) Android 7 septembre 2013 93 / 207
Interface utilisateurLinearLayout - paramètres
Paramètres
à chaque niveau de la hiérarchie d'un layout, des paramètres sont applicables
il existe des paramètres communs à tous les éléments et des paramètresspéci�ques
les paramètres qui s'appliquent sont ceux du layout dans lequel l'élément estdé�ni et ceux de l'élément
E. Ramat (ULCO) Android 7 septembre 2013 94 / 207
Interface utilisateurLinearLayout - paramètres
layout_width et layout_height
ces deux paramètres permettent de �xer la largeur et la hauteur d'uncomposant
ils sont nécessaires pour tous les composants (Vue et groupe de vues)
il est possible de les dé�nir avec des mesures exactes (exprimées en dp, sp,pt, px, mm ou in) ou de manière relative par rapport au contenu ou au parent(préconisé)
E. Ramat (ULCO) Android 7 septembre 2013 95 / 207
Interface utilisateurLinearLayout - paramètres
Mesures
px : pixel de l'écran (déconseillé car attention à la densité)
dip : pixel indépendant de la densité (1dip pour un écran à 160 dpicorrespond à 1 pixel) ; s'adapte à la densité
sp : mesure dépendant de la police de caractères choisie
basé sur la taille physique :I mm : millimètreI in : pouceI pt : 1/72 de pouce
layout_width et layout_height
Relativement au contenu ou au parent
wrap_content : la taille s'adapte au contenu
fill_parent (renommé match_parent dans l'API Level 8) : le composantoccupe tout l'espace disponible après le placement des autres widgets
E. Ramat (ULCO) Android 7 septembre 2013 96 / 207
Interface utilisateurLinearLayout - paramètres
Position
dans la plupart des cas, c'est automatique (calculé)
dans les autres (AbsoluteLayout ou FrameLayout), la position des widgetsdoit être dé�nie en coordonées (x,y)
les coordonées sont exprimées par rapport au coin supérieur gauche
Marges et taille
dé�nition de marges (haut, bas, gauche et droite) par rapport au parent(android:layout_marginBottom, par exemple)
tout composant possède une taille automatique ou non que l'on peut obtenirà l'aide des méthodes getMeasuredWidth() et getMeasuredHeight().
E. Ramat (ULCO) Android 7 septembre 2013 97 / 207
Interface utilisateurLinearLayout - paramètres
Poids - layout_weight
le poids permet de spéci�er le partage de l'espace disponible pour lescomposants du layout
si layout_width et layout_height sont �xés à �ll_parent, les composants separtageront l'espace en fonction de leur poids
si les poids sont identiques (1 pour tous les composants) alors la taille dechaque composant sera égale
si layout_width et layout_height sont nuls pour l'ensemble des composantsdu layout alors layout_weight est un pourcentage
Gravité - layout_gravity
par défaut, les composants d'un layout s'aligne à gauche pour une orientationverticale
la gravité permet de modi�er cet alignement avec les valeurs :I left, center_horizontal, right pour une oriantation horizontal ;I top, center_vertical, bottom pour une orientation verticale
E. Ramat (ULCO) Android 7 septembre 2013 98 / 207
Interface utilisateurLinearLayout - paramètres
Modi�cation des paramètres depuis le code Java
Tous les paramètres sont modi�ables via des méthodes Java.
Exemple
Au préalable, il faut avoir dé�ni un identi�ant sur le composant sur lequel on veutagir.
<LinearLayout xmlns:android="http: // schemas.android.com/apk/res/android"android:id="@+id/my_layout"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" >
...</LinearLayout >
Exemple
myLayout = (LinearLayout)findViewById(R.id.my_layout );...myLayout.setOrientation(LinearLayout.HORIZONTAL );
E. Ramat (ULCO) Android 7 septembre 2013 99 / 207
Interface utilisateurLayout - les autres
Types
RelativeLayout : le positionnement des composants est relatif aux autrescomposants et au layout parent ;
TableLayout : les composants sont rangés selon un tabeau
ScrollView : le composant englobé dans un ScrollView possède la faculté dedé�ler
E. Ramat (ULCO) Android 7 septembre 2013 100 / 207
Interface utilisateurWidgets - introduction
Dé�nition
comme toute interface graphique moderne, Android propose des élémentsgraphiques pour les interactions et l'a�chage : les widgets
des widgets simples : boutons, champs de saisie, cases à cocher, boutonsradios, listes déroulantes, . . .
des widgets complexes : date picker, horloge, barre de progression, . . .
Java / XML
Tout widget possède à la fois :
une classe Java qui implémente le comportement du composant graphique etdonne accès à son état
une description XML avec des paramètres pour le dé�nir graphiquement etpour paramètrer son comportement
Tous les éléments de paramétrage via XML existent sous forme de méthode Java.
E. Ramat (ULCO) Android 7 septembre 2013 101 / 207
Interface utilisateurWidgets - introduction
E. Ramat (ULCO) Android 7 septembre 2013 102 / 207
Interface utilisateurWidgets - Label
Dé�nition
le �Label� (la classe TextView) est le plus simple des widgets
a�chage d'un texte (modi�able via la classe TextView)
attributs XML spéci�ques :I android:text : texte associéI android:textSize : taille de la police de caractèresI android:textStyle : gras (bold), italique (italic) ou les deux (bold_italic)I android:textColor : couleur du texte au format RGBI android:textface : police d'a�chage (normal, sans, serif, monospace)
Pensez à utiliser des ressources pour la dé�nition des chaînes de caractères et descouleurs
E. Ramat (ULCO) Android 7 septembre 2013 103 / 207
Interface utilisateurWidgets - Label
Exemple
<TextView android:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello , I am a TextView" />
E. Ramat (ULCO) Android 7 septembre 2013 104 / 207
Interface utilisateurWidgets - Bouton
Dé�nition
la classe Button permet de représenter un bouton sur lequel on peut appuyeret cliquer
attributs identiques à ceux de TextView
possibilité de �customiser� le rendu des états du bouton via StateList
Exemple
<Buttonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:text="@string/button_text" />
E. Ramat (ULCO) Android 7 septembre 2013 105 / 207
Interface utilisateurWidgets - Bouton
Customisation
par défaut, les boutons possèdent le rendu standard d'Android
la classe StateListDrawable permet de dé�nir une liste d'objets graphiquesutilisant plusieurs images di�érentes
chaque image est dé�nie en relation avec un état
Dé�nition d'un selector
Trois images pour quatre états (�chier res/drawable/state_list_drawable.xml)
<selector xmlns:android="http: // schemas.android.com/apk/res/android"><item android:state_pressed="true"
android:drawable="@drawable/button_pressed" /><item android:state_focused="true"
android:drawable="@drawable/button_focused" /><item android:state_hovered="true"
android:drawable="@drawable/button_focused" /><item android:drawable="@drawable/button_normal" />
</selector >
E. Ramat (ULCO) Android 7 septembre 2013 106 / 207
Interface utilisateurWidgets - Bouton
Dé�nition du bouton customisé
Modi�cation de l'attribut background
<Buttonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:background="@drawable/state_list_drawable" />
Bouton à états
La classe ToggleButton a�che un bouton à 2 états (ON/OFF)
E. Ramat (ULCO) Android 7 septembre 2013 107 / 207
Interface utilisateurWidgets - Champ de saisie
Dé�nition
la saisie est possible à l'aide du widget EditText ;
les propriétés de l'EditText sont identiques aux propriétés de TextView +quelques unes de plus :
I android:autoText : active la correction automatique de l'orthographeI android:capitalize : mets automatiquement la première lettre en majusculeI android:digits : n'accepte que des chi�resI android:singleLine : autorise la saisie sur plusieurs lignes (si vrai alors entrée
fait passer au champ de saisie suivant)
Auto completion
La classe AutoCompleteTextView propose un champ de saisie activantl'autocompletion d'Android.
E. Ramat (ULCO) Android 7 septembre 2013 108 / 207
Interface utilisateurWidgets - Cases à cocher
Dé�nition
le widget CheckBox permet d'obtenir un composant à deux états répresentéspar une boîte à cocher
les propriétés sont les mêmes que le widget TextView
en Java,I on accède à l'état : isChecked() ;I on peut modi�er l'état : setChecked() ;I on peut inverser l'état : toggle()
E. Ramat (ULCO) Android 7 septembre 2013 109 / 207
Interface utilisateurWidgets - Bouton radio
Dé�nition
le widget RadioButton et le conteneur RadioGroup o�rent la possibilité dedé�nir une liste de boutons dont un et un seul peut être coché
une fois encore, les propriétés sont les mêmes que le widget TextView
en Java,I on accède à l'état : check() ou check(id) depuis le groupe ;I on peut déchocher : clearCheck() ;I on obtient l'identi�ant du bouton radio coché : getCheckedRadioButtonId() à
partir du groupe
E. Ramat (ULCO) Android 7 septembre 2013 110 / 207
Interface utilisateurWidgets - Bouton radio
Exemple
Un groupe de deux boutons radio avec le bouton radioFemale coché par défaut
<RadioGroupandroid:id="@+id/radioSex"android:layout_width="wrap_content"android:layout_height="wrap_content" >
<RadioButtonandroid:id="@+id/radioMale"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/radio_male"android:checked="true" />
<RadioButtonandroid:id="@+id/radioFemale"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/radio_female" />
</RadioGroup >
E. Ramat (ULCO) Android 7 septembre 2013 111 / 207
Interface utilisateurWidgets - Image
Dé�nition
deux widgets peuvent prendre en charge l'intégration d'images dans unécran : ImageView et ImageButton
le widget ImageButton est une sous-classe de ImageView ajoutant lapossibilité à une image de réagir comme un bouton (clics et autres)
un attribut android:src spéci�e la ressource de type drawable
Exemple
<ImageViewandroid:id="@+id/imageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/android" />
E. Ramat (ULCO) Android 7 septembre 2013 112 / 207
Interface utilisateurWidgets de sélection
Dé�nition
le principe général des widgets de sélection est d'o�rir à l'utilisateur lapossibilité de choisir quelque chose dans une liste
la liste peut être composée de texte, de bouton à cocher, d'images, . . .
les données à a�cher sont adaptées au format du widget de sélection via des�adapters�
Exemple
String [] semaine = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi","Samedi", "Dimanche"};
new ArrayAdapter <String >(this , android.R.layout.simple_list_item_1 , semaine );
this est une référence sur le contexte (l'activité courante)
simple_list_item_1 est l'identi�ant de la ressource de type list qui seradestinataire de la liste de string
semaine est le tableauE. Ramat (ULCO) Android 7 septembre 2013 113 / 207
Interface utilisateurWidgets de sélection
Dé�nition
le widget classique d'Android pour les listes se nomme ListView ;
pour remplir la vue, il est nécessaire de fournir les données à la vue vial'adapter ;
si la vue de votre activité se limite à une liste (et c'est souvent le cas), alors ilest préférable d'utiliser la classe ListActivity
Exemple
<LinearLayout xmlns:android="http: // schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">
<TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/choice_message"/>
<ListViewandroid:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="fill_parent" />
</LinearLayout >
L'identi�ant de la liste est dé�ni par une variable automatique d'Android(@android:id/list).
E. Ramat (ULCO) Android 7 septembre 2013 114 / 207
Interface utilisateurWidgets de sélection
Exemple
private String [] semaine = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi","Samedi", "Dimanche"};
@Overridepublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState );setContentView(R.layout.main);setListAdapter(new ArrayAdapter <String >(this ,
android.R.layout.simple_list_item_1 , semaine ));}
Si l'activité est �lle de ListActivity alors il su�t de faire appel à setListAdapter.
E. Ramat (ULCO) Android 7 septembre 2013 115 / 207
Interface utilisateurInteractions
Dé�nitions
le modèle d'interaction est basé sur une boucle événementielle
les listeners capturent les événements
chaque interaction donne lieu à un appel d'une méthode dite callback(onClick lorsque l'on �clique� sur un élément) d'un listener
il existe 2 stratégies de dévelopement :I par implémentation d'interfaces (au sens Java) par l'activité, le listener est
alors l'activité et les méthodes callback sont développées dans l'activitéI par création d'un objet implémentant une interface (OnClickListener, par
exemple) et on lie cet objet au widget
La deuxième forme peut être plus compact en se passant de la création explicitede l'objet.
E. Ramat (ULCO) Android 7 septembre 2013 116 / 207
Interface utilisateurInteractions
Types d'interaction
Les interactions sont essentiellement centrées sur le tactile ;
Le son est aussi une entrée possible via l'analyse vocale, par exemple
Certains périphériques embarquent des gyroscopes qui peuvent aussipermettre certaines interactions.
E. Ramat (ULCO) Android 7 septembre 2013 117 / 207
Interface utilisateurInteractions
Types d'interaction
touch : appuyer et relâcher → désigner, sélectionner quelque chose
long press : appuyer, attendre et relâcher → sélectionner quelque chose,accéder au menu contexte
swipe : appuyer, déplacer et relâcher → faire dé�ler un contenu, accéder àune autre vue de même niveau
drag : appuyer �longuement�, déplacer et relâcher → déplacer quelque chosedans un container
double touch : appuyer deux fois rapidement → zoomer, sélectionner
pinch open : appuyer avec 2 doigts, écarter les doigts et relâcher → zoomer
pinch close : appuyer avec 2 doigts, rapprocher les doigts et relâcher →dezoomer
E. Ramat (ULCO) Android 7 septembre 2013 118 / 207
Interface utilisateurInteractions
Dé�nition
il existe di�érents façons d'intercepter les interactions de l'utilisateur
dans le contexte de l'interface graphique, capture des événements par l'objetde type View
on parle d� 'event listener� : écouteur d'événements
par exemple :I l'utilisateur clique sur un boutonI le widget bouton capture l'événementI l'événement est envoyé au �listener�I une méthode du listener est invoquée
E. Ramat (ULCO) Android 7 septembre 2013 119 / 207
Interface utilisateurInteractions
Stratégies de codage
utilisation d'un paramètre XML pour nommer la méthode à invoquer del'activité en charge du widget
implémentation d'une interface Listener par l'activité
dé�nition d'un attribut de type Listener via une classe anonyme oudirectement par instantiation d'une classe anonyme
Utilisation d'un paramètre XML
Lors de l'événement �clic� sur un bouton, la méthode �click� de l'activité estappelée (public void click(View view))
<Buttonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:text="@string/my_button"android:onClick="click" />
E. Ramat (ULCO) Android 7 septembre 2013 120 / 207
Interface utilisateurInteractions
Implémentation d'un Listener
L'activité implémente un Listener et la méthode de traitement de l'événementet le widget envoie les événements à l'activité
public class ExampleActivity extends Activity implements OnClickListener {protected void onCreate(Bundle state) {
...Button button = (Button)findViewById(R.id.mybutton );button.setOnClickListener(this);
}
public void onClick(View v) {...
}...
}
E. Ramat (ULCO) Android 7 septembre 2013 121 / 207
Interface utilisateurInteractions
Implémentation d'une classe anonyme
Lors de l'a�ectation du Listener, il y a création d'un objet à partir d'une classeanonyme (sans nom) implémentant une interface Listener
public class MyActivity extends Activity {protected void onCreate(Bundle status) {
...Button button = (Button) findViewById(R.id.mybutton );button.setOnClickListener(new View.OnClickListener () {
public void onClick(View v) {...
}});
}}
E. Ramat (ULCO) Android 7 septembre 2013 122 / 207
Interface utilisateurInteractions
Attribut
On peut aussi passer un attribut a�ecté à la déclaration par une instance d'uneclasse anonyme
private OnClickListener mMyButtonListener = new OnClickListener () {public void onClick(View v) {
...}
};
E. Ramat (ULCO) Android 7 septembre 2013 123 / 207
Interface utilisateurInteractions
Interactions possibles
Toutes les interactions ne s'appliquent pas à tous les composants. Le composantrépondant à l'événement possède le focus.
OnClick : appui (en touch ou dispositif de pointage)
OnLongClick : appui et de �relachement�
OnTouch : appui de type touch sur l'écran
OnDrag : appui puis déplacement
OnHover : survol
OnKey : appui sur une touche
OnCreateContextMenu : appui sur la touche Menu
Paramètres
toutes les méthodes de traitement des événements ont pour premierparamètre une référence sur l'objet View concerné par l'interaction
des paramètres supplémentaires sont disponibles en fonction de l'interactionsauf pour OnClick et OnLongClick
E. Ramat (ULCO) Android 7 septembre 2013 124 / 207
Interface utilisateurInteractions
OnTouch
private OnTouchListener mMyListener = new OnTouchListener () {public boolean onTouch(View v, TouchEvent event) {
...}
};
OnTouch
Le paramètre de type MotionEvent dé�nit les informations de déplacement(spéci�ques au système de pointage - doigt, souris, stylet, . . . )
les coordonnées : getX et getY
E. Ramat (ULCO) Android 7 septembre 2013 125 / 207
Interface utilisateurInteractions
OnDrag
private OnDragListener mMyListener = new OnDragListener () {public boolean onDrag(View v, DragEvent event) {
...}
};
OnDrag
Le paramètre de type DragEvent dé�nit les phases du �drag&drop�
ACTION_DRAG_STARTED : le �drag&drop� commence
ACTION_DRAG_ENTERED : la zone déplacée par le �drag� vient d'entrerdans la zone graphique du composant
ACTION_DRAG_LOCATION : la zone déplacée par le �drag� se déplacetoujours dans la zone graphique du composant
E. Ramat (ULCO) Android 7 septembre 2013 126 / 207
Interface utilisateurInteractions
OnDrag
ACTION_DRAG_ENDED : le �drag&drop� se termine
ACTION_DRAG_EXITED : la zone déplacée par le �drag� vient de sortir dela zone graphique du composant
ACTION_DROP : le �drag&drop� se termine dans la zone graphique ducomposant
Position
Deux méthodes permet de savoir où se trouve le pointeur (getX et getY).
E. Ramat (ULCO) Android 7 septembre 2013 127 / 207
Pop-ups
Messages surgissants
il ne faut pas laisser l'utilisateur sans nouvelle des actions cachées
par exemple, on réalise une tâche comme la mise à jour d'une information surun serveur (et cela prend un peu de temps)
Android o�re le mécanisme de toast
un toast a�che un message pendant quelques secondes et disparaît sansintervention de l'utilisateur
Toast.makeText(getApplicationContext (),"Information saved!",Toast.LENGTH_LONG ).show ();
Durée d'a�chage
La durée d'a�chage est dé�nie à l'aide du troisième paramètre de la méthodemakeText (LENGTH_LONG ou LENGTH_SHORT).
E. Ramat (ULCO) Android 7 septembre 2013 128 / 207
Préférences
E. Ramat (ULCO) Android 7 septembre 2013 129 / 207
PréférencesIntroduction
Dé�nitions
Android o�re plusieurs techniques de stockage (base de données, �chier,. . . et les préférences)
préférences = stockage persistant de paires clés / valeurs
la clé est une chaîne de caractères (String) et la valeur est de type primitif
stockage d'information liée à une activité ou à plusieurs activités d'uneapplication
Accès
Trois modes d'accès :
préférences spéci�ques à une activité (getPreferences())
préférences de l'application (getSharedPreferences())
préférences de l'application accompagnées d'outils standards du systèmeAndroid comme l'activité PreferenceActivity(getDefaultSharedPreferences())
E. Ramat (ULCO) Android 7 septembre 2013 130 / 207
PréférencesIntroduction
Sécurité
Les préférences peuvent être :
privées (MODE_PRIVATE),
accessible en lecture par toutes les applications(MODE_WORLD_READABLE)
accessible en écriture par toutes les applications(MODE_WORLD_WRITEABLE)
Déclaration
getPreferences() est un cas particulier de getSharedPreferences() oùl'identi�ant lié aux préférences est l'identi�ant de la classe Activity rattachée
getSharedPreferences() admet un identi�ant ; plusieurs �chiers depréférences possibles pour une application
Multiprocessing
Activation du �ag MODE_MULTI_PROCESS si les préférences peuvent êtreaccédées par plusieurs processus multithreadés.
E. Ramat (ULCO) Android 7 septembre 2013 131 / 207
PréférencesUtilisation
Ecriture
les préférences sont modi�ables via une instance de la classeSharedPreferences.Editor obtenue par la méthode edit
a�ectation ou modi�cation d'une préférence via les méthodes putXXX oùXXX est un type primitif (putString, par exemple)
les modi�cations sont e�ectives qu'après validation par commit (méthode deSharedPreferences)
Autres opérations
remove : suppression d'une préférence
clear : suppression de toutes les préférences
E. Ramat (ULCO) Android 7 septembre 2013 132 / 207
PréférencesUtilisation - exemples
Modi�cation
SharedPreferences settings = getSharedPreferences("MyPrefs",Context.MODE_PRIVATE );
SharedPreferences.Editor editor = settings.edit ();
editor.putBoolean("MyPref", false);editor.commit ();
Lecture
SharedPreferences settings = getSharedPreferences("MyPrefs",Context.MODE_PRIVATE );
boolean my_pref = settings.getBoolean("MyPref", false );
Valeur par défaut
La valeur du deuxième paramètre des méthodes getXXX est utilisée si lapréférence n'existe pas
E. Ramat (ULCO) Android 7 septembre 2013 133 / 207
PréférencesFenêtre de dé�nition des préférences
PreferenceActivity
Android propose une spéci�cation XML et une classe Activity pour ladé�nition des préférences via l'interface graphique
à utiliser a�n de respecter la logique Android
Principe
dé�nir la structure de l'interface via un �chier XML avec des tags spécialisés(<PreferenceScreen>)
surcharger la classe PreferenceActivity a�n de lier l'activité à la ressourceXML
déclarer la nouvelle activité dans le manifest
commit
Lors d'un changement, la valeur est a�ectée aux préférences et commitée.
Android 3.0 et sup.
La dé�nition de la structure utilise les fragmentsE. Ramat (ULCO) Android 7 septembre 2013 134 / 207
PréférencesFenêtre de dé�nition des préférences
XML
<PreferenceScreen xmlns:android="http: // schemas.android.com/apk/res/android" >
<ListPreferenceandroid:dialogTitle="Player color"android:entries="@array/colors"android:entryValues="@array/colors"android:key="player_color"android:summary="select color of player"android:title="Player color" />
<EditTextPreferenceandroid:key="login"android:title="Login"android:summary="edit login"android:dialogTitle="select a login" />
</PreferenceScreen >
Deux éléments : une liste et un texte
E. Ramat (ULCO) Android 7 septembre 2013 135 / 207
PréférencesFenêtre de dé�nition des préférences
La classe PreferenceActivity
import android.os.Bundle;import android.preference.PreferenceActivity;
public class Preferences extends PreferenceActivity{
public void onCreate(Bundle state){
super.onCreate(state);addPreferencesFromResource(R.layout.preferences );
}}
Tout est automatique !
E. Ramat (ULCO) Android 7 septembre 2013 136 / 207
PréférencesFenêtre de dé�nition des préférences
Récupération des préférences dans une sous classe
SharedPreferences settings =PreferenceManager.getDefaultSharedPreferences(getApplicationContext ());String name = settings.getString("name","default");
E. Ramat (ULCO) Android 7 septembre 2013 137 / 207
Stockage des données
E. Ramat (ULCO) Android 7 septembre 2013 138 / 207
Stockage des donnéesIntroduction
Dé�nitions
Android propose plusieurs façons de stocker des données
les préférences (déjà précédemment) sous forme de couples (clé,valeur)
les �chiers sur un système de �chiers en mémoire interne ou ou mémoireexterne (carte SD, par exemple)
les bases de données SQLite
un serveur distant via le web
E. Ramat (ULCO) Android 7 septembre 2013 139 / 207
Stockage des donnéesSystème de �chiers
Système de �chiers
l'API standard de Java propose des classes pour la gestion des �ux via lepackage java.io
Android dispose de deux méthodes supplémentaires pour l'accès aux �chiersliés à l'application (openFileInput et openFileOutput)
Ouverture d'un �chier
try {FileInputStream file = openFileInput("myFile.dat");...file.close ();
} catch (FileNotFoundException e) { }
Modes
openFileOutput() ouvre un �chier en écriture ou le crée s'il n'existe pas
si le �chier existe, le �chier est écrasé
sinon il faut spéci�er le mode MODE_APPEND (ajout en �n).E. Ramat (ULCO) Android 7 septembre 2013 140 / 207
Stockage des donnéesSystème de �chiers
Accès
par défaut, les �chiers sont accessibles uniquement par l'application qui les acréé (mode MODE_PRIVATE)
pour partager un �chier, il faut développer des fournisseurs de contenus → labonne pratique
néanmoins, on peut spéci�er un mode permettant l'accès aux autresapplications (MODE_WORLD_READABLE ouMODE_WORLD_WRITABLE)
E. Ramat (ULCO) Android 7 septembre 2013 141 / 207
Stockage des donnéesSystème de �chiers
Ouverture d'un �chier
try {InputStream instream = openFileInput("myfilename.txt");
if (instream) {InputStreamReader inputreader = new InputStreamReader(instream );BufferedReader buffreader = new BufferedReader(inputreader );String line;
while ((line = buffreader.readLine ())) {}
}instream.close ();
} catch (java.io.FileNotFoundException e) {}
Explications
l'ouverture du �chier passe par la méthode openFileInput
la lecture du �chier fait appel aux classes de base de java.io :InputStreamReader et BufferedReader
E. Ramat (ULCO) Android 7 septembre 2013 142 / 207
Stockage des donnéesBase de données
Dé�nitions
le système de bases de données propose par Android est SQLite
SQLite est un SGBD sans serveur, basé uniquement sur des �chiers
l'exécution des requêtes s'e�ectue dans le processus de l'application
comme pour les �chiers, la base de données est privée à l'application
une application peut créér plusieurs bases de données
Localisation
Les �chiers des bases de données d'une application sont localisées dans lerepértoire : /data/data/<namespace>/databases
ORM : Object Relational Mapper
Il n'y a pas d'ORM dans Android donc deux possibilités :
utiliser une API externe : ORMLite, ActiveAndroid ou db4objects
développer une classe encapsulant les requêtes à la base et des classesreprésentants les entités manipulées
E. Ramat (ULCO) Android 7 septembre 2013 143 / 207
Stockage des donnéesBases de données
Création et mise à jour
la manipulation (création et mise à jour) de la base de données est réaliséevia une sous-classe de la classe SQLiteOpenHelper
deux méthodes et un constructeur sont à développer :I le constructeur qui a pour paramètre le nom de la base de données et la versionI onCreate : méthode de création de la base de donnéesI onUpgrade : méthode de changement de version
il est important de gèrer le numéro de version de la base de données, celapermet de prendre en charge via la méthode onUpgrade les changements deversion
E. Ramat (ULCO) Android 7 septembre 2013 144 / 207
Stockage des donnéesBases de données
Création et mise à jour
public class MyDatabase extends SQLiteOpenHelper {
public MyDatabase(Context context , String name , CursorFactory factory ,int version) {
super(context , name , factory , version );}
public void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE people ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT ,"+ "name TEXT NOT NULL);");
db.execSQL("CREATE TABLE location ("+ "id INTEGER PRIMARY KEY AUTOINCREMENT ,"+ "name TEXT NOT NULL);");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion ,int newVersion) {
if (newVersion == 2 && oldVersion == 1) {db.execSQL("CREATE TABLE location ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT ,"+ "name TEXT NOT NULL);");
}}
}
E. Ramat (ULCO) Android 7 septembre 2013 145 / 207
Stockage des donnéesBases de données
Accès et requête
deux méthodes d'accès (en lecture ou en écriture) de la classeSQLiteOpenHelper : getReadableDatabase et getWritableDatabase
pour réaliser une requête de type SELECT, deux possibilités :I rawQuery permet d'exécuter directement une instruction SELECT sous forme
d'une chaîne complète de caractèresI query permet de construire une requête à partir de di�érents élements d'une
requête SELECT
les méthodes de requêtes retourne un objet Cursor pour parcourir lesrésultats
MyDatabase myBase = new MyDatabase(context , database_name , null ,version_number );
SQLiteDataBase bd = myBase.getWritableDatabase ();String [] colomns = {"name"};Cursor cursor = bd.query("people", colomns , "id = "+id, null ,
null , null , "name") ;
E. Ramat (ULCO) Android 7 septembre 2013 146 / 207
Stockage des donnéesBases de données
Requête via la méthode query
Les paramètres de query
distinct : spéci�e si le résultat doit contenir ou non des éléments uniques
table : le nom de la table
columns : le nom des colonnes de la table à inclure dans le résultat (si null,toutes les colonnes)
selection : la clause de �ltre WHERE de la requête (on peut utiliser desvaleurs '?' dans la sélection, elles seront remplacées par la valeur spéci�éedans le paramètre selectionArgs)
groupBy : le �ltre de regroupement des lignes
having : le �ltre de condition d'apparition des lignes en relation avec leparamètre groupBy
orderBy : ordre de tri des lignes
limit : nombre limite de lignes retournées par la requête
E. Ramat (ULCO) Android 7 septembre 2013 147 / 207
Stockage des donnéesBases de données
Requête et Cursor
la classe Cursor navigue dans les enregistrements sélectionnés
quatre méthodes importantes :I getCount : retourne le nombre d'enregistrements sélectionnéesI moveToFirst : place le curseur sur le premierI moveToNext : passe à l'enregistrement suivantI close : mets �n au parcours
cursor.moveToFirst ();do {...} while (cursor.moveToNext ());cursor.close ();
Récupération des données
À l'aide du curseur, on peut désigner l'élément à récupérer via sa position dansl'enregistrement et on doit utiliser des méthodes liées au type de la donnée(getString(int), getInt(int), . . . )
E. Ramat (ULCO) Android 7 septembre 2013 148 / 207
Stockage des donnéesBases de données
Ajout
L'ajout de données se fait via la méthode insert et la classe ContentValues
ContentValues values = new ContentValues ();valeurs.put("name", "toto");bd.insert("people", null , values );
Mise à jour
La mise à jour de données se fait via la méthode update et la classeContentValues
ContentValues values = new ContentValues ();valeurs.put("name", "toto");bd.update("people", values , "id = "+id, null);
Suppression
La suppression d'un enregistrement se fait via la méthode delete
bd.delete("people", "id = "+id, null);
E. Ramat (ULCO) Android 7 septembre 2013 149 / 207
Graphique
E. Ramat (ULCO) Android 7 septembre 2013 150 / 207
GraphiqueIntroduction
Dé�nitions
toute vue (classe View) propose sa représentation graphique via la méthodeonDraw
les interactions sont traitées par les méthodes onTouchEvent, onKeyUp etonKeyDown
les widgets sont des sous-classes de View
Sa propre vue
Dé�nir sa propre vue consiste à dé�nir une sous-classe de View et d'implémenter aminima les méthodes de représentation graphique et d'interaction.
E. Ramat (ULCO) Android 7 septembre 2013 151 / 207
GraphiqueDé�nition de la classe
Dé�nition d'une nouvelle vue
hériter de classe View
surcharger les méthodes onDraw et onTouchEvent
La sous-classe de View
public class MyView extends View {public MyView(Context context) {
super(context );}
@Overrideprotected void onDraw(Canvas canvas) {
super.onDraw(canvas );}
@Overridepublic boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event );}
}
E. Ramat (ULCO) Android 7 septembre 2013 152 / 207
GraphiqueUtilisation de sa vue dans un Layout
Vue et Layout
toute sous-classe de View peut être utilisée directement dans un layout
le nom de la balise XML est alors tout simplement le nom de la classe pré�xépar le nom du namespace
View et Layout
<?xml version="1.0" encoding="utf -8"?><LinearLayout xmlns:android="http: // schemas.android.com/apk/res/android"
android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center_horizontal|center_vertical"android:orientation="vertical" >
<org.example.MyViewandroid:id="@+id/my_view"android:layout_height="fill_parent"android:layout_width="fill_parent" />
</LinearLayout >
E. Ramat (ULCO) Android 7 septembre 2013 153 / 207
GraphiqueUtilisation de sa vue dans un Layout
Vue et Layout
si la classe vue est une inner-classe d'une classe Activity, par exemple
il faut adopter la deuxième syntaxe :
<view class="org.example.MyActivity$MyView".../>
il faut aussi que l'inner soit publique et statique
E. Ramat (ULCO) Android 7 septembre 2013 154 / 207
GraphiqueUtilisation de sa vue dans un Layout
Personnalisation des attributs
En surchargeant le constructeur à 2 paramètres (Context et AttributeSet), ilest possible de récupérer un attribut personnalisé utilisé dans la dé�nition de laView dans le �chier XML du Layout.
Attributs XML personnalisés
<org.example.MyViewandroid:id="@+id/my_view"android:layout_height="fill_parent"android:layout_width="fill_parent"my_namespace:my_attribute="100"/>
Récupération des attributs personnalisés
public MyView(Context context , AttributeSet attrs) {super(context , attrs);String value = attrs.getAttributeValue("my_namespace", "my_attribute");
}
E. Ramat (ULCO) Android 7 septembre 2013 155 / 207
GraphiqueReprésentation de sa vue
Canvas
la construction de la représentation graphique d'une vue via la méthodeonDraw passe par la classe Canvas
la méthode onDraw est invoquée par le système dès lors que la vue doit êtremise à jour
une invocation à la méthode invalidate sur la vue provoque une demandede mise à jour
Methodes de Canvas
des primitives de dessin : drawXXX (Bitmap, Circle, Line, Oval, Picture,Rectangle, Text, . . . )
des méthodes de transformation : rotation, translation, clipping (restreint ledessin à une zone + opérateur de combinaison de zones)
La classe Paint
Les primitives de dessin nécessitent des informations de style et de couleurdisponible via la classe Paint.
E. Ramat (ULCO) Android 7 septembre 2013 156 / 207
GraphiqueReprésentation de sa vue
Tracé d'une ligne avec une couleur et une épaisseur
Tracé d'une ligne en gris foncé et de largeur 2 pixels
Paint paint = new Paint ();
paint.setColor(Color.DKGRAY );paint.setStrokeWidth (2);canvas.drawLine(pt1.x, pt1.y, pt2.x, pt2.y, paint );
pt1 et p2 sont des instances de la classe Point
la classe Color possède un ensemble de couleurs prédé�nies
Mesure
Les mesures sont exprimées en pixel.
E. Ramat (ULCO) Android 7 septembre 2013 157 / 207
GraphiqueReprésentation de sa vue
Tracé d'un cercle en pointillé
Tracé d'un cercle vert en pointillé
Paint paint = new Paint ();float[] phase = new float[] { 2.f, 2.f };DashPathEffect effect = new DashPathEffect(phase , 0.f);paint.setPathEffect(effect );paint.setColor(Color.GREEN );paint.setStyle(Paint.Style.STROKE );
Rect r = new Rect(pt1.x - radius , pt1.y - radius ,pt1.x + radius , pt1.y + radius );
canvas.drawArc(new RectF(r), 0, 360, false , paint );
la classe DashPathE�ect permet de dé�nir des e�ets d'hachure
Paint.Style.STROKE est nécessaire pour que le cercle ne soit pas rempli(sinon, il faut utiliser le style Paint.Style.FILL)
E. Ramat (ULCO) Android 7 septembre 2013 158 / 207
GraphiqueReprésentation de sa vue
drawArc et le 4ème paramètre
Si le 4ème paramètre est à true, que l'on est en mode remplissage et que l'on netrace pas tout le cercle alors le remplissage passe par le centre du cercle danslequel s'incrit l'arc
drawOval
Il est possible de dessiner un cercle à l'aide des méthodes drawOval(RectF,Paint) ou drawCircle(float, float, float, Paint)
E. Ramat (ULCO) Android 7 septembre 2013 159 / 207
GraphiqueReprésentation de sa vue
Tracé d'un polygone rempli
Tracé d'un triangle rouge rempli
Paint paint = new Paint ();Path path = new Path ();paint.setColor(Color.RED);paint.setStyle(Style.FILL);path.moveTo(pt1.x, pt1.y);path.lineTo(pt2.x, pt2.y);path.lineTo(pt3.x, pt3.y);path.lineTo(pt1.x, pt1.y);canvas.drawPath(path , paint );
le triangle est dé�ni sous forme d'un chemin
les 3 objets de type Point dé�nissent les 3 sommets du triangle
E. Ramat (ULCO) Android 7 septembre 2013 160 / 207
GraphiqueReprésentation de sa vue
A�chage d'un texte
Paint paint = new Paint ();
paint.setTextSize (16);paint.setTypeface(Typeface.DEFAULT_BOLD );canvas.drawText(txt , pt.x, pt.y, paint );
la taille de la police et le style sont �xées
le point pt dé�nit le coin inférieur gauche du texte
Texte sur un chemin
Il est possible d'écrire le texte en suivant un chemin avec la méthodedrawTextOnPath.
E. Ramat (ULCO) Android 7 septembre 2013 161 / 207
GraphiqueInteraction avec sa vue
TouchEvent
Comme pour tous les autres événements, l'événement Touch, peut être traité via :
l'implémentation de l'interface onTouchListener par la vue elle-même ;
la dé�nition d'une inner classe implémentant l'interface onTouchListener
Déclaration du listener
public class MyView extends View implements OnTouchListener {
public MyView(Context contextb) {setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {}
}
E. Ramat (ULCO) Android 7 septembre 2013 162 / 207
GraphiqueInteraction avec sa vue
TouchEvent
La méthode getAction de la classe MotionEvent permet de connaître le type deTouch
ACTION_DOWN : l'utilisateur vient de poser son doigt
ACTION_UP : l'utilisateur vient de relever son doigt
ACTION_MOVE : l'utilisateur déplace son doigt sans le relever
Test et récupération des coordonnées
if (action == MotionEvent.ACTION_UP) {int xTouch = (int) event.getX ();int yTouch = (int) event.getY ();
}
Autres types
Il existe des types pour le survol des vues : ACTION_HOVER_ENTER,ACTION_HOVER_MOVE et ACTION_HOVER_EXIT
E. Ramat (ULCO) Android 7 septembre 2013 163 / 207
Processus et threads
E. Ramat (ULCO) Android 7 septembre 2013 164 / 207
Processus et threadsIntroduction
Constat
une application possède un thread dit principal où tout s'exécute
le traitement de la �le d'attente des messages (clic, demande de mise à jourde l'interface, . . . ) sont traités dans le thread principal
ATTENTION ! Ne pas réaliser de traitements longs dans ce thread !
sinon l'application va être bloqué ou le système va a�cher �application notresponding� et va tuer votre application
Solution
Les threads
Quand utiliser les threads ?
les accès Internet (la méthode execute du DefaultHttpClient) estbloquante)
les opérations sur les �chiers (l'écriture sur les mémoires �ashs est très lente)
tous les calculs complexes
E. Ramat (ULCO) Android 7 septembre 2013 165 / 207
Processus et threadsIntroduction
Les threads d'Android
utilisent la classe Thread du Java classique ainsi que les structures decontrôle (le package java.util.concurrent avec la classe Semaphore, parexemple, pour la gestion des accès conccurrentiels)
une limitation : on ne peut pas modi�er l'interface utilisateur dans un threadautre que le principal
Android fournit des outils pour ce cas
Di�érentes classes
Thread et Runnable : les classes de base de Java
Handler : une classe de communication entre les threads et le thread principal
AsyncTask : une classe qui permet l'exécution en tâche de fond et l'accèsl'interface graphique
E. Ramat (ULCO) Android 7 septembre 2013 166 / 207
Processus et threadsIntroduction
Indiquer la progression
En cas de traitement très long, il est important d'indiquer le niveau de progressiondu traitment → utiliser ProgressBar ou ProgressDialogCes deux classes sont thread safe ce qui signi�e que l'on peut les modi�er à partirde n'importe quel thread.
E. Ramat (ULCO) Android 7 septembre 2013 167 / 207
Processus et threadsThread et Runnable
Dé�nition
un Runnable est une interface représentant une commande exécutable via laméthode run
un Runnable est en général exécuté dans un Thread
un Thread est unité d'exécution avec sa propre pile, des propres variableslocales
Exemple minimal
new Thread(new Runnable () {
@Overridepublic void run() {}
}). start ();
E. Ramat (ULCO) Android 7 septembre 2013 168 / 207
Processus et threadsThread et Runnable
Questions
Comment accéder aux informations contenus dans le Runnable et commentdepuis le Runnable accèder aux informations de l'application ?
Solutions
les inner classes
les accès concurrentiels à l'aide de la librairie java.util.concurrent
les handlers
Les inner classes
on peut dé�nir le Runnable au sein même d'une classe Activity ce quidonne accès aux données (attributs) de l'activité
attention, s'il y a plusieurs threads au sein de la même activité, il fautprotéger les accès simultanés
rappel : on ne peut pas modi�er l'interface graphique (même si l'on a accèsaux objets de l'interface)
E. Ramat (ULCO) Android 7 septembre 2013 169 / 207
Processus et threadsLes handlers
Dé�nition
un handler est un thread muni d'une �le d'attente de messages
un seul handler est possible par activité
la communication avec l'handler est réalisée par envoi de messages
Envoi de messages
Au sein de la méthode run d'un Runnable, on invoque la méthode sendMessagede l'objet handler dé�nit dans l'activité
handler.sendMessage(hanlder.obtainMessage ());
La méthode obtainMessage permet de construire un message vide au sein dupool de message de l'handler (ce qui est plus e�cace)
E. Ramat (ULCO) Android 7 septembre 2013 170 / 207
Processus et threadsLes handlers
Passage de paramètres
Il faut :
construire un bundle, structure de transport de données, et une messagedepuis le pool des messages de l'handler
ajouter les données au bundle
rattacher le bundle au message
envoyer le message à l'handler
Exemple
Bundle myBundle = new Bundle ();Message myMessage = handler.obtainMessage ();myBundle.putInt("myParameter", myValue );myMessage.setData(myBundle );handler.sendMessage(myMessage );
E. Ramat (ULCO) Android 7 septembre 2013 171 / 207
Processus et threadsLes handlers
Réception de messages
La réception des messages est réalisée à l'aide de la message handleMessage.
Handler handler = new Handler () {@Overridepublic void handleMessage(Message msg) {}
}
E. Ramat (ULCO) Android 7 septembre 2013 172 / 207
Service
E. Ramat (ULCO) Android 7 septembre 2013 173 / 207
ServiceIntroduction
Dé�nitions
un service est un processus continu qui s'exécute sans être associé à uneactivité
un service est créé :I soit par un appel direct à l'API d'Android (startService) - connexion non
persistanteI soit en tentant une connexion par IPC (InterProcess Communication)
(bindService) a�n d'accèder à une API locale - communicationbidirectionnelle
un service est rattaché à une application donc un service n'est pas unprocessus séparé
un service n'est pas non plus un thread exécuté dans le thread principal d'uneapplication
E. Ramat (ULCO) Android 7 septembre 2013 174 / 207
ServiceIntroduction
Pourquoi les services ?
certaines opérations ne nécessitent pas d'interface graphique (un longtéléchargement, par exemple)
les opérations de maintenance périodique du système
la mis à disposition d'une API locale pour des API distantes (par exemple, unservice Web)
Le cycle de vie
comme pour les activités, un service débute par la méthode onCreate
selon le mode de �lancement�, la méthode onStartCommand ou onBind estinvoquée
le service est alors actif
dans le cas d'un �lancement� de type bind, la méthode onUnbind est appeléelorsqu'un client se �déconnecte� au service
la méthode onDestroy marque la �n du service
E. Ramat (ULCO) Android 7 septembre 2013 175 / 207
ServiceCycle de vie
E. Ramat (ULCO) Android 7 septembre 2013 176 / 207
ServiceDéclaration des services
Déclaration
Hormis la déclaration de la classe Java représentant le service, le service doit êtredéclaré dans le �chier Manifest de l'application
<manifest ... ><application ... >
...<service android:name="MyService" />...
</application ... >...
</manifest >
E. Ramat (ULCO) Android 7 septembre 2013 177 / 207
ServiceLe mode �startService�
Lancement d'une commande
comme pour les activités, l'appel à startService passe par la constructiond'une intention
l'intention permet de désigner le service à invoquer
les paramètres d'appel sont aussi rattachés à l'intention sous forme d'extras
Appel à un service
Intent intent = new Intent(this , MyService.class);intent.putExtra("myParamter", 12);startService(intent );
Attention
l'appel à startService est asynchrone : le client n'est donc pas bloqué
attention, l'appel au service provoque l'exécution de la méthodeonStartCommand et cette dernière ne doit pas être trop longue (sinonutilisation des threads)
E. Ramat (ULCO) Android 7 septembre 2013 178 / 207
ServiceLe mode �startService�
Retour de onStartCommand
La méthode onStartCommand retourne un indicateur :
START_STICKY : le service n'est pas arrêté après l'appel via startService
et en cas d'arrêt, il devrait être replacé dans l'état démarré (pas besoin derefaire startService)
START_REDELIVER_INTENT : le service devrait être redémarré par unappel à startService avec la même intention s'il est arrêté par le systèmeet non par stopService
START_NOT_STICKY :le service devrait être recréér explicitement par unappel à startService
stop
La méthode stopService (ou stopSelf lorsque l'on est dans le service) arrête etdétruit le service, même s'il y a eu plusieurs appels à startService.
E. Ramat (ULCO) Android 7 septembre 2013 179 / 207
ServiceLe mode �bindService�
Dé�nitions
une activité qui se lie (bind) à un service peut alors accèder à l'API publiqueexposée par le binder du service
un binder est une sous-classe de Binder et dé�nit les méthodes fournies parle service
la méthode onBind du service renvoie une instance de la sous-classe deBinder
la liaison du côté client est gérée par un objet ServiceConnection
à la �n, le client doit faire appel à unbindService pour indiquer qu'il n'aplus besoin du service
E. Ramat (ULCO) Android 7 septembre 2013 180 / 207
ServiceLe mode �bindService�
Appel à un service
protected void onStart () {super.onStart ();Intent intent = new Intent(this , LocalService.class);bindService(intent , mConnection , Context.BIND_AUTO_CREATE );
}
protected void onStop () {super.onStop ();if (mBound) {
unbindService(mConnection );mBound = false;
}}
Explications
lors du démarrage de l'activité, utilisatrice du service, il y a création del'intention pour le lancement du service
le service est ensuite lancée via la méthode bindService et la connexion estgéré par l'objet mConnection
E. Ramat (ULCO) Android 7 septembre 2013 181 / 207
ServiceLe mode �bindService�
L'objet de connexion au service
private ServiceConnection mConnection = new ServiceConnection () {
public void onServiceConnected(ComponentName className , IBinder service) {LocalBinder binder = (LocalBinder) service;mService = binder.getService ();mBound = true;
}
public void onServiceDisconnected(ComponentName arg0) {mBound = false;
}};
Explications
l'objet mConnection est une instance d'une classe anonyme de typeServiceConnection
lors de la connexion au service, la méthode onServiceConnected récupèreune référence sur le service via le binder a�n de pouvoir invoquer lesméthodes o�ertes par le service
E. Ramat (ULCO) Android 7 septembre 2013 182 / 207
ServiceLe mode �bindService�
Appel aux méthodes du service
public void onButtonClick(View v) {if (mBound) {
int num = mService.getRandomNumber ();Toast.makeText(this , "number: " + num , Toast.LENGTH_SHORT ).show ();
}}
Explications
l'objet mService permet d'invoquer les méthodes disponibles
mBound permet de véri�er que l'on est bien lié au service
E. Ramat (ULCO) Android 7 septembre 2013 183 / 207
ServiceLe mode �bindService�
Le service
public class LocalService extends Service {private final IBinder mBinder = new LocalBinder ();private final Random mGenerator = new Random ();
public class LocalBinder extends Binder {LocalService getService (){ return LocalService.this; }
}
public IBinder onBind(Intent intent){ return mBinder; }
public int getRandomNumber (){ return mGenerator.nextInt (100); }
}
Explications
le binder dispose seulement d'une méthode qui donne accès au service
seule la méthode onBind est développée donc le service ne sera accessiblequ'en mode bind
E. Ramat (ULCO) Android 7 septembre 2013 184 / 207
Service�Remote service�
Dé�nition
par défaut, un service s'exécute dans le processus de l'application qui l'a lancé
par conséquent, le service est stoppé dès que l'application est arrêtée
un service peut être embarqué dans un processus à part
<manifest ... ><application ... >
...<service android:name="MyService"
android:process=":remote"/>...
</application ... >...
</manifest >
�Remote activity�
Une activité peut être aussi �remote�, l'activité ne s'exécute plus alors dans leprocessus de l'application.
E. Ramat (ULCO) Android 7 septembre 2013 185 / 207
ServiceCommunication à partir d'un �Remote service�
Communication
communiquer entre un client et un �Remote service� nécessite unearchitecture particulière
TODO
E. Ramat (ULCO) Android 7 septembre 2013 186 / 207
Communication
E. Ramat (ULCO) Android 7 septembre 2013 187 / 207
CommunicationIntroduction
Besoin
Se connecter à des services externes (web service, base de données, . . . )
Ce qui faut pour communiquer
un support de communication (wi�, 3G, bluetooth, . . . )
des autorisations de la part d'Android
une API de communication (socket, org.apache.http, . . . ) lié à un protocoled'échange (HTTP + XML, par exemple)
E. Ramat (ULCO) Android 7 septembre 2013 188 / 207
CommunicationSupports de communication
Les moyens
Plusieurs façons d'accéder à un réseau :
en Wi� : 54 Mbit/s max (27 Mbit/s en moyenne) ou 11 Mbit/s max (6Mbit/s en moyenne)
à l'aide d'un adaptateur USB - Ethernet (attention, supporté par peu determinal !)
Adaptateur USB - Ethernet
E. Ramat (ULCO) Android 7 septembre 2013 189 / 207
CommunicationSupports de communication
Les moyens - suite
en mobile :I GSM (2G) (Global System for Mobile Communication) : uniquement la
voixI GPRS (2.5G) (Global Packet Radio Service) : 171,2kbit/s max (50 kbit/s
en moyenne)I Edge (2.75G) (Enhanced Data Rates for GSM Evolution) : 384 kbit/s max
(64 kbit/s en moyenne)I UMTS (3G) (Universal Mobile Telecommunications System) : 2 Mbit/s
max (384 kbit/s en moyenne)
E. Ramat (ULCO) Android 7 septembre 2013 190 / 207
CommunicationSupports de communication
Les moyens - suite
en mobile :I HSDPA (3.5G) (High Speed Downlink Packet Access) : 14,4 Mbit/s max
en �ux descendant et 384 kbit/s max en �ux montant (UMTS)I HSPA+ ou 3G++ ou H+ (3.75G) (High Speed Uplink Packet Access) :
84,4 Mbit/s en �ux descendant et 23 Mbit/s en �ux montantI LTE (3.9G) (Long Term Evolution) : 326,4 Mbit/s max en �ux descendant
et 86,4 Mbit/s en �ux montantI LTE+ (4G) (LTE-Advanced) : 1 Gbit/s à l'arrêt et 100 Mbit/s en mouvement
en �ux descendant
La réalité
En pratique, en wi� < 10 Mbit/s et en mobile entre 64 kbit/s et 384 kbit/s.
E. Ramat (ULCO) Android 7 septembre 2013 191 / 207
CommunicationLes autorisations et véri�cations
Préalable
L'application Android désirant un accès à Internet doit :
possèder l'autorisation
véri�er si la connexion est active
Autorisation
Dans le �chier AndroidManifest.xml, il faut ajouter :
<uses -permission android:name="android.permission.INTERNET"/><uses -permission android:name="android.permission.ACCESS_NETWORK_STATE" />
android.permission.INTERNET : autorise à ouvrir des sockets réseau
android.permission.ACCESS_NETWORK_STATE : autorise d'accéder àl'état du réseau
E. Ramat (ULCO) Android 7 septembre 2013 192 / 207
CommunicationLes autorisations et véri�cations
Véri�cations
Avant de tenter un accès au réseau, il est indispensablde de véri�er que l'accès estpossible
La classe ConnectivityManager
La classe ConnectivityManager est un service qui vous permet :
de monitorer l'état de la connexion,
de connaître le type (bluethooth, mobile, wi�, wimax, . . . )
private boolean isNetworkAvailable () {ConnectivityManager connectivityManager =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE );NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo ();NetworkInfo.State networkState = activeNetworkInfo.getState ();return networkState.compareTo(State.CONNECTED) == 0;
}
E. Ramat (ULCO) Android 7 septembre 2013 193 / 207
CommunicationLes autorisations et véri�cations
Etat de la connexion
CONNECTING : en cours de connexion
CONNECTED : connecté
DISCONNECTING : en cours de deconnexion
DISCONNECTED : déconnecté
Type de la connexion
Via la méthode getType de la classe NetworkInfo, on peut connaître comment leterminal est connecté à Internet :
TYPE_BLUETOOTH
TYPE_ETHERNET
TYPE_MOBILE
TYPE_WIFI
TYPE_WIMAX
E. Ramat (ULCO) Android 7 septembre 2013 194 / 207
CommunicationAPI de communication
API disponibles
au coeur d'Android, les sockets : protocole de très bas niveau
la bibliothèque HttpClient d'Apache
ou des bibliothèques tiers
DefaultHttpClient
la classe DefaultHttpClient est une sous-classe de HttpClient
elle propose un ensemble de classes pour la gestion d'une transaction HTTP :I GET : méthode de lecture ; l'état de la ressource (identi�ée par une URI -
Uniform Resource Identifier) n'est pas modi�éI POST : envoi de données dans l'objectif de créer d'une nouvelle ressource ou
modi�cation d'une ressource rattachée à l'URI d'appelI PUT : modi�cation ou création d'une ressourceI DELETE : suppression d'une ressource
Seule la méthode POST n'a pas le même résultat si on envoie plusieurs fois lamême requête.
E. Ramat (ULCO) Android 7 septembre 2013 195 / 207
CommunicationAPI de communication
Méthodes et version de HTTP
il existe d'autres méthodes HTTP (HEAD, TRACE, OPTIONS etCONNECT).
seules les méthodes GET, POST et HEAD sont dé�nies dans la normeHTTP/1.0
Etapes
création d'une instance de la classe DefaultHttpClient qui implémentel'interface HttpClient
création d'une instance d'un objet représentant la requête (HttpGet,HttpPost, . . . )
réglage des propriétés de cette requête (par exemple, les couples clé, valeurdes éléments passés lors d'une requête Post)
exécution de la requête grâce à l'instance de DefaultHttpClient
analyse et traitement de la réponse
E. Ramat (ULCO) Android 7 septembre 2013 196 / 207
CommunicationAPI de communication
Méthode GET
le constructeur de la classe HttpGet admet l'URI en paramètre
les paramètres de la requête peuvent être :I soit passés directement dans l'URI (comme dans l'exemple)I soit a�ectés à la requête via les classes BasicNameValuePair et
UrlEncodedFormEntity
DefaultHttpClient client = new DefaultHttpClient ();HttpGet request = new HttpGet("http ://127.0.0.1/ index.php?param1 =1& param2 =2");HttpResponse response = client.execute(request );
E. Ramat (ULCO) Android 7 septembre 2013 197 / 207
CommunicationAPI de communication
Méthode POST
La construction d'une requête de type POST suivit le même modèle que laméthode GET.
DefaultHttpClient client = new DefaultHttpClient ();HttpPost request = new HttpPost("http ://127.0.0.1/ index.php");List <NameValuePair > nameValuePairs = new ArrayList <NameValuePair >();
nameValuePairs.add(new BasicNameValuePair("param1", "1"));nameValuePairs.add(new BasicNameValuePair("param2", 2));request.setEntity(new UrlEncodedFormEntity(nameValuePairs ));
HttpResponse response = client.execute(request );
Attention aux exceptions
Des exceptions peuvent être levées lors de l'encodage !
Les URI
Vous pouvez voir la forme �nale de l'URI grâce à la méthode getURI de HttpGetou HttpPost.E. Ramat (ULCO) Android 7 septembre 2013 198 / 207
CommunicationAPI de communication
Les cookies
la classe DefaultHttpClient gère nativement les cookies.
il est important de disposer du mécanisme des cookies a�n de gérerl'identi�ant de session sur le serveur.
Sessions en PHP
session_start ();
$_SESSION['login'] = $login;
session_start active le mécanisme de session sur le serveur
la variable $_SESSION permet de stocker des informations sur le serveurliées à une session utilisateur
la session est identi�ée par un id stocké dans les cookies du client
[1]: 127.0.0.1 FALSE / FALSE 0 PHPSESSID g5lj83115di2err25mv2af9kr5
E. Ramat (ULCO) Android 7 septembre 2013 199 / 207
CommunicationAnalyse de la réponse
Les formats de réponse
tous les formats sont possibles surtout si on utilise les sockets
dans un contexte HTTP, on peut utiliser :I le format HTML avec le composant WebKit d'Android par exempleI un format XMLI le format JSON (JavaScript Object Notation - RFC 4627) : notation
textuelle basée sur des ensembles de paires nom / valeur et des listesordonnées de valeurs.
I . . .
Données JSON
{"firstName": "John","lastName": "Smith","age": 25,"address": {
"streetAddress": "21 2nd Street","city": "New York","postalCode": "10021"
}}
E. Ramat (ULCO) Android 7 septembre 2013 200 / 207
CommunicationAnalyse de la réponse XML
Parsing de réponse XML
Deux stratégies de parsing :
DOM (Document Object Model) : une représentation mémoire dudocument est contruite et on �navigue� dedans
SAX (Simple API for XML) : analyse séquentielle du document etactivation de fonctions d'analyse en fonction des éléments rencontrés
<?xml version="1.0" encoding="UTF -8" ?><response id="1" />
Analyse DOM
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance ();DocumentBuilder builder = factory.newDocumentBuilder ();Document doc = builder.parse(response.getEntity (). getContent ());Element root = doc.getDocumentElement ();
if (root.getNodeName (). compareTo("response") == 0) {id = Integer.parseInt(root.getAttributes (). getNamedItem("id"). getNodeValue ());
}E. Ramat (ULCO) Android 7 septembre 2013 201 / 207
Noti�cation
E. Ramat (ULCO) Android 7 septembre 2013 202 / 207
Noti�cationDé�nitions
Dé�nition
lors de l'arrivée d'un événement (arrivée d'un mail, réception d'un SMS,batterie faible, . . .), Android propose un framework de gestion d'alerte : lesnoti�cations
les noti�cations sont très utilisées par les services éxecutées en arrière-plan
le gestion des noti�cations passe par la classe NotificationManager
plusieurs types de noti�cation possibles : un message, une led clignotante oules vibrations
NotificationManager
Trois méthodes :
notify : pour l'envoi d'une noti�cation
cancel et cancelAll : pour l'annulation d'une noti�cation
E. Ramat (ULCO) Android 7 septembre 2013 203 / 207
Noti�cationExemples
Envoi d'un message
NotificationManager mgr =(NotificationManager)getSystemService(NOTIFICATION_SERVICE );
Notification note = new Notification(R.drawable.notify_icon ,"my message",System.currentTimeMillis ());
mgr.notify(MY_NOTIFY_ID , note);
Explications
la création d'une noti�cation passe par la création d'une instance de la classeNotification
il faut associer une image (une icône) à la noti�cation (premier paramètre duconstructeur de Notification)
l'icône doit posséder une résolution propotionnelle à l'écran, il faut dé�nir 3versions (12x12, 16x16 et 24x24)
le message spéci�é sera a�ché dans la barre d'état
le troisième paramètre indique simplement la date de création de lanoti�cationE. Ramat (ULCO) Android 7 septembre 2013 204 / 207
Noti�cationExemples
Noti�cation et activité
le méthode setLastestEventInfo précise quen l'on a�che un titre et unmessage lorsque l'on clique sur la noti�cation
de plus, on lance le PendingIntent lorsque l'on clique sur le message
Envoi d'un message
PendingIntent i = PendingIntent.getActivity(this , 0,new Intent(this , NotifyMessage.class), 0);
note.setLastestEventInfo(this , "Titre de la notification","Message de notification", i);
E. Ramat (ULCO) Android 7 septembre 2013 205 / 207
Noti�cationExemples
Noti�cation et vibration
l'objet de type Noti�cation possède un attribut �ags pour spéci�er le type denoti�cation : message, vibration et/ou led
note.vibrate = new long[] { 500, 200, 200, 500 };note.flags |= Notification.FLAG_AUTO_CANCEL;
vibrate dé�nit le �motif� de vibration et le �ag FLAG_AUTO_CANCEL permetd'indiquer sur la noti�cation est annulée automatiquement quand l'utilisateurclique dessus
Noti�cation et permission
Attention ! Pour les vibrations, il faut dé�nir la permission.
E. Ramat (ULCO) Android 7 septembre 2013 206 / 207
Copyright
Auteur
Éric Ramat [email protected] Daquin [email protected]
Licence
Copyright (C) 2011-2013 - LISIC - ULCO
Permission is granted to copy, distribute and/or modify this document under theterms of the GNU Free Documentation License, Version 1.2 or any later versionpublished by the Free Software Foundation; with no Invariant Sections, noFront-Cover Texts, and no Back-Cover Texts. A copy of the license is included inthe section entitled "GNU Free Documentation License".
E. Ramat (ULCO) Android 7 septembre 2013 207 / 207