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
Plan 1 Introduction 2 Environnement de développement 3 Structure d'un programme Android 4 Activité 5 Ressources 6 Interface utilisateur Vues et widgets Interactions 7 Préférences 8 Stockage de données 9 Graphique 10 Processus et threads 11 Service 12 Communication 13 Notication E. Ramat (ULCO) Android 7 septembre 2013 2 / 207
Introduction E. Ramat (ULCO) Android 7 septembre 2013 3 / 207
Introduction Pourquoi 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
Introduction Pourquoi 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
Introduction Les 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
Introduction Les chires 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
Introduction Les 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 comme interface utilisateur) LiMo (basé sur Linux) Angström distribution (Linux minimaliste pour système embarqué) OpenMoko (spécications matérielles et logicielles ; basé sur Linux ; libre) E. Ramat (ULCO) Android 7 septembre 2013 8 / 207
Introduction Les 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
Introduction Problé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'achage divers (et réduit dans le cas des téléphones) diculté de pointage (touch ou stylet) et de saisie (clavier physique ou virtuel) E. Ramat (ULCO) Android 7 septembre 2013 10 / 207
Introduction Problé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
Introduction Qu'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
Introduction Qu'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
Introduction Qu'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
Introduction Qu'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écication 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 est basée sur une machine à registres E. Ramat (ULCO) Android 7 septembre 2013 15 / 207
Introduction Qu'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
Introduction Qu'est-ce qu'android? L'architecture d'android E. Ramat (ULCO) Android 7 septembre 2013 17 / 207
Introduction Qu'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 SysV IPC) 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 en cas de mémoire insusante logger : gestion des logs ("main", "events", "radio" - sms/voix - et "system") E. Ramat (ULCO) Android 7 septembre 2013 18 / 207
Introduction Qu'est-ce qu'android? Autres caractéristiques nagivateur web intégré basé sur le moteur WebKit OSS (utilisé dans chrome et safari) graphique 3D basé sur OpenGL ES (Open Graphics Library for Embedded System) 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
Introduction Qu'est-ce qu'android? Les versions E. Ramat (ULCO) Android 7 septembre 2013 20 / 207
Introduction Qu'est-ce qu'android? La suivante 4.4 : Kit Kat E. Ramat (ULCO) Android 7 septembre 2013 21 / 207
Introduction Qu'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
Introduction Qu'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
Introduction Qu'est-ce qu'android? version 1.0 : Apple Pie création d'android Market (le modèle de diusion 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 notications (barre de status, personnalisation des sonneries, vibreur et LED) Youtube et quelques applications E. Ramat (ULCO) Android 7 septembre 2013 24 / 207
Introduction Qu'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
Introduction Qu'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 Internet depuis l'écran d'accueil mise à jour de la recherche vocale et meilleure intégration avec les applications 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èse vocale 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
Introduction Qu'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, eets 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
Introduction Qu'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 de l'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
Introduction Qu'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
Introduction Qu'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
Introduction Qu'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 boutons physiques 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
Introduction Qu'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 notications recherche vocale améliorée à la façon de Siri sur ios E. Ramat (ULCO) Android 7 septembre 2013 32 / 207
Introduction Qu'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
Introduction Qu'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 simplication de l'assistant d'installation ajout de nouvelles langues E. Ramat (ULCO) Android 7 septembre 2013 34 / 207
Introduction Android Market / Google Play Dénition système standard de téléchargement des applications renommé en Google Play pas de vérication 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 : 70% pour le développeur 30% pour Google gestion des revenus via Google Checkout 57% des applications sont gratuites E. Ramat (ULCO) Android 7 septembre 2013 35 / 207
Environnement de développement E. Ramat (ULCO) Android 7 septembre 2013 36 / 207
Environnement de développement L'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éveloppement Installation 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éveloppement Installation 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 et https://dl-ssl.google.com/android/eclipse comme Location puis valider 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éveloppement Installation 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éveloppement Installation 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 le fait que vous envoyez vos statistiques d'utilisation des outils Android. E. Ramat (ULCO) Android 7 septembre 2013 41 / 207
Environnement de développement Installation 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 la possibilité de créer un projet Android ou un projet de tests d'une application Android Installation des API et des émulations Il faut maintenant installer les API Android et dénir une émulation d'une machine Android via AVD Manager. E. Ramat (ULCO) Android 7 septembre 2013 42 / 207
Environnement de développement Installation 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 : cocher SDK Platform Android 3.2, API 13, revision 1 cocher Samples for SDK API 13, revision 1 (si vous désirez les exemples) cocher Documentation for Android SDK, API 13, revision 1 (si vous désirez installer la documentation) cliquer sur Install Selected et vérier que tous les packages sont Accept puis cliquer sur Install E. Ramat (ULCO) Android 7 septembre 2013 43 / 207
Environnement de développement Installation 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 les mêmes problèmes de droits. E. Ramat (ULCO) Android 7 septembre 2013 44 / 207
Environnement de développement Installation 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 de sé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éveloppement Installation Dénition d'une émulation lancer l'application android du répertoire /opt/android-sdk/tools ou sélectionner Android SDK and AVD Manager du menu Window sous Eclipse 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éveloppement Installation 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 de machines existantes (Samsung, HTC, Sony Ericson,... ) pour obtenir le même rendu que sur la machine réelle il est possible de dénir des paramètres au matériel (par exemple, la taille de la 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 Android Cré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'application possé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 est concaténé le mot Activity (on peut désactiver cette option) E. Ramat (ULCO) Android 7 septembre 2013 49 / 207
Structure d'un programme Android Création d'un projet Android sous Eclipse Nouveau projet - suite la version minimale du SDK est mise automatiquement en fonction de l'api cible (si vous n'utilisez pas d'éléments spéciques à l'api cible, vous pouvez spécier 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 Android Création d'un projet Android Création sans Eclipse Il est possible de créér un projet Android sans Eclipse via l'outil android du ré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 Android Structure 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 de l'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 de caractères constantes, layout,... ) src : les chiers sources Java du projet placés dans un sous-répertoire conforme au nom de package déclaré E. Ramat (ULCO) Android 7 septembre 2013 52 / 207
Structure d'un programme Android Structure 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'une application Android : les chiers.dex, les ressources, les assets, le chier manifest,... E. Ramat (ULCO) Android 7 septembre 2013 53 / 207
Structure d'un programme Android Structure d'un projet Android Le chier R.java il contient en fait l'ensemble des références vers les ressources du projet (lien entre 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'attribut icon 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 chier xml (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 Android Structure d'un projet Android Le chier strings.xml au lieu d'utiliser des chaînes de caractères constantes dans le code, il faut déporter ces chaînes dans le chier strings.xml qui fait le lien entre un identiant 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 chiers strings.xml E. Ramat (ULCO) Android 7 septembre 2013 55 / 207
Structure d'un programme Android Structure 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 monde Android) le niveau minimal d'api la liste des librairies nécessaires à l'application la description des composants de l'application (activités, services, récepteur de 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 Android Architecture 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és par l'application sa propre machine virtuelle (dans un processus Linux) an d'isoler les applications entre elles son propre processus Linux, un processus est lancé dès qu'un des composants d'une application est lancée et arrêté dès que l'application est arrêtée ou lorque 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 Android Architecture d'une application Android Une architecture basée sur les composants les activités : un simple écran avec une interface graphique avec laquel l'utilisateur peut interagir les services : un composant qui permet d'exécuter en tâche de fond un traitement long ou se connecter à un service distant (pas d'interface graphique) les récepteurs de ux/évenement : un composant à l'écoute d'événements et ache une notication ou exécute une activité les fournisseurs de contenu : un composant de gestion des données qui donnent accès à des données E. Ramat (ULCO) Android 7 septembre 2013 58 / 207
Structure d'un programme Android Architecture d'une application Android Intent les intents (intentions) permet d'envoyer des messages asynchrones à des activités ou services ou récepteurs, pour les activer un intent peut être implicite (activation d'un type de composants) ou explicite (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 avec lequel 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 est mise 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 et la 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 et l'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émarrage total du système lorsque l'activité est relancée après une destruction totale de l'activité ou de l'application lorsque le terminal changé d'état (mode portrait / mode paysage, par exemple) et que l'activité utilise des ressources diérentes en fonction de l'é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éciques, il est nécessaire de surcharger la méthode onsaveinstancestate() pour sauvegarder ces attributs la méthode onrestoreinstancestate() pour restaurer les attributs lors du redémarrage 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 de savoir 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 la mé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) et une 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 depuis trop longtemps alors qu'elle était en pause (l'activité peut être détruite ensuite - 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é de l'application il existe d'autres attributs dénissant les propriétés de l'activité (le thème ou l'orientation de la vue, par exemple) les attributs permettent aussi de dénir les permissions, les événements capturé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 de l'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, on utilise un nommage direct de l'activité (en oppostion au intention via des URI) 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éthode startactivityforresult) 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 : de savoir quelle activité vient de nir si l'activité s'est terminée correctement (Activity.RESULT_OK ou Activity.RESULT_CANCELED) 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 de catégorie LAUNCHER android.intent.action.main indique que c'est l'activité initiale et qu'elle est lancée sans donnée d'entrée et sans donnée de retour une icône doit être spéciée an que l'application apparaisse dans le menu principal 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
Ressources Dénitions Dénition informations statiques, stockées en dehors du code Java, plusieurs types : des images des valeurs (chaînes, couleurs, tableaux, dimensions) associés à des noms symboliques des chiers XML statiques 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 code Java! 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 : animator pour la dénition des animations (succession d'images avec des délais et des transitions) anim pour la dénition des animations des vues color pour les listes de couleurs liées à un état drawable pour les images, layout pour la description XML des éléments d'interface menu pour la description XML des menus raw pour les chiers de l'application (chiers audios, chiers de données de type CSV, par exemple) values pour les messages, les dimensions, les couleurs, les tableaux de constantes,... xml pour les chiers XML E. Ramat (ULCO) Android 7 septembre 2013 78 / 207
Ressources Utilisation 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 et accessible via des constantes de sous-classe de la classe R R. string. hello R. layout. main Il ne faut surtout pas modier le chier R.java à la main! Les entiers sont générés de manière automatique. E. Ramat (ULCO) Android 7 septembre 2013 79 / 207
Ressources Utilisation - 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 ); Aectation d'un texte à une zone de texte Dans un chier de type Layout, un élément de type TextView est déni avec l'identiant msg (android:id="@+id/msg") TextView msgtextview = ( TextView ) findviewbyid (R. id. msg ); msgtextview. settext (R. string. hello_message ); Unicité des identiants La déclaration des id (@+id/...) doit être unique dans l'ensemble du layout. E. Ramat (ULCO) Android 7 septembre 2013 80 / 207
Ressources Utilisation - 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 un layout <Button... android:text =" @string / submit " / > E. Ramat (ULCO) Android 7 septembre 2013 81 / 207
Ressources Les 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 ociellement déconseillé La ressource de type image (drawable) ic_launcher est dénie comme l'icône de l'application. < application android:icon =" @drawable / ic_launcher "... / > E. Ramat (ULCO) Android 7 septembre 2013 82 / 207
Ressources Les couleurs Dénition il est possible de dénir sous forme de constantes les couleurs utilisées dans une application les couleurs sont dénies res/values/colors.xml plusieurs formes pour exprimer les couleurs : #RGB : un seul digit hexadécimal est utilisé pour exprimer chaque composante de la couleur (#000 désigne le noir, c'est équivalent à #000000) ; #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àd totalement opaque) #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
Ressources Les styles Dénition un style est un assemblage de plusieurs attributs utilisés plusieurs fois dans l'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
Ressources Ressources alternatives Dénition des alternatives les alternatives sont utilisées pour répondre aux problèmes d'hétérogéniété du matériel, à l'orientation de l'écran, à la langue, du mode jour/nuit,... par exemple : plusieurs versions d'une même image peut être proposées en fonction de la résolution de l'écran 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 double dénition. E. Ramat (ULCO) Android 7 septembre 2013 85 / 207
Interface utilisateur E. Ramat (ULCO) Android 7 septembre 2013 86 / 207
Interface utilisateur Introduction générale Ergonomie concevoir votre application pour un périphérique mobile avec toutes ses contraintes 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 conrmation 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 utilisateur Introduction 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 an de limiter les recondances Il est important de suivre les diérents guides de conception d'android pour obtenir une applications conformes aux attentes des utilisateurs E. Ramat (ULCO) Android 7 septembre 2013 88 / 207
Interface utilisateur Introduction générale Préceptes beauté : même l'icône de l'application est importante simplicité : l'utilisation doit être intuitive introduiser des dessins explicites, intégrer des actions de navigation simple (balayage du doigt, par exemple) faites des messages les plus courts possibles les choses importantes doivent être rapide d'accès décomposer les tâches complexes en petites étapes informer l'utilisateur lors des actions (même sous forme ash) E. Ramat (ULCO) Android 7 septembre 2013 89 / 207
Interface utilisateur Introduction générale Organisation un écran de démarrage (ou écran principal) : l'identité de votre application doit contenir une grande partie de la navigation à adapter à la taille des écrans 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 utilisateur Vues et widgets Dénitions - Vue chaque activité possède une fenêtre graphique pour interagir avec elle il existe 2 stratégies de construction : totalement en Java par instantation des widgets à l'aide de chiers XML de dénition des widgets composants l'interface l'interface graphique d'une activité est construite à partir de View (classe android.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 qui permet 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 utilisateur Layout XML Dénitions un layout XML est une réprésentation XML de l'organisation des widgets d'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 ore des outils de dénition graphique. E. Ramat (ULCO) Android 7 septembre 2013 92 / 207
Interface utilisateur LinearLayout 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 identiants (@+id/...) en revanche, les textes ne sont pas génériques (déni directement) E. Ramat (ULCO) Android 7 septembre 2013 93 / 207
Interface utilisateur LinearLayout - 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ètres spéciques les paramètres qui s'appliquent sont ceux du layout dans lequel l'élément est déni et ceux de l'élément E. Ramat (ULCO) Android 7 septembre 2013 94 / 207
Interface utilisateur LinearLayout - paramètres layout_width et layout_height ces deux paramètres permettent de xer la largeur et la hauteur d'un composant 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 utilisateur LinearLayout - 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 dpi correspond à 1 pixel) ; s'adapte à la densité sp : mesure dépendant de la police de caractères choisie basé sur la taille physique : mm : millimètre in : pouce 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 composant occupe tout l'espace disponible après le placement des autres widgets E. Ramat (ULCO) Android 7 septembre 2013 96 / 207
Interface utilisateur LinearLayout - paramètres Position dans la plupart des cas, c'est automatique (calculé) dans les autres (AbsoluteLayout ou FrameLayout), la position des widgets doit ê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 utilisateur LinearLayout - paramètres Poids - layout_weight le poids permet de spécier le partage de l'espace disponible pour les composants du layout si layout_width et layout_height sont xés à ll_parent, les composants se partageront l'espace en fonction de leur poids si les poids sont identiques (1 pour tous les composants) alors la taille de chaque composant sera égale si layout_width et layout_height sont nuls pour l'ensemble des composants du layout alors layout_weight est un pourcentage Gravité - layout_gravity par défaut, les composants d'un layout s'aligne à gauche pour une orientation verticale la gravité permet de modier cet alignement avec les valeurs : left, center_horizontal, right pour une oriantation horizontal ; top, center_vertical, bottom pour une orientation verticale E. Ramat (ULCO) Android 7 septembre 2013 98 / 207
Interface utilisateur LinearLayout - paramètres Modication des paramètres depuis le code Java Tous les paramètres sont modiables via des méthodes Java. Exemple Au préalable, il faut avoir déni un identiant sur le composant sur lequel on veut agir. <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 utilisateur Layout - les autres Types RelativeLayout : le positionnement des composants est relatif aux autres composants et au layout parent ; TableLayout : les composants sont rangés selon un tabeau ScrollView : le composant englobé dans un ScrollView possède la faculté de déler E. Ramat (ULCO) Android 7 septembre 2013 100 / 207
Interface utilisateur Widgets - introduction Dénition comme toute interface graphique moderne, Android propose des éléments graphiques pour les interactions et l'achage : les widgets des widgets simples : boutons, champs de saisie, cases à cocher, boutons radios, 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 et donne accès à son état une description XML avec des paramètres pour le dénir graphiquement et pour 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 utilisateur Widgets - introduction E. Ramat (ULCO) Android 7 septembre 2013 102 / 207
Interface utilisateur Widgets - Label Dénition le Label (la classe TextView) est le plus simple des widgets achage d'un texte (modiable via la classe TextView) attributs XML spéciques : android:text : texte associé android:textsize : taille de la police de caractères android:textstyle : gras (bold), italique (italic) ou les deux (bold_italic) android:textcolor : couleur du texte au format RGB android:textface : police d'achage (normal, sans, serif, monospace) Pensez à utiliser des ressources pour la dénition des chaînes de caractères et des couleurs E. Ramat (ULCO) Android 7 septembre 2013 103 / 207
Interface utilisateur Widgets - 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 utilisateur Widgets - Bouton Dénition la classe Button permet de représenter un bouton sur lequel on peut appuyer et cliquer attributs identiques à ceux de TextView possibilité de customiser le rendu des états du bouton via StateList Exemple < Button android:layout_height =" wrap_content " android:layout_width =" wrap_content " android:text =" @string / button_text " / > E. Ramat (ULCO) Android 7 septembre 2013 105 / 207
Interface utilisateur Widgets - 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 graphiques utilisant 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 utilisateur Widgets - Bouton Dénition du bouton customisé Modication de l'attribut background < Button android:layout_height =" wrap_content " android:layout_width =" wrap_content " android:background =" @drawable / state_list_drawable " / > Bouton à états La classe ToggleButton ache un bouton à 2 états (ON/OFF) E. Ramat (ULCO) Android 7 septembre 2013 107 / 207
Interface utilisateur Widgets - 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 : android:autotext : active la correction automatique de l'orthographe android:capitalize : mets automatiquement la première lettre en majuscule android:digits : n'accepte que des chires 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 activant l'autocompletion d'android. E. Ramat (ULCO) Android 7 septembre 2013 108 / 207
Interface utilisateur Widgets - Cases à cocher Dénition le widget CheckBox permet d'obtenir un composant à deux états répresentés par une boîte à cocher les propriétés sont les mêmes que le widget TextView en Java, on accède à l'état : ischecked() ; on peut modier l'état : setchecked() ; on peut inverser l'état : toggle() E. Ramat (ULCO) Android 7 septembre 2013 109 / 207
Interface utilisateur Widgets - Bouton radio Dénition le widget RadioButton et le conteneur RadioGroup orent la possibilité de dé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, on accède à l'état : check() ou check(id) depuis le groupe ; on peut déchocher : clearcheck() ; on obtient l'identiant du bouton radio coché : getcheckedradiobuttonid() à partir du groupe E. Ramat (ULCO) Android 7 septembre 2013 110 / 207
Interface utilisateur Widgets - Bouton radio Exemple Un groupe de deux boutons radio avec le bouton radiofemale coché par défaut < RadioGroup android:id ="@+id / radiosex " android:layout_width =" wrap_content " android:layout_height =" wrap_content " > </ RadioGroup > < RadioButton android:id ="@+id / radiomale " android:layout_width =" wrap_content " android:layout_height =" wrap_content " android:text =" @string / radio_male " android:checked =" true " / > < RadioButton android:id ="@+id / radiofemale " android:layout_width =" wrap_content " android:layout_height =" wrap_content " android:text =" @string / radio_female " / > E. Ramat (ULCO) Android 7 septembre 2013 111 / 207
Interface utilisateur Widgets - 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 la possibilité à une image de réagir comme un bouton (clics et autres) un attribut android:src spécie la ressource de type drawable Exemple < ImageView android: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 utilisateur Widgets de sélection Dénition le principe général des widgets de sélection est d'orir à l'utilisateur la possibilité de choisir quelque chose dans une liste la liste peut être composée de texte, de bouton à cocher, d'images,... les données à acher 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'identiant de la ressource de type list qui sera destinataire de la liste de string semaine est le tableau E. Ramat (ULCO) Android 7 septembre 2013 113 / 207
Interface utilisateur Widgets 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 via l'adapter ; si la vue de votre activité se limite à une liste (et c'est souvent le cas), alors il est 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 " > < TextView android:id ="@+id / selection " android:layout_width =" fill_parent " android:layout_height =" wrap_content " android:text =" @string / choice_message " / > < ListView android:id =" @android:id / list " android:layout_width =" fill_parent " android:layout_height =" fill_parent " / > E. Ramat (ULCO) Android 7 septembre 2013 114 / 207
Interface utilisateur Widgets de sélection Exemple private String [] semaine = {" Lundi ", " Mardi ", " Mercredi ", " Jeudi ", " Vendredi ", " Samedi ", " Dimanche " }; @Override public 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 sut de faire appel à setlistadapter. E. Ramat (ULCO) Android 7 septembre 2013 115 / 207
Interface utilisateur Interactions 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 : 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é 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 explicite de l'objet. E. Ramat (ULCO) Android 7 septembre 2013 116 / 207
Interface utilisateur Interactions 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 aussi permettre certaines interactions. E. Ramat (ULCO) Android 7 septembre 2013 117 / 207
Interface utilisateur Interactions 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 chose dans 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 utilisateur Interactions 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'objet de type View on parle d'event listener : écouteur d'événements par exemple : l'utilisateur clique sur un bouton le widget bouton capture l'événement l'événement est envoyé au listener une méthode du listener est invoquée E. Ramat (ULCO) Android 7 septembre 2013 119 / 207
Interface utilisateur Interactions Stratégies de codage utilisation d'un paramètre XML pour nommer la méthode à invoquer de l'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 ou directement 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é est appelée (public void click(view view)) < Button android: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 utilisateur Interactions Implémentation d'un Listener L'activité implémente un Listener et la méthode de traitement de l'événement et 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 utilisateur Interactions Implémentation d'une classe anonyme Lors de l'aectation du Listener, il y a création d'un objet à partir d'une classe anonyme (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 utilisateur Interactions Attribut On peut aussi passer un attribut aecté à la déclaration par une instance d'une classe anonyme private OnClickListener mmybuttonlistener = new OnClickListener () { public void onclick ( View v) {... } }; E. Ramat (ULCO) Android 7 septembre 2013 123 / 207
Interface utilisateur Interactions Interactions possibles Toutes les interactions ne s'appliquent pas à tous les composants. Le composant ré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 premier paramètre une référence sur l'objet View concerné par l'interaction des paramètres supplémentaires sont disponibles en fonction de l'interaction sauf pour OnClick et OnLongClick E. Ramat (ULCO) Android 7 septembre 2013 124 / 207
Interface utilisateur Interactions 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éciques au système de pointage - doigt, souris, stylet,... ) les coordonnées : getx et gety E. Ramat (ULCO) Android 7 septembre 2013 125 / 207
Interface utilisateur Interactions 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'entrer dans la zone graphique du composant ACTION_DRAG_LOCATION : la zone déplacée par le drag se déplace toujours dans la zone graphique du composant E. Ramat (ULCO) Android 7 septembre 2013 126 / 207
Interface utilisateur Interactions OnDrag ACTION_DRAG_ENDED : le drag&drop se termine ACTION_DRAG_EXITED : la zone déplacée par le drag vient de sortir de la zone graphique du composant ACTION_DROP : le drag&drop se termine dans la zone graphique du composant 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 sur un serveur (et cela prend un peu de temps) Android ore le mécanisme de toast un toast ache un message pendant quelques secondes et disparaît sans intervention de l'utilisateur Toast. maketext ( getapplicationcontext (), " Information saved!", Toast. LENGTH_LONG ). show (); Durée d'achage La durée d'achage est dénie à l'aide du troisième paramètre de la méthode maketext (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érences Introduction Dénitions Android ore 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'une application Accès Trois modes d'accès : préférences spéciques à une activité (getpreferences()) préférences de l'application (getsharedpreferences()) préférences de l'application accompagnées d'outils standards du système Android comme l'activité PreferenceActivity (getdefaultsharedpreferences()) E. Ramat (ULCO) Android 7 septembre 2013 130 / 207
Multiprocessing Activation du ag MODE_MULTI_PROCESS si les préférences peuvent être accédées par plusieurs processus multithreadés. E. Ramat (ULCO) Android 7 septembre 2013 131 / 207 Préférences Introduction 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'identiant lié aux préférences est l'identiant de la classe Activity rattachée getsharedpreferences() admet un identiant ; plusieurs chiers de préférences possibles pour une application
Préférences Utilisation Ecriture les préférences sont modiables via une instance de la classe SharedPreferences.Editor obtenue par la méthode edit aectation ou modication d'une préférence via les méthodes putxxx où XXX est un type primitif (putstring, par exemple) les modications sont eectives qu'après validation par commit (méthode de SharedPreferences) 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érences Utilisation - exemples Modication 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 la préférence n'existe pas E. Ramat (ULCO) Android 7 septembre 2013 133 / 207
Préférences Fenêtre de dénition des préférences PreferenceActivity Android propose une spécication XML et une classe Activity pour la dénition des préférences via l'interface graphique à utiliser an 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 an de lier l'activité à la ressource XML déclarer la nouvelle activité dans le manifest commit Lors d'un changement, la valeur est aectée aux préférences et commitée. Android 3.0 et sup. La dénition de la structure utilise les fragments E. Ramat (ULCO) Android 7 septembre 2013 134 / 207
Préférences Fenêtre de dénition des préférences XML <PreferenceScreen xmlns:android =" http: // schemas. android. com / apk / res / android " > < ListPreference android: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 " / > < EditTextPreference android: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érences Fenê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érences Fenê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ées Introduction 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émoire externe (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ées Système de chiers Système de chiers l'api standard de Java propose des classes pour la gestion des ux via le package java.io Android dispose de deux méthodes supplémentaires pour l'accès aux chiers lié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écier le mode MODE_APPEND (ajout en n). E. Ramat (ULCO) Android 7 septembre 2013 140 / 207
Stockage des données Système de chiers Accès par défaut, les chiers sont accessibles uniquement par l'application qui les a créé (mode MODE_PRIVATE) pour partager un chier, il faut développer des fournisseurs de contenus la bonne pratique néanmoins, on peut spécier un mode permettant l'accès aux autres applications (MODE_WORLD_READABLE ou MODE_WORLD_WRITABLE) E. Ramat (ULCO) Android 7 septembre 2013 141 / 207
Stockage des données Systè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ées Base 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'eectue 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 le repé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 classes représentants les entités manipulées E. Ramat (ULCO) Android 7 septembre 2013 143 / 207
Stockage des données Bases de données Création et mise à jour la manipulation (création et mise à jour) de la base de données est réalisée via une sous-classe de la classe SQLiteOpenHelper deux méthodes et un constructeur sont à développer : le constructeur qui a pour paramètre le nom de la base de données et la version oncreate : méthode de création de la base de données onupgrade : méthode de changement de version il est important de gèrer le numéro de version de la base de données, cela permet de prendre en charge via la méthode onupgrade les changements de version E. Ramat (ULCO) Android 7 septembre 2013 144 / 207
Stockage des données Bases 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ées Bases de données Accès et requête deux méthodes d'accès (en lecture ou en écriture) de la classe SQLiteOpenHelper : getreadabledatabase et getwritabledatabase pour réaliser une requête de type SELECT, deux possibilités : rawquery permet d'exécuter directement une instruction SELECT sous forme d'une chaîne complète de caractères 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 les ré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ées Bases de données Requête via la méthode query Les paramètres de query distinct : spécie 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 des valeurs '?' dans la sélection, elles seront remplacées par la valeur spéciée dans le paramètre selectionargs) groupby : le ltre de regroupement des lignes having : le ltre de condition d'apparition des lignes en relation avec le paramè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ées Bases de données Requête et Cursor la classe Cursor navigue dans les enregistrements sélectionnés quatre méthodes importantes : getcount : retourne le nombre d'enregistrements sélectionnées movetofirst : place le curseur sur le premier movetonext : passe à l'enregistrement suivant 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 dans l'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ées Bases 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 classe ContentValues 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
Graphique Introduction Dénitions toute vue (classe View) propose sa représentation graphique via la méthode ondraw les interactions sont traitées par les méthodes ontouchevent, onkeyup et onkeydown 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 a minima les méthodes de représentation graphique et d'interaction. E. Ramat (ULCO) Android 7 septembre 2013 151 / 207
Graphique Dé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 ); } } @Override protected void ondraw ( Canvas canvas ) { super. ondraw ( canvas ); } @Override public boolean ontouchevent ( MotionEvent event ) { return super. ontouchevent ( event ); } E. Ramat (ULCO) Android 7 septembre 2013 152 / 207
Graphique Utilisation 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. MyView android:id ="@+id / my_view " android:layout_height =" fill_parent " android:layout_width =" fill_parent " / > </ LinearLayout > E. Ramat (ULCO) Android 7 septembre 2013 153 / 207
Graphique Utilisation 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
Graphique Utilisation de sa vue dans un Layout Personnalisation des attributs En surchargeant le constructeur à 2 paramètres (Context et AttributeSet), il est possible de récupérer un attribut personnalisé utilisé dans la dénition de la View dans le chier XML du Layout. Attributs XML personnalisés <org. example. MyView android: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
Graphique Représentation de sa vue Canvas la construction de la représentation graphique d'une vue via la méthode ondraw passe par la classe Canvas la méthode ondraw est invoquée par le système dès lors que la vue doit être mise à jour une invocation à la méthode invalidate sur la vue provoque une demande de 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 le dessin à une zone + opérateur de combinaison de zones) La classe Paint Les primitives de dessin nécessitent des informations de style et de couleur disponible via la classe Paint. E. Ramat (ULCO) Android 7 septembre 2013 156 / 207
Graphique Repré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
Graphique Repré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 DashPathEect permet de dénir des eets 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
Graphique Repré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 ne trace pas tout le cercle alors le remplissage passe par le centre du cercle dans lequel 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
Graphique Repré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
Graphique Représentation de sa vue Achage 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éthode drawtextonpath. E. Ramat (ULCO) Android 7 septembre 2013 161 / 207
Graphique Interaction 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
Graphique Interaction avec sa vue TouchEvent La méthode getaction de la classe MotionEvent permet de connaître le type de Touch 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 threads Introduction 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 à jour de 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 acher application not responding et va tuer votre application Solution Les threads Quand utiliser les threads? les accès Internet (la méthode execute du DefaultHttpClient) est bloquante) 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 threads Introduction Les threads d'android utilisent la classe Thread du Java classique ainsi que les structures de contrôle (le package java.util.concurrent avec la classe Semaphore, par exemple, pour la gestion des accès conccurrentiels) une limitation : on ne peut pas modier l'interface utilisateur dans un thread autre 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ès l'interface graphique E. Ramat (ULCO) Android 7 septembre 2013 166 / 207
Processus et threads Introduction Indiquer la progression En cas de traitement très long, il est important d'indiquer le niveau de progression du traitment utiliser ProgressBar ou ProgressDialog Ces deux classes sont thread safe ce qui signie que l'on peut les modier à partir de n'importe quel thread. E. Ramat (ULCO) Android 7 septembre 2013 167 / 207
Processus et threads Thread et Runnable Dénition un Runnable est une interface représentant une commande exécutable via la mé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 variables locales Exemple minimal new Thread ( new Runnable () { @Override public void run () { } }). start (); E. Ramat (ULCO) Android 7 septembre 2013 168 / 207
Processus et threads Thread et Runnable Questions Comment accéder aux informations contenus dans le Runnable et comment depuis 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 qui donne accès aux données (attributs) de l'activité attention, s'il y a plusieurs threads au sein de la même activité, il faut protéger les accès simultanés rappel : on ne peut pas modier l'interface graphique (même si l'on a accès aux objets de l'interface) E. Ramat (ULCO) Android 7 septembre 2013 169 / 207
Processus et threads Les 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 sendmessage de l'objet handler dénit dans l'activité handler. sendmessage ( hanlder. obtainmessage ()); La méthode obtainmessage permet de construire un message vide au sein du pool de message de l'handler (ce qui est plus ecace) E. Ramat (ULCO) Android 7 septembre 2013 170 / 207
Processus et threads Les handlers Passage de paramètres Il faut : construire un bundle, structure de transport de données, et une message depuis 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 threads Les handlers Réception de messages La réception des messages est réalisée à l'aide de la message handlemessage. Handler handler = new Handler () { @Override public void handlemessage ( Message msg ) { } } E. Ramat (ULCO) Android 7 septembre 2013 172 / 207
Service E. Ramat (ULCO) Android 7 septembre 2013 173 / 207
Service Introduction Dénitions un service est un processus continu qui s'exécute sans être associé à une activité un service est créé : soit par un appel direct à l'api d'android (startservice) - connexion non persistante soit en tentant une connexion par IPC (InterProcess Communication) (bindservice) an d'accèder à une API locale - communication bidirectionnelle un service est rattaché à une application donc un service n'est pas un processus séparé un service n'est pas non plus un thread exécuté dans le thread principal d'une application E. Ramat (ULCO) Android 7 septembre 2013 174 / 207
Service Introduction Pourquoi les services? certaines opérations ne nécessitent pas d'interface graphique (un long té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, un service 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 est invoquée le service est alors actif dans le cas d'un lancement de type bind, la méthode onunbind est appelée lorsqu'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
Service Cycle de vie E. Ramat (ULCO) Android 7 septembre 2013 176 / 207
Service Déclaration des services Déclaration Hormis la déclaration de la classe Java représentant le service, le service doit être dé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
Service Le mode startservice Lancement d'une commande comme pour les activités, l'appel à startservice passe par la construction d'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éthode onstartcommand et cette dernière ne doit pas être trop longue (sinon utilisation des threads) E. Ramat (ULCO) Android 7 septembre 2013 178 / 207
Service Le 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 de refaire startservice) START_REDELIVER_INTENT : le service devrait être redémarré par un appel à startservice avec la même intention s'il est arrêté par le système et non par stopservice START_NOT_STICKY :le service devrait être recréér explicitement par un appel à startservice stop La méthode stopservice (ou stopself lorsque l'on est dans le service) arrête et détruit le service, même s'il y a eu plusieurs appels à startservice. E. Ramat (ULCO) Android 7 septembre 2013 179 / 207
Service Le mode bindservice Dénitions une activité qui se lie (bind) à un service peut alors accèder à l'api publique exposée par le binder du service un binder est une sous-classe de Binder et dénit les méthodes fournies par le service la méthode onbind du service renvoie une instance de la sous-classe de Binder 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'a plus besoin du service E. Ramat (ULCO) Android 7 septembre 2013 180 / 207
Service Le 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 de l'intention pour le lancement du service le service est ensuite lancée via la méthode bindservice et la connexion est géré par l'objet mconnection E. Ramat (ULCO) Android 7 septembre 2013 181 / 207
Service Le 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 type ServiceConnection lors de la connexion au service, la méthode onserviceconnected récupère une référence sur le service via le binder an de pouvoir invoquer les méthodes oertes par le service E. Ramat (ULCO) Android 7 septembre 2013 182 / 207
Service Le 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érier que l'on est bien lié au service E. Ramat (ULCO) Android 7 septembre 2013 183 / 207
Service Le 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 accessible qu'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 le processus de l'application. E. Ramat (ULCO) Android 7 septembre 2013 185 / 207
Service Communication à partir d'un Remote service Communication communiquer entre un client et un Remote service nécessite une architecture particulière TODO E. Ramat (ULCO) Android 7 septembre 2013 186 / 207
Communication E. Ramat (ULCO) Android 7 septembre 2013 187 / 207
Communication Introduction 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 protocole d'échange (HTTP + XML, par exemple) E. Ramat (ULCO) Android 7 septembre 2013 188 / 207
Communication Supports 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 (6 Mbit/s en moyenne) à l'aide d'un adaptateur USB - Ethernet (attention, supporté par peu de terminal!) Adaptateur USB - Ethernet E. Ramat (ULCO) Android 7 septembre 2013 189 / 207
Communication Supports de communication Les moyens - suite en mobile : GSM (2G) (Global System for Mobile Communication) : uniquement la voix GPRS (2.5G) (Global Packet Radio Service) : 171,2kbit/s max (50 kbit/s en moyenne) Edge (2.75G) (Enhanced Data Rates for GSM Evolution) : 384 kbit/s max (64 kbit/s en moyenne) UMTS (3G) (Universal Mobile Telecommunications System) : 2 Mbit/s max (384 kbit/s en moyenne) E. Ramat (ULCO) Android 7 septembre 2013 190 / 207
Communication Supports de communication Les moyens - suite en mobile : 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) 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 montant LTE (3.9G) (Long Term Evolution) : 326,4 Mbit/s max en ux descendant et 86,4 Mbit/s en ux montant 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
Communication Les autorisations et vérications Préalable L'application Android désirant un accès à Internet doit : possèder l'autorisation vérier 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
Communication Les autorisations et vérications Vérications Avant de tenter un accès au réseau, il est indispensablde de vérier que l'accès est possible 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
Communication Les autorisations et vérications 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 le terminal est connecté à Internet : TYPE_BLUETOOTH TYPE_ETHERNET TYPE_MOBILE TYPE_WIFI TYPE_WIMAX E. Ramat (ULCO) Android 7 septembre 2013 194 / 207
Communication API 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 : GET : méthode de lecture ; l'état de la ressource (identiée par une URI - Uniform Resource Identifier) n'est pas modié POST : envoi de données dans l'objectif de créer d'une nouvelle ressource ou modication d'une ressource rattachée à l'uri d'appel PUT : modication ou création d'une ressource DELETE : suppression d'une ressource Seule la méthode POST n'a pas le même résultat si on envoie plusieurs fois la même requête. E. Ramat (ULCO) Android 7 septembre 2013 195 / 207
Communication API de communication Méthodes et version de HTTP il existe d'autres méthodes HTTP (HEAD, TRACE, OPTIONS et CONNECT). seules les méthodes GET, POST et HEAD sont dénies dans la norme HTTP/1.0 Etapes création d'une instance de la classe DefaultHttpClient qui implémente l'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é, valeur des é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
Communication API 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 : soit passés directement dans l'uri (comme dans l'exemple) soit aecté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
Communication API de communication Méthode POST La construction d'une requête de type POST suivit le même modèle que la mé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 HttpGet ou HttpPost. E. Ramat (ULCO) Android 7 septembre 2013 198 / 207
Communication API de communication Les cookies la classe DefaultHttpClient gère nativement les cookies. il est important de disposer du mécanisme des cookies an de gérer l'identiant 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 serveur lié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
Communication Analyse 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 : le format HTML avec le composant WebKit d'android par exemple un format XML le format JSON (JavaScript Object Notation - RFC 4627) : notation textuelle basée sur des ensembles de paires nom / valeur et des listes ordonnées de valeurs.... Données JSON { } " firstname ": " John ", " lastname ": " Smith ", " age ": 25, " address ": { " streetaddress ": " 21 2 nd Street ", " city ": " New York ", " postalcode ": " 10021 " } E. Ramat (ULCO) Android 7 septembre 2013 200 / 207
Communication Analyse de la réponse XML Parsing de réponse XML Deux stratégies de parsing : DOM (Document Object Model) : une représentation mémoire du document est contruite et on navigue dedans SAX (Simple API for XML) : analyse séquentielle du document et activation 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
Notication E. Ramat (ULCO) Android 7 septembre 2013 202 / 207
Notication Dé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 : les notications les notications sont très utilisées par les services éxecutées en arrière-plan le gestion des notications passe par la classe NotificationManager plusieurs types de notication possibles : un message, une led clignotante ou les vibrations NotificationManager Trois méthodes : notify : pour l'envoi d'une notication cancel et cancelall : pour l'annulation d'une notication E. Ramat (ULCO) Android 7 septembre 2013 203 / 207
Explications la création d'une notication passe par la création d'une instance de la classe Notification il faut associer une image (une icône) à la notication (premier paramètre du constructeur de Notification) l'icône doit posséder une résolution propotionnelle à l'écran, il faut dénir 3 versions (12x12, 16x16 et 24x24) le message spécié sera aché dans la barre d'état le troisième paramètre indique simplement la date de création de la notication E. Ramat (ULCO) Android 7 septembre 2013 204 / 207 Notication Exemples 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 );
Notication Exemples Notication et activité le méthode setlastesteventinfo précise quen l'on ache un titre et un message lorsque l'on clique sur la notication 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
Notication Exemples Notication et vibration l'objet de type Notication possède un attribut ags pour spécier le type de notication : 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 permet d'indiquer sur la notication est annulée automatiquement quand l'utilisateur clique dessus Notication 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 ramat@lisic.univ-littoral.fr Romain Daquin daquin.romain@gmail.com Licence Copyright (C) 2011-2013 - LISIC - ULCO Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". E. Ramat (ULCO) Android 7 septembre 2013 207 / 207