SlideShare une entreprise Scribd logo
Développement pour Android
version support : 1.9
antislashn.org Android - Objectifs 0 - 2/7
Objectifs
● Présenter la plateforme Android
● Utiliser l'environnement de développement Android
avec Eclipse
● Présenter les composants d'une application
Android
● Créer une application Android
● Présenter certaines fonctionnalités avancées de la
plateforme Android
antislashn.org Android - Objectifs 0 - 3/7
Chapitres
1.Présentation de la plateforme
2.Les outils de développement
3."Hello, world" expliqué
4.Architecture et développement d'une application
5.Composants graphiques de base
6.Les intentions
7.Les activités
8.ListView
9.Autres composants graphiques
10.Les menus
antislashn.org Android - Objectifs 0 - 4/7
Chapitres
11.Les notifications
12.Persistance de données
13.Les services
14.Les fournisseurs de contenu
15.Le BroadcastReceiver
16.Les processus et threads
17.Les applications widgets
18.Les fragments
19.Graphisme
20.Gestion de équipements
21.Géolocalisation et Google Map
antislashn.org Android - Objectifs 0 - 5/7
Annexes
A.Publier avec Google Play
B.Développer en code natif : le NDK
C.Input Method Editor
D.Persistance avec OrmLite
antislashn.org Android - Objectifs 0 - 6/7
copyleft
Support de formation créé par
Franck SIMON
http://www.franck-simon.com
antislashn.org Android - Objectifs 0 - 7/7
copyleft
Cette œuvre est mise à disposition sous licence
Attribution
Pas d'Utilisation Commerciale
Partage dans les Mêmes Conditions 3.0 France.
Pour voir une copie de cette licence, visitez
http://creativecommons.org/licenses/by-nc-sa/3.0/fr/
ou écrivez à
Creative Commons, 444 Castro Street, Suite 900,
Mountain View, California, 94041, USA.
antislashn.org Android - Présentation de la plateforme 1 - 1/15
Présentation de la plateforme
Android
antislashn.org Android - Présentation de la plateforme 1 - 2/15
Matériels sous Android
antislashn.org Android - Présentation de la plateforme 1 - 3/15
Généralités
● Android est issu du travail d'une startup
● racheté par Google en 2005
● Création le 7 Novembre 2007 de l'OHA
● Open Handset Alliance
● consortium créé par Google réunissant des acteurs du
marché de la mobilité
– constructeurs, opérateurs en téléphonie, éditeurs de logiciels
● annonce officielle de la plateforme Android le même
jour
● sortie du premier SDK le 12 Novembre 2007
antislashn.org Android - Présentation de la plateforme 1 - 4/15
Généralités
● Le source du SDK est mis à disposition sous licence Apache
2.0
● le 21 Octobre 2008
● lien : http://source.android.com/
● Android Market est lancé en Novembre 2008
● lien : https://market.android.com
● Octobre 2008 : sortie du premier samrtphone Android aux
Etats-Unis
● Mars 2009 en France
● 2009 : premières tablettes Android
● vrai succès à partir de début 2011, avec la version Android 3.0
antislashn.org Android - Présentation de la plateforme 1 - 5/15
Présentation de la plateforme
● Principales caractéristique
● environnement de développement complet
– émulateur de téléphone, outils de débogage, mesure des performances, …
● framework applicatif
● machine virtuelle Dalvik
– optimisée pour les appareils nomades
● navigateur intégré
– WebKit
● graphisme 2D et 3D
● base de données SQLite
● CODEC audio et vidéo (MPEG4, MP3, AAC, PNG, …)
●
options matérielles : téléphonie GSM, caméra, GPS, accéléromètre,
boussole, EDGE, Wifi, Bluetooth, …
antislashn.org Android - Présentation de la plateforme 1 - 6/15
Présentation de la plateforme
antislashn.org Android - Présentation de la plateforme 1 - 7/15
Application Android
● Langage de développement : Java
● attention, toutes les classes du JDK ne sont pas disponibles
– Swing par exemple
● possibilité d'utiliser du C pour certaines parties critiques
– utilisation du NDK (Native Development Kit)
● Les outils du SDK compilent le code Java et les ressources
associées
● création d'un fichier .apk qui contient toute l'application et ses
ressources
– c'est ce fichier qui sera installé sur la plateforme Android
● Toutes les applications Android ont les même droits
● même pied d'égalité que les applications natives
antislashn.org Android - Présentation de la plateforme 1 - 8/15
Application Android
● Une fois installée, une application Android est exécutée au sein d'un
sandbox
● Le système d'exploitation Android est basé sur Linux
● une application Android est un utilisateur du système d'exploitation
● chaque application reçoit par défaut un identifiant unique
– user ID, seulement connu par Linux, pas par l'application
– l'OS positionne les permissions sur les fichiers de l'application afin que seule celle-
ci puisse les utiliser
● une application est exécutée dans sa propre VM (Virtual Machine)
● par défaut une application est exécutée dans un process Linux
– le process est démarré par Android si un composant de l'application doit être
exécuté
– le process est tué lorsque l'application se termine ou si d'autres applications ont
besoin de mémoire
antislashn.org Android - Présentation de la plateforme 1 - 9/15
Application Android
● Il existe 4 types de composant applicatif
● dont les objectifs et cycles de vie sont différents
● activité (activity) : interface graphique pour l'utilisateur
– classe Activity
● service (service) : composant exécuté en tâche de fond, sans interface
graphique
– exemple : écoute de musique
– classe Service
● fournisseur de données (content provider) : gère et partage des données
applicatives
– exemple : les contacts
– classe ContentProvider
● récepteur broadcast (broadcast receiver) : réagit à des messages, systèmes
ou applicatifs
– mise hors tension, baterie faible, …
– classe BrodcastReceiver
antislashn.org Android - Présentation de la plateforme 1 - 10/15
Application Android
● Une application Android n'a accès qu'à ses propres ressources
● politique "principe of least privilege"
● environnement sécurisé qui interdit à l'application d'utiliser le
système sans en avoir la permission
● Il est possible de donner le même user ID à plusieurs
applications
● les applications sont exécutées dans le même process Linux
● les application partage la même VM
● permet de partager des ressources
● Une application doit posséder les permissions adéquats pour
accéder aux composants du système
● liste des contacts, APN (Appareil Photo Numérique), SMS, ...
antislashn.org Android - Présentation de la plateforme 1 - 11/15
Versions Android et SDK
● Le système Android évolue très vite
● ce qui est une marque de dynamisme
● ce qui provoque une fragmentation importante des plateformes
● nécessite un développement basé sur une version minimale
répandue
● Pour les développeurs, Google met à disposition un SDK
(Software Development Kit)
● lien : http://developer.android.com/sdk/index.html
● En plus du SDK il existe des bibliothèques tiers
● leur support n'est pas obligatoire par les intégrateurs
● exemples : API Google, Samsung, LG, ...
antislashn.org Android - Présentation de la plateforme 1 - 12/15
Versions Android et SDK
● La version 1.0 est sortie en septembre 2008
● c'est la version 1.1 qui fut commercialisée en France
– sortie en Février 2009
● Passage direct à la version 1.5
● prise en charge de la détection de rotation, de
l'accéléromètre, enregistrement vidéo, App Widgets
● La version 1.6 apporte le support de plusieurs résolutions
● Les versions 2 se sont succédées rapidement
● HTML5, Wifi, stockage externe, NFC, VoIP, SIP, …
● Étape importante : la version 3, conçue spécifiquement
pour les tablettes
antislashn.org Android - Présentation de la plateforme 1 - 13/15
Versions Android et SDK
● Il coexistait deux branches de versions
● version 3 pour les tablettes
– version 3.2 actuellement
● version 2 pour les smart phones
– version 2.3.4 actuellement
● Depuis la version 4
● fusion entre téléphones, tablettes et télévisions
antislashn.org Android - Présentation de la plateforme 1 - 14/15
Historique des versions
Plateforme Nom API Level Date
Android 1.1 2
Android 1.5 Cupcake 3 Avril 2009
Android 1.6 Donet 4 Septembre 2009
Android 2.1 Eclair 7 Janvier 2010
Android 2.2 Froyo 8 Mai 2010
Android 2.3 Gingerbread 9 Décembre 2010
Android 3.0 Honeycomb 11 Janvier 2011
Android 4.0 Ice Cream Sandwich 14 Octobre 2011
Android 4.1 Jelly Bean 16 Juillet 2012
Android 4.4 KitKat 19 Octobre 2013
Android 5.0 L ????? 20 courant 2014
antislashn.org Android - Présentation de la plateforme 1 - 15/15
Quelle cible choisir ?
● Google publie la répartition d'utilisation des versions
● informations collectées via Google Play
– lien : http://developer.android.com/about/dashboards/index.html
● ici en date du 21/03/2014
antislashn.org Android - Outils de développement 2 - 1/48
Outils de développement
antislashn.org Android - Outils de développement 2 - 2/48
Outils du développeur
● Présentation des outils
● Eclipse avec ADT
– ADT : Android Development Tools
● le SDK
● le SDK et AVD Manager
– AVD : Android Virtual Device
● le ADB : Android Debug Bridge
● le DDMS : Dalvik Debug Monitor Server
● Android Studio : autre outil mis à disposition par
Google, basé sur IntelliJ IDEA
● http://developer.android.com/sdk/index.html
antislashn.org Android - Outils de développement 2 - 3/48
Installation du plugin ADT
● Prérequis
● JDK 1.6 installé
● Eclipse installé
– la version pour le développement Java de base suffit
● Installer le SDK
● télécharger l'archive de démarrage
– contient les outils de base, pas les APIS
– http://developer.android.com/sdk/index.html
● décompresser l'archive dans un répertoire
– nous y ferons référence sous l'appellation SDK_HOME
antislashn.org Android - Outils de développement 2 - 4/48
Installation du plugin ADT
● Démarrer Eclipse
● Sélectionner l'installation de nouveaux plugins
● Help → Install New Software
antislashn.org Android - Outils de développement 2 - 5/48
Installation du plugin ADT
● Cliquer sur le bouton Add de l'assistant
d'installation
● Ajouter le repository
● remplir les deux champs
– Name : ADT Plugin
– Location : https://dl-ssl.google.com/android/eclipse/
– puis OK
antislashn.org Android - Outils de développement 2 - 6/48
Installation du plugin ADT
● Une fois que les outils sont affichés
● sélectionner Select All
– attention : il faut que CDT soit installé pour que le NDK puisse
être installé
● cf annexe A
● puis Next
antislashn.org Android - Outils de développement 2 - 7/48
Installation du plugin ADT
● Cliquer sur Next dans la fenêtre suivante
● Accepter les licences
● puis cliquer sur Finish
antislashn.org Android - Outils de développement 2 - 8/48
Installation du plugin ADT
● Accepter l'alerte de sécurité
● Puis redémarrer Eclipse
antislashn.org Android - Outils de développement 2 - 9/48
Installation du plugin ADT
● Au redémarrage la version du plugin est vérifié
● accepter l'éventuelle mise à niveau
● ou sélectionner le répertoire d'installation du plugin
● puis Finish
antislashn.org Android - Outils de développement 2 - 10/48
Installation du plugin ADT
● Les plate-formes cibles ne sont pas installées
● une fenêtre peut le signaler
● Installation des API
● dans la barre d'outils sélectionner le "SDK Manager"
● Dans la fenêtre suivante, sélectionner les niveaux
d'API souhaités
antislashn.org Android - Outils de développement 2 - 11/48
Installation du plugin ADT
● Cliquer sur le bouton Install xx packages
● Accepter toutes les licences puis cliquer sur Install
antislashn.org Android - Outils de développement 2 - 12/48
Installation du plugin ADT
● le téléchargement des plate-formes démarre
● cette étape peut être assez longue
antislashn.org Android - Outils de développement 2 - 13/48
Le SDK
● Une fois l'installation terminée le
répertoire d'installation du SDK
comporte l'ensemble des outils,
documentations, exemples,
plateformes cibles
● L'installation étant relativement lente,
ce répertoire peut être copier sur les
autres machines
antislashn.org Android - Outils de développement 2 - 14/48
Émulateur AVD
● AVD : Android Virtual Device
● émulateur de matériel
● complètement configurable
● Avant d'utiliser un émulateur il faut le créer
antislashn.org Android - Outils de développement 2 - 15/48
Émulateur AVD
● L'émulateur Android peut être lancé
● via Eclipse
● via la ligne de commande
antislashn.org Android - Outils de développement 2 - 16/48
Émulateur AVD
● L'émulateur se comporte (presque) comme un
téléphone
● possibilité de changer les réglages de base
– langue, format date et heure, …
● d'ajouter des contacts
● de supprimer des applications
● de recevoir des SMS et des appels téléphoniques
– depuis l'onglet "Emulator Control"
– depuis un autre émulateur
● en précisant le numéro d'écoute de l'émulateur au lieu d'un numéro de
téléphone
antislashn.org Android - Outils de développement 2 - 17/48
Émulateur AVD
● Ligne de commande
● dans le répertoire tools
● emulator -avd <avd_name> [-<option> [<value>]] …
– exemple : emulator -avd Samsung_S
● documentation des options de la ligne de commande
– http://developer.android.com/tools/help/emulator.html
● Utilisation de l'émulateur derrière un proxy
● en ligne de commande ajouter l'option
– -http-proxy <proxy>
● le proxy peut-être réglé dans l'émulateur lui-même
antislashn.org Android - Outils de développement 2 - 18/48
Émulateur AVD
● Réglage du proxy dans l'émulateur
● Applications … Paramètres … Sans fils et réseaux
– Réseaux mobiles ... Nom des points d'accès … TelKila
antislashn.org Android - Outils de développement 2 - 19/48
Émulateur AVD
● L'émulateur peut être contrôlé
● par le clavier du PC pour certaines opérations
– Ctrl-F11 et Ctrl-F12 pour le mode portrait / paysage par
exemple
– l'ensemble des raccourcis est disponible à
● http://developer.android.com/tools/help/emulator.html
● par la vue "Emulator Control" dans Eclipse
antislashn.org Android - Outils de développement 2 - 20/48
Outil adb
● adb : Android Debug Bridge
● Permet de se connecter sur l'émulateur
● ou sur un téléphone réel connecté en mode debug
● Programme articulé autour de 3 composants
● un client exécuté sur la machine de développement
– lancé par la console ou le plugin ADT
● un serveur qui s'exécute en arrière plan sur la machine
de développement
● un démon exécuté sur chaque émulateur
antislashn.org Android - Outils de développement 2 - 21/48
Outil adb
● Le serveur maintient un client adb liée à un démon
adb
● émulateur 1 en 5554, client adb 1 en 5555
● émulateur 2 en 5556, client adb 1 en 5557
● adb permet
● de connaître la liste des émulateur
● d'installer des applications
● adb emulator-5556 install hello.apk
● de copier des fichiers vers/depuis l'émulateur
● d'exécuter des commandes shell sur l'émulateur
– se connecter à la base de données SQL par exemple
antislashn.org Android - Outils de développement 2 - 22/48
Outil adb
● Quelques commandes adb
● adb start-server
– démarre le serveur adb s'il ne l'est pas
– eclipse peut être configuré pour utiliser un serveur externe
● adb kill-server
– arrête le serveur
● adb devices
– liste les matériels et émulateurs attachés
antislashn.org Android - Outils de développement 2 - 23/48
Outil adb
● Quelques commandes adb
● adb [-d | -e | -s <serialNumber>] command
– envoie d'une commande adb
● -d : vers le seul matériel connecté
● -e : vers le seul émulateur connecté
● -s <serialNumber> : vers un matériel ou émulateur connecté
● command : une commande adb
● si un seul matériel ou émulateur est connecté -d, -e ou -s peut être
omis
● adb -e shell
– passage en mode shell
● ici sur le seul émulateur connecté
antislashn.org Android - Outils de développement 2 - 24/48
DDMS
● Dalvik Debug Monitor Server
● outil de debug
● Intégré à Eclipse
● perspective DDMS
● Ligne de commande
● tools/ddms
antislashn.org Android - Outils de développement 2 - 25/48
DDMS
● DDMS permet
● de suivre l'utilisation du tas
● de suivre les allocations d'objets et mémoire
● de travailler sur le système de fichier de l'émulateur
● de voir les threads executés sur l'émulateur
● d'effectuer du profiling de méthode
– nombre d'appels, temps d'exécution, …
● Debug.startMethodTracing() et Debug.stopMethodTracing()
– à partir d'Android 2.1
● 2.1 : doit avoir une carte SD et la permission d'écriture sur la carte SD
● à partir de 2.2 : plus de SD nécessaire, les traces de logs sont
envoyés vers l'environnement de développement
antislashn.org Android - Outils de développement 2 - 26/48
DDMS
● Vue File Explorer
mouvements de fichiers entre
l'équipement et le PC
suppression et ajout dans
le système de fichier de l'équipement
antislashn.org Android - Outils de développement 2 - 27/48
DDMS
● Vue des threads actifs
● il faut d'abord lancer la capture
thread de l'application
thread du garbage collector
thread dédié à la réception des signaux Linux
threads systèmes
● ID : identifiant du thread dans la VM
● Tid : identifiant du thread Linux
● Status
● running, sleeping, monitor, wait, native, vmwaait, zombie, init, starting
● * si deamon
● utime : durée cumulée de l'exécution du code utilisateur (en "jiffies", 10ms)
● stime : durée cumulée de l'exécution du code système (en "jiffies", 10ms)
● Name : nom du thread
antislashn.org Android - Outils de développement 2 - 28/48
DDMS
● Vue Emulator Control
● envoi de SMS
● émulation d'appel
téléphonique
● envoi de points de
géolocalisation
antislashn.org Android - Outils de développement 2 - 29/48
DDMS
● DDMS permet aussi d'interagir avec l'émulateur
● envoi de SMS
● émulation d'appel téléphonique vers un émulateur
● mise à jour de la géolocalisation du téléphone
– manuellement ou par fichier
● GPX : GPS eXchange file
● KML : Keyhole Markup Language
antislashn.org Android - Outils de développement 2 - 30/48
Débogage
● Le débogage sous Eclipse est effectué de manière
classique
● par utilisation de traces dans les sources
– classe Log
● par mise en place de points d'arrêts
– lancer alors l'application
en mode debug
antislashn.org Android - Outils de développement 2 - 31/48
Gestion des logs
● L’outil logcat permet de visualiser les logs du
système de logs Android
● logcat est utilisable via adb ou DDMS
● Par défaut les logs sont dirigés vers /dev/log/main
● deux autres journaux de logs existent
– /dev/log/radio pour les activité réseau et téléphone
– /dev/log/events pour les événements système
● Les sorties vers les flux out et err sont redirigés
vers /dev/null
● utilisation de System.out ou System.err
antislashn.org Android - Outils de développement 2 - 32/48
Gestion des logs
source : elinux.org/Android_Logging_System
antislashn.org Android - Outils de développement 2 - 33/48
Gestion des logs
● Classe Log
● ne comporte que des méthodes statiques
● signatures des méthodes raccourci
● d(...) pour DEBUG, e(...) pour ERROR
– static int method(String tag, String msg)
– static int method(String tag, String msg,
Throwable tr)
● tag : identificateur du message
● msg : message
● tr : exception
● méthode générique
– static int println(int priority, String tag,
String msg)
● priority : DEBUG, ERROR, etc.
antislashn.org Android - Outils de développement 2 - 34/48
Gestion des logs
● Niveaux de log
● VERBOSE – méthode Log.v(...)
● DEBUG – méthode Log.d(...)
● INFO – méthode Log.i(...)
● WARN – méthode Log.w(...)
● ERROR – méthode Log.e(...)
● ASSERT
● méthode Log.wtf(...)
– "What a Terrible Failure" : erreur ne devant jamais arriver
antislashn.org Android - Outils de développement 2 - 35/48
Gestion des logs
● Tag d'identification
● souvent le nom de la classe
● bonne pratique : déclarer une constante dans la classe
private static final String tag = SensorListActivity.class.getCanonicalName();
antislashn.org Android - Outils de développement 2 - 36/48
Documentation de référence
● Disponible en ou hors connexion
● sur internet :http://developer.android.com/reference/packages.html
● dans le répertoire doc du SDK
antislashn.org Android - Outils de développement 2 - 37/48
Documentation de référence
● Possibilité de tri par classe
● Champ de recherche
antislashn.org Android - Outils de développement 2 - 38/48
Documentation de référence
● Niveau d'API à partir de laquelle la classe peut-être
utilisée
antislashn.org Android - Outils de développement 2 - 39/48
Développer sur un équipement réel
● La plupart des équipement tournant sous Android
peuvent être utilisés pour tester et déboguer une
application
● certains fabricants bride le support sur leur matériel
– Archos, autres ???
– voir sur le site du fabricant pour la procédure à suivre
● http://www.archos.com/support/support_tech/updates_adb.html?country=fr&lang=fr
● Configuration du développement sur le matériel
● l'application doit être déclarée comme "débogable"
– dans l'élément <application>, ajouter l'attribut
android:debuggable="true"
● le téléphone doit être configuré en mode USB
Debugging
antislashn.org Android - Outils de développement 2 - 40/48
Développer sur un équipement réel
● L'activation du mode développeur dépend du
niveau d'API
● < Android 4
– l'activation du mode développeur se trouve dans la gestion
des applications
● < Android 4.2
– entrée "Options pour les développeurs" dans les paramètres
● > Android 4.2
– le menu "Options pour les développeurs" doit être activée
● taper 7 fois sur l'item "Numéro de build" du menu "A propos du
téléphone"
● le mode développeur est alors activé, et l'entrée "Options pour les
développeurs" est affichée
antislashn.org Android - Outils de développement 2 - 41/48
Développer sur un équipement réel
● Passage en mode USB debugging sur Android 1.x
et 2.x
● Settings → Applications → Development
antislashn.org Android - Outils de développement 2 - 42/48
Développer sur un équipement réel
● Passage en mode USB debugging sur Android 1.x
et 2.x
● puis activer le débogage USB
antislashn.org Android - Outils de développement 2 - 43/48
Développer sur un équipement réel
● Passage en mode USB debugging sur Android 3.0
● Settings → Applications → Development
antislashn.org Android - Outils de développement 2 - 44/48
Développer sur un équipement réel
● Passage en mode USB debugging sur Android 3.x
● puis activer le debogage USB
antislashn.org Android - Outils de développement 2 - 45/48
Développer sur un équipement réel
● Passage en mode USB debugging sur Android 4.x
● Settings → Developer options
● attention depuis Android 4.2 l'entrée est cachée
– l'activation est effectuée en tapant 7 fois sur le numéro de
build du téléphone
antislashn.org Android - Outils de développement 2 - 46/48
Développer sur un équipement réel
● Passage en mode USB debugging sur Android 4.x
● puis activer le débogage USB
● De très nombreux outils
sont disponibles pour
aider le développeur
antislashn.org Android - Outils de développement 2 - 47/48
Développer sur un équipement réel
● Paramétrer le poste de développement
● Windows
– installer le driver USB du matériel
– ce driver est fourni par le constructeur
– cf : http://developer.android.com/tools/extras/oem-usb.html
● Mac, CentOS
– rien à faire
● Ubuntu
– ajouter une règle au fichier /etc/udev/rules.d/51-android.rules
● SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"
● où {idevendor} correspond à un identifiant
– http://developer.android.com/tools/device.html
● exécuter
– chmod a+r /etc/udev/rules.d/51-android.rules
antislashn.org Android - Outils de développement 2 - 48/48
Développer sur un équipement réel
● Déboguer via le Wifi
● les appareils ne possédant qu'un seul port USB il est
parfois nécessaire de déboguer via le réseau WIFI
● étapes à suivre
– activer le WIFI
● récupérer l'adresse TCP IP du matériel dans les propriétés WIFI
– connecter le matériel en USB
– vérifier que le débogage fonctionne bien mode USB
– lancer la commande : adb tcpip 5555
– puis lancer : adb connect <ip_matériel>:5555
– pour revenir au mode usb : adb usb
antislashn.org Android - Hello, world 3 - 1/20
Application
Hello, world
antislashn.org Android - Hello, world 3 - 2/20
"Hello, world"
● création du projet
● liaison avec l'architecture de l'application
● Activity
● fichier de AndroidManifest.xml
● utilisation d'un émulateur
antislashn.org Android - Hello, world 3 - 3/20
"Hello, world"
● Création du projet
● File...New...Project
● la fenêtre de choix de projet s'affiche
– choisir un nouveau projet Android
antislashn.org Android - Hello, world 3 - 4/20
"Hello, world"
● L'assistant de création de projet s'affiche
● donner un nom au projet, puis Next
antislashn.org Android - Hello, world 3 - 5/20
"Hello, world"
● Dans l'écran suivant choisir le SDK cible
● ici le SDK version 1.6, puis Next
antislashn.org Android - Hello, world 3 - 6/20
"Hello, world"
● Donner un nom à l'application, et choisir un
package
antislashn.org Android - Hello, world 3 - 7/20
"Hello, world"
sources de notre application
activité (écran) de l'application
répertoire où sont déposés les
ressources générées
fichier R.java généré par les outils Android
bibliothèques du SDK cible
répertoire des ressources
fichier de configuration de l'application
répertoire des données brutes : MP3, ...
propriétés du projet
antislashn.org Android - Hello, world 3 - 8/20
"Hello, world"
● Certains fichiers sont maintenus par le plugin ADT
● il ne faut pas les éditer, ils sont mis à jour automatiquement
– R.java
– default.properties
● Les ressources contenues dans le répertoire res peuvent
être modifiées lors la compilation
● pour optimisation
● se retrouvent dans les ressources R.java
● Les ressources du répertoire assets ne sont pas
impactées par la compilation
● possibilité de les lire en tant que flux d'octets
antislashn.org Android - Hello, world 3 - 9/20
"Hello, world"
● Pour exécuter l'application sélectionner le projet
● puis avec un click droit, sélectionner
– Run As … Android Application
● Si un émulateur est configuré il est
automatiquement chargé
● l'application est lancée
● si aucun émulateur n'est configuré l'écran de gestion
des émulateurs est affichée
● si plusieurs émulateurs sont configurés, en choisir un
● Une fois l'émulateur chargé il est préférable de ne
pas le fermer
antislashn.org Android - Hello, world 3 - 10/20
Ressources de l'application
● Les ressources sont des données utilisables par l'application
● elles sont intégrées au binaire de l'application
● res/anim : animations de transition au format XML
● res/color : couleurs définis dans des fichiers XML
● res/drawable : images, plusieurs densités d'écran sont disponibles
(hdpi, mdpi et ldpi)
● des ressources images peuvent être spécifiées pour une configuration
matérielle et/ou logicielle précise, le nom du dossier de ressource est
alors complété par des qualificatifs séparés par des traits d'union
– largeur d'écran, orientation de l'écran, langue système, ...
● res/layout : interfaces graphiques
● res/values : valeurs utilisées par l'application
● les valeurs sont définies dans un fichier XML
antislashn.org Android - Hello, world 3 - 11/20
Ressources de l'application
● Chaque ressource du dossier res possède un identifiant entier
unique
● permet d'atteindre depuis le code Java, ou XML, une ressource
– cette valeur peut changer au grès des ajouts et suppression de
ressources
● pour éviter le codage en dur de ces valeur, des constantes sont
créées dans une classe R.java
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
antislashn.org Android - Hello, world 3 - 12/20
Ressources de l'application
● Le nom complet de la constante est composé :
● du nom du package
– facultatif car il s'agit du package courant
● du type de ressource
– correspond au sous dossier res
● du nom de la ressource
– pour les ressources situées dans res/values, le nom est celui défini dans
le fichier xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, HelloActivity!</string>
<string name="app_name">Hello</string>
</resources>
antislashn.org Android - Hello, world 3 - 13/20
Ressources de l'application
● syntaxe Java pour accéder à une ressource :
[package.]R.type.nom
R.string.app_name
● syntaxe XML pour accéder à une ressource :
@[package:]type/nom
@string/app_name
antislashn.org Android - Hello, world 3 - 14/20
Structure de l'application "Hello, world"
● Le fichier AndroidManifest.xml
● contient la configuration principale de l'application
– composants applicatifs, point d'entrée principal, sécurité et droits,
etc.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.antislashn.android.hello"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".HelloActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
antislashn.org Android - Hello, world 3 - 15/20
"Hello, world" - AndroidManifest.xml
● Les balises et attributs de ce fichier XML sont très
nombreux
● beaucoup sont facultatifs
● Certains seront détaillées au cours de cette
formation
● au fur et à mesure de leur utilisation
● Balise racine : manifest
● attributs
– package : package de l'application
– versionCode : version de l'application (numérique)
– versionName : version de l'application (string)
antislashn.org Android - Hello, world 3 - 16/20
"Hello, world" - AndroidManifest.xml
● Balise uses-sdk
● indique les versions de SDK pour que l'application
puisse être exécutée
● attributs
– minSdkVersion : niveau minimum pour que l'application
puisse être utilisée
– targetSdkVersion : niveau de l'API utilisé lors du
développement – utilisé par Android pour ajouter si nécessaire
des mécanismes de compatibilité : thèmes graphiques,
densité écran, ...
antislashn.org Android - Hello, world 3 - 17/20
"Hello, world" - AndroidManifest.xml
● Balise application
● informations sur l'application
● attributs
– icon : icône de l'application
● valeur : @drawable/ic_launcher qui référencie la ressource
ic_launcher.png située dans un des répertoire res/drawable, en
fonction de la densité d'écran
– label : titre de l'application – il est préférable d'utiliser des
références à des ressources plutôt qu'une chaine de
caractères
● valeur : @strinf/app_name qui référencie la ressource de type
string contenue dans le fichier res/values/string.xml
● application contient des balises enfants
antislashn.org Android - Hello, world 3 - 18/20
"Hello, world" - AndroidManifest.xml
● Balises filles
● elles seront vues en détails lors des prochains chapitres
● activity
– défini une activité (écran)
– l'activité est lancée par une intention (intent)
● service
– défini un service
● provider
– défini un fournisseur de données
● reicever
– défini un récepteur de messages
● uses-library
– librairies utilisées
antislashn.org Android - Hello, world 3 - 19/20
"Hello, world" - activity
● Le nom (attribut name) de l'activité (balise
activity) référencie la classe HelloActivity
● préfixée par le point, car appartenant au package
courant
– la méthode onCreate(...) est le point d'entrée de
l'application
● invoque la méthode onCreate() de la classe mère
● charge l'écran de l'activité
public class HelloActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
antislashn.org Android - Hello, world 3 - 20/20
"Hello, world" - IHM
● L'écran de l'application est décrite dans un fichier
XML
● ici le fichier res/layout/main.xml
<?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:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
gestionnaire de positionnement
composant de type texte
ressource définie dans res/values/string.xml
antislashn.org Android - architecture et développement 4 - 1/17
Application Android
architecture et développement
antislashn.org Android - architecture et développement 4 - 2/17
Cycle de développement
● création du projet
● codage
● compilation
● effectuée en deux étape
– java vers .class avec l'outil javac
– .class vers .dex avec l'outil dx
● création de l'archive apk
● clé pour le développement
antislashn.org Android - architecture et développement 4 - 3/17
Architecture d'une application
● Une application Android est constituée d'un ou
plusieurs modules applicatifs :
● Activity : code de gestion d'une IHM
● Service : traitement exécuté en tâche de fond
● ContentProvider : exposition de données à d'autres
applications
● BroadcastReceiver : récepteur de messages
● Les modules applicatifs communiquent entre eux
par des messages
● de type Intent
antislashn.org Android - architecture et développement 4 - 4/17
Architecture d'une application
● Le contexte applicatif est accessible par la classe
Context
● les types Activity et Services dérivent de Context
● permet de lancer des intentions vers un autre
composant
– qui appartient à l'application ou non
● permet de récupérer les ressources de l'application
– répertoire, base de données, ...
antislashn.org Android - architecture et développement 4 - 5/17
Architecture d'une application
● La configuration de l'application est décrite dans le
fichier AndroidManifest.xml
● nom de l'application
● icônes
● compatibilité : SDK, écrans, présence d'un clavier, ...
● déclaration des modules applicatifs
● déclarations des filtres de messages
● déclaration des permissions : utilisation GPS, internet,
etc.
● classe d'instrumentation de l'application
antislashn.org Android - architecture et développement 4 - 6/17
Architecture d'une application
● Fichier AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.antislashn.android.hello"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".HelloActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
antislashn.org Android - architecture et développement 4 - 7/17
Les ressources
● Les ressources nécessaires à l'application
sont intégrées dans le répertoire res du
projet
● ses ressources seront compilées avec
l'application
● un identifiant unique est associé à chacune
des ressources
– voir la classe générée R.java
– un fichier ic_launcher.png placé dans un répertoire
(ou sous-répertoire) de res/drawable sera utilisable
par :
● R.drawable.ic_launcher en java
● @drawable/ic_launcher en XML
antislashn.org Android - architecture et développement 4 - 8/17
Les données brutes
● Les données brutes (audio, vidéo, …) sont placées
dans le répertoire assets
● la taille maximale autorisée est de 1 Mo
– pour les fichiers compressé par APK (csv, txt,...)
– pas pour les fichiers binaires (mp3, png, ...)
● elles sont accessible via un AssetManager
– une instance d'AssetManager peut être récupérée par le
Context
● méthode getAssets()
– la méthode open(String fileName) renvoie un
InputStream sur la ressource désirée
antislashn.org Android - architecture et développement 4 - 9/17
Le bus de message
● Les différents modules applicatifs ne sont pas
directement instanciés par le développeur
● Un bus de messages permet au système de choisir
le composant à monter en mémoire
● les messages sont de type Intent
● les intentions décrivent quelle est l'opération qui devra
être effectuée
– plusieurs composants applicatifs peuvent répondre à un
même Intent
● l'utilisateur aura alors le choix
antislashn.org Android - architecture et développement 4 - 10/17
Le bus de messages
● Un message est principalement constitué
● d'une action
– affichage, composition d'un numéro de téléphone, démarrage
d'un module, ...
● d'une catégorie
– informations supplémentaires pour l'action à mener
● préférences utilisateur, affichage dans les applications, …
● d'autres données : type MIME, composant à invoquer,
données supplémentaires, URI
antislashn.org Android - architecture et développement 4 - 11/17
Le bus de message
● Un composant décrit une configuration de
messages auxquels il est susceptible de répondre
● dans le fichier AndroidManifest.xml
● balise <intent-filter>
– exemple : point d'entrée d'un application
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
antislashn.org Android - architecture et développement 4 - 12/17
Le bus de message
Producteur
Système Android
Module applicatif
Intent
IntentResolver
Application 2
Activité
Activité
IntentFilter
IntentFilter
Application 1
Activité
Service
IntentFilter
IntentFilter
Le composant dont le filtre
d'intention correspond est
activé
antislashn.org Android - architecture et développement 4 - 13/17
Bonnes pratiques
● Le développement sous Android est différent d'un
développement Java classique
● Il existe des bonnes pratiques liées à la plateforme
Android
● codage
● ergonomie
● compatibilité entres matériels
● design
antislashn.org Android - architecture et développement 4 - 14/17
Bonnes pratiques de codage
● Ne pas perdre de vue que l'application est
exécutée sur une plateforme dont les ressources
sont limitées
● Minimiser la création d'objets
● Ne pas utiliser les getteurs / setteurs au sein de la
classe
● préférer la lecture ou l'affectation directe des propriétés
● Déclarer static les méthodes qui peuvent l'être
● Préférer les constantes plutôt que les énumération
● enum est une classe
antislashn.org Android - architecture et développement 4 - 15/17
Bonnes pratiques d'ergonomie
● Souvent sans clavier et dispositif de pointage
● le doigt est utilisé sur l'écran
● Ne pas dessiner des widgets trop petits
● taille recommandée aux alentour de 9mm, soit 48dp
– dp : density-independant pixels
– http://developer.android.com/design/style/metrics-grids.html
antislashn.org Android - architecture et développement 4 - 16/17
Bonnes pratiques d'ergonomie
● Utiliser le retour haptique et le changement de
couleur des boutons
● attribut android:hapticFeedbackEnable
●
antislashn.org Android - architecture et développement 4 - 17/17
Bonnes pratiques de design
● Les icônes de lancement d'applications font une
taille de 48x48 dp
● les icônes de Play Store font 512 x 512 px
● Utiliser les icônes prédéfinies pour la barre d'action
● téléchargement :
https://dl-ssl.google.com/android/design/Android_Design_Icons_20120229.zip
antislashn.org Android - composants graphiques de base 5 - 1/56
Composants graphiques
de base
antislashn.org Android - composants graphiques de base 5 - 2/56
Les écrans Android
● En général, une application Android possède une
interface utilisateur (IHM, GUI)
● La configuration matérielle exacte sur laquelle sera
exécutée l'application n'est pas connue
● taille écran, densité, profondeur de couleur, …
● Caractéristiques d'un écran
● taille : diagonale de 6,5 cm à 30 cm
– 1 pouce = 2,54 cm
● résolution
– QVGA : 240 x 320 pixels
– WXGA 16/9 : 1366 x 768 pixels
– WXGA 16/10 : 1280 x 800 pixels
antislashn.org Android - composants graphiques de base 5 - 3/56
Les barres système
● La barre d'état résume l'état du matériel et affiche
certaines notifications
● La barre de navigation permet de naviguer entre
les applications / pages / accueil
source : Google
antislashn.org Android - composants graphiques de base 5 - 4/56
Les écrans Android
● Les écrans Android sont classés en :
● petit (small) : diagonale de 2,5"
● normal (normal) : diagonale de 4"
● grand (large) : diagonale de 7"
● très grand (xlarge) : diagonale de 10"
– depuis API 9
● La résolution est exprimée en points par pouce
● dpi : dots per inch
● mesure la densité de pixels sur l'écran
antislashn.org Android - composants graphiques de base 5 - 5/56
Les écrans Android
● La densité de pixels est classée en :
● faible (ldpi) : 120 dpi
● moyenne (mdpi) : 160 dpi
● haute (hdpi) : 240 dpi
● très haute (xhdpi) : 320 dpi
– depuis API 8
● Les caractéristiques d'un écran peuvent être
récupérées via une instance de WindowManager
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
Log.d("WindowManagerActivity", "Density DPI : "+displayMetrics.densityDpi);
Log.d("WindowManagerActivity", "Resolution X : "+displayMetrics.widthPixels);
Log.d("WindowManagerActivity", "Resolution Y : "+displayMetrics.heightPixels);
antislashn.org Android - composants graphiques de base 5 - 6/56
Les écrans Android
● Si les résolutions sont différentes pour une même
taille d'écran les composants graphiques
s'afficheront avec une taille différente
● Google préconise l'utilisation de l'unité dp
– appelée aussi dip (density independent pixel)
● ne pas confondre avec dpi
● il existe aussi une métrique pour les polices de
caractères : sp (ou sip pour scale independent pixel)
● Il existe aussi :
● px pour le pixel
● in pour inch
● mm pour millimètre
antislashn.org Android - composants graphiques de base 5 - 7/56
Les écrans Android
source : Google
antislashn.org Android - composants graphiques de base 5 - 8/56
Les écrans Android
● Pour les images
● Android recherche d'abord une ressource
correspondant à la densité utilisé par le matériel
– dans res/drawable-hdpi, ldpi, mdpi
● sinon une ressource dans la densité la plus proche est
utilisée et l'image est retaillée
– ration 3 – 4 – 6 – 8 pour ldpi, mdpi, hdpi et xdpi
– si une image existe en mdpi de 100x100 px
● un ratio 6/4 est utilisé pour un écran hdpi soit 150x150 px
● un ratio ¾ est utilisé pour un écran ldpi soit 75x75 px
antislashn.org Android - composants graphiques de base 5 - 9/56
Les écrans Android
● Balise support-screens
● depuis Android 1.6 (level 4)
● balise fille de la balise manifest
● permet d'indiquer les écrans supportés au système et
Android Market
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"
/>
antislashn.org Android - composants graphiques de base 5 - 10/56
Interface graphique
● Les interfaces graphiques sont réalisées dans une activité
(activity) ou un fragment (fragment)
● un écran peut alors être composé de plusieurs fragments
● sera vu plus tard
● La réalisation de l'IHM peut être faite de manière
● programmée : les composants graphiques sont créés par le
code Java et ajoutés à la vue
– permet de générer une vue dynamiquement
● déclarée : dans des fichiers XML
– séparation du code de la présentation
● les deux modes peuvent être utilisés
– manipulation en java des composants déclarés en XML
antislashn.org Android - composants graphiques de base 5 - 11/56
Interface graphique
● Eclispe : plugin ADT
● permet de créer la vue via un éditeur XML ou par
l'éditeur graphique (Graphical Layout)
antislashn.org Android - composants graphiques de base 5 - 12/56
Hiérarchie des composants graphiques
● les fragments
● les vues
● les gestionnaires de placement
● layout manager
● arbre des composants graphiques
antislashn.org Android - composants graphiques de base 5 - 13/56
Hiérarchie des composants graphiques
● La vue est l'élément de base de l'IHM
● classe View
– tous les composants graphiques héritent de cette classe
– les classes ViewGroup contiennent plusieurs composants
graphiques
● pattern Composite
antislashn.org Android - composants graphiques de base 5 - 14/56
Hiérarchie des composants graphiques
● Principaux attributs XML des View
● background : fond de la vue (couleur, image)
● clickable : indique si réaction aux clics
● id : identifiant unique de la vue
● minHeight et minWidth : hauteur et largeur minimales
● onClick : méthode à invoquer lors d'un clic
● padding : dimension de la marge interne pour les 4 côté de
la vue
– cf paddingBottom, paddingLeft, paddingRight,
paddingTop
● tag : associe un objet au composant
● visibility : indique si le composant est visible ou non
antislashn.org Android - composants graphiques de base 5 - 15/56
Les layouts
● Les layouts sont de type ViewGroup
● conteneurs de composants graphiques
● gèrent le placement des composants
● chaque layout offre une structure de positionnement qui lui
est propre
● Attributs XML obligatoires
● layout_width et layout_heigth : largeur et hauteur
– valeurs possibles
● fill_parent : remplit l'espace du conteneur parent, moins la marge
● wrap_content : se dimensionne en fonction du contenu du composant
● match_parent : est remplacé par fill_parent depuis la version 8 du SDK
● une valeur en dip, px, mm, in, ...
antislashn.org Android - composants graphiques de base 5 - 16/56
Les layouts
● Divers propriétés sont disponibles sur les layouts
pour paramétrer l'affichage
● voir en fonction des layouts
● Il faut penser en terme
● d'orientation
● modèle de remplissage
● poids
● gravité
● remplissage
antislashn.org Android - composants graphiques de base 5 - 17/56
Les layouts
● Orientation (android:orientation)
● des layouts, comme LinearLayout, présentent les
widgets en ligne ou en colonne
● l'orientation peut-être modifiée en cours d'exécution
avec setOrientation(...)
● Poids (android:layout_weigth)
● comment deux widgets se partagent l'espace
disponible ?
● layout_weigth indique la proportion par widget
– si 1 pour deux widgets l'espace libre est divisé en 2
– si 1 pour un widget, et 2 pour le second, le second utilisera
deux fois moins d'espaces que le premier
antislashn.org Android - composants graphiques de base 5 - 18/56
Les layouts
● Modèle de remplissage
● les widgets ont une taille "naturelle" qui repose sur le
texte affiché
– que faire de l'espace restant ?
● les widgets peuvent fournir une valeur pour
layout_width et layout_height
– la valeur peut être
● une dimension précise : 120 dp
● wrap_content pour que le widget occupe sa place naturelle
● fill_parent pour que le widget occupe toute la place disponible
antislashn.org Android - composants graphiques de base 5 - 19/56
CONTENEUR
Les widgets de base
● Positionnement des widgets
WIDGET
top
padding
layout_margin
left
width
height
antislashn.org Android - composants graphiques de base 5 - 20/56
Les layouts
● Gravité
● layout_gravity gère le placement du widget dans le
layout
– indique au conteneur et au widget comment l'alignement doit
être effectué
● gravity gère le placement du texte dans le widget
● Remplissage
● les widgets sont par défaut serrés les uns contre les
autres
– padding gère les 4 zones
– paddingTop, paddingBottom, paddingLeft,
paddingRight gèrent le remplissage zone par zone
antislashn.org Android - composants graphiques de base 5 - 21/56
Les layouts
● Positions relatives par rapport à un conteneur
● layout_alignParentTop : haut du widget aligné avec
celui du conteneur
● layout_alignParentBottom : bas du widget aligné avec
celui du conteneur
● layout_alignParentLeft : bord gauche du widget
aligné avec celui du conteneur
● layout_alignParentRigth : bord droit du widget aligné
avec celui du conteneur
● layout_alignCenterHorizontal : widget centré
horizontalement
● layout_alignCenterVertical : widget centré
verticalement
antislashn.org Android - composants graphiques de base 5 - 22/56
Les layouts
● Position relative des widgets
● attribuer un identifiant à tous les widgets devant être désignés
(par @+id/... )
● désigner un widget dans un autre avec son identifiant (avec
@id/... )
● le contrôle du placement d'un widget par rapport à un autre est
effectué par :
– android:layout_above le widget doit être placé au-dessus de celui
qu'il désigne
– android:layout_below le widget doit être placé sous celui qu'il
désigne
– android:layout_toLeftOf le widget doit être placé à gauche de celui
qu'il désigne
– android:layout_toRightOf le widget doit être placé à droite de celui
qu'il désigne
antislashn.org Android - composants graphiques de base 5 - 23/56
Les layouts
● Alignement d'un widget par rapport à un autre
● android:layout_alignTop le haut du widget est
aligné avec le haut du widget désigné
● android:layout_alignBottom le bas du widget est
aligné avec le bas du widget désigné
● android:layout_alignLeft le bord gauche du
widget est aligné avec le bord gauche du widget
désigné
● android:layout_alignRight le bord droit du
widget est aligné avec le bord droit du widget désigné
● android:layout_alignLBaseLine les lignes de
base des deux widgets doivent être alignées
antislashn.org Android - composants graphiques de base 5 - 24/56
Les layouts
● Le plugin ADT simplifie la mise en place des
layouts
● affiche le résultat
antislashn.org Android - composants graphiques de base 5 - 25/56
FrameLayout
● Le plus simple des conteneurs
● tous les éléments sont placés les uns au-dessus des
autres à partir du coin haut-gauche
● le dernier élément graphique ajouté vient recouvrir les
autres éléments
antislashn.org Android - composants graphiques de base 5 - 26/56
LinearLayout
● Les composants sont placés les un après les
autres, selon l'attribut d'orientation
● verticalement : les uns sous les autres
● horizontalement : les un après les autres, à la droite du
précédent
antislashn.org Android - composants graphiques de base 5 - 27/56
LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
...
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
...
</LinearLayout>
</LinearLayout>
antislashn.org Android - composants graphiques de base 5 - 28/56
LinearLayout
● Attributs utilisés dans l'exemple
● orientation : orientation verticale ou horizontale
● layout_width : largeur
● layout_heigth : hauteur
● layout_weight : proportion de la place prise par le
widget dans son parent
● gravity : poisition dans son conteneur
● background : couleur du fond
● text : texte affiché
● textSize : taille du texte
antislashn.org Android - composants graphiques de base 5 - 29/56
RelativeLayout
● Les positions des composants enfants sont
précisées par rapport à la vue parente ou par
rapport aux autres composants
antislashn.org Android - composants graphiques de base 5 - 30/56
RelativeLayout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/label" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Type here:"/>
<EditText android:id="@+id/entry" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background"
android:layout_below="@id/label"/>
<Button android:id="@+id/ok" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/entry"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dip"
android:text="OK" />
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_toLeftOf="@id/ok"
android:layout_alignTop="@id/ok"
android:text="Cancel" />
</RelativeLayout>
antislashn.org Android - composants graphiques de base 5 - 31/56
RelativeLayout
● Attributs utilisés dans l'exemple
● id : identifiant unique
● layout_below : positionne le haut d'un widget en
dessous du widget référencé
● layout_alignParentRight : aligne le côté droit du
widget avec le côté droit de son parent
● layout_marginLeft : espace pour la marge gauche
● layout_toBeLeftOf : positionne le côté droit du
widget à gauche du widget référencer
● layout_alignTop : aligne le haut du widget avec le
haut du widget référencé
antislashn.org Android - composants graphiques de base 5 - 32/56
TableLayout
● Les composants enfants sont disposés sous forme
de tableau
● les vues enfants sont des lignes de type TableRow
● les composants graphiques sont insérés dans les lignes
antislashn.org Android - composants graphiques de base 5 - 33/56
TableLayout
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1">
<TableRow>
<TextView android:layout_column="1" android:text="Open..."
android:padding="3dip" />
<TextView android:text="Ctrl-O" android:gravity="right"
android:padding="3dip" />
</TableRow>
<TableRow>
<TextView android:layout_column="1" android:text="Save..."
android:padding="3dip" />
<TextView android:text="Ctrl-S" android:gravity="right"
android:padding="3dip" />
</TableRow>
<TableRow>
<TextView android:layout_column="1" android:text="Save As..."
android:padding="3dip" />
<TextView android:text="Ctrl-Shift-S" android:gravity="right"
android:padding="3dip" />
</TableRow>
</TableLayout>
antislashn.org Android - composants graphiques de base 5 - 34/56
TableLayout
● Attributs utilisés dans l'exemple
● layout_column : index de la colonne où doit être
positionné le widget
● gravity : position du widget dans son conteneur
● padding : espacement entre la bordure du widget et
son contenu
antislashn.org Android - composants graphiques de base 5 - 35/56
Autres layout
● Il existent d'autres gestionnaires de positionnement
● seront vu plus tard
● GridView : positionne les éléments dans une grille
– la grille est muni d'ascenseurs
– les éléments sont ajoutés via un ListAdapter
● Mise en place d'onglets
– nécessite une construction spécifique de layouts
● Liste déroulante
– utilise une classe ListView
antislashn.org Android - composants graphiques de base 5 - 36/56
Autres layout
● Il existent d'autres gestionnaires de positionnement
● seront vu plus tard
● GridView : positionne les éléments dans une grille
– la grille est muni d'ascenseurs
– les éléments sont ajoutés via un ListAdapter
● Mise en place d'onglets
– nécessite une construction spécifique de layouts
● Liste déroulante
– utilise une classe ListView
antislashn.org Android - composants graphiques de base 5 - 37/56
Mode déclaratif
● Mode le plus simple pour déclarer et réutiliser les
IHM
● les exemples précédents illustrent le mode déclaratif
● Création du fichier XML dans le répertoire
res/layout
● possibilité de fournir des layouts adaptés aux écrans
physiques dans les répertoires res/layout-small,
res/layout-normal, res/layout-large, res/layout-xlarge
● des layouts adaptés à l'orientation de l'écran sont aussi
possibles
– ajouter le qualificatif port pour portrait et land pour paysage
● res/layout-port, res/layout-normal-land, ...
antislashn.org Android - composants graphiques de base 5 - 38/56
Mode déclaratif
● Utilisation du layout
● une activité crée l'interface utilisateur
● utilisation de la méthode setContentView(...) de
la classe Activity
– prend en paramètre un identifiant correspondant à l'identifiant
du composant graphique
● utilisation de la classe R.java
public class FrameLayoutActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
antislashn.org Android - composants graphiques de base 5 - 39/56
Programmation des IHM
● Mode plus puissants, mais plus complexe
● ne facilite pas la réutilisation des IHM
● n'utilise pas les stratégies de choix de ressource en
fonction du type d'écran
– pas d'utilisation des fichiers XML res/layout-xxx
● Création du layout
● instanciation
– le constructeur prend en argument le contexte de l'application
– Activity hérite de la classe Context
● paramétrage du layout créé
– utilise une instance de ViewGroup.LayoutParams
antislashn.org Android - composants graphiques de base 5 - 40/56
Programmation des IHM
● Appel de la méthode setContentView(...)
public class LayoutProgrammationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
layout.setLayoutParams(params);
this.setTitle("Exemple instanciation layout");
setContentView(layout);
}
}
antislashn.org Android - composants graphiques de base 5 - 41/56
Programmation des IHM
● Les modes déclaratif et programmatique sont
souvent utilisés conjointement
● l'IHM est décrite dans le fichier XML
● le code java agit dynamiquement sur l'IHM
● c'est ce mode de développement qui est privilégié
● Interactions entre le mode déclaratif et
programmatique
● le fichier XML déclare les composants graphique
● le code java retrouve le widget qu'il doit manipuler
antislashn.org Android - composants graphiques de base 5 - 42/56
Programmation des IHM
● Récupération des widgets
● le code java doit récupérer les widgets qui sont déclarés
dans le fichier XML
● un identifiant est associé au widget, par l'attribut id
– id="@[+][package]id/nom_ressource"
● le signe + signifie que l'identifiant doit être ajouté, il apparaîtra dans le
fichier R.java
● la méthode findViewById(...) permet de récupérer
un widget
– public View findViewById(int id)
– l'identifiant est retrouvé par la classe R.java
antislashn.org Android - composants graphiques de base 5 - 43/56
Programmation des IHM
<?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_message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
public class ModeMixteActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView text = (TextView) findViewById(R.id.text_message);
text.setText("Comment ça va ?");
}
}
ajout de l'identifiant
récupération du widget
antislashn.org Android - composants graphiques de base 5 - 44/56
Les widgets de base
● Nous allons présenter quelques widgets de base
● le nombre de composants Android évolue en fonction des
versions
● le nombre de propriétés de chaque composant est
impressionnant
– les propriétés communes à tous les composants, plus les propriétés
spécifiques
● atteint plusieurs dizaines de propriétés par composants
– ce référer à la documentation fournie avec le SDK pour plus de
détails
● tous les composants font partie du package android.widget
● D'autres composants seront présentés au fur et à mesure
des exemples et exercices
antislashn.org Android - composants graphiques de base 5 - 45/56
Les widgets de base
● Le tiroir "Form Widget" du plugin
ADT permet de choisir les widgets
disponibles en fonction du niveau
de SDK choisi
● attention, sur certaines plateformes
de développement, le rendu ne
correspond pas à l'affichage réel
– l'émulateur permet alors de vérifier les
attributs positionnés
antislashn.org Android - composants graphiques de base 5 - 46/56
View
● La classe View la classe de base utilisée par tous
les widgets
● View est spécialisée en ViewGroup pour les
conteneurs
● Une vue occupe un rectangle dans l'interface
graphique
● La vue est responsable de son affichage et de la
gestion des événement
antislashn.org Android - composants graphiques de base 5 - 47/56
View
● De nombreux événements sont exploitables
● clic, survol, création, drag and drop, …
● cf. la documentation
● Un ou plusieurs objets peuvent être attachés à une
vue
● notion de tag
● voir les méthodes setTag(...) et getTag(...)
antislashn.org Android - composants graphiques de base 5 - 48/56
Les widgets de base
● La documentation permet de connaître, widget par
widget, les attributs XML et les méthodes
équivalentes Java
● onglet "Reference"
antislashn.org Android - composants graphiques de base 5 - 49/56
TextView
● Affichage d'un texte
● Principales propriétés
● autoLink : convertit les liens HTTP et adresses mails en liens
cliquables
● ellipsize : règle d'affichage du texte si plus long que la zone de
visualisation
● height, width, maxHeight, maxWidth : hauteur et largeur
● lines, minLines, maxLines : nombre de lignes
● text : texte à afficher
● textColor, textSize, textStyle : caractéristiques du texte
●
gravity : endroit où est afficher le texte dans le conteneur si la zone
d'affichage du texte est plus petit que le conteneur
● drawableTop, drawableBottom, drawableLeft, drawableRight
: permet la gestion de l'affichage d'une ressource drawable à côté du
texte
antislashn.org Android - composants graphiques de base 5 - 50/56
TextView
<?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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#FFF"
android:textColor="#000"
android:textSize="25sp"
android:textStyle="italic"
android:text="@string/hello" />
</LinearLayout>
antislashn.org Android - composants graphiques de base 5 - 51/56
EditText
● Permet la saisie d'un texte
● Hérite de TextView
● même propriétés
● Principales propriétés supplémentaires
● inputType : permet d'ajouter un filtre de saisie : email,
mot de passe, numérique, multi-lignes, …
– pas de validation, affiche le clavier adéquat, filtre les touches
● scrollHorizontally : défilement horizontal du texte
si celui-ci est plus grand que la zone de saisie
● La méthode getText() permet de récupérer le
texte saisi
antislashn.org Android - composants graphiques de base 5 - 52/56
EditText
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
...
<EditText
android:id="@+id/nom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName" />
...
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" >
</EditText>
...
<EditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress" >
</EditText>
</LinearLayout>
Listing incomplet
antislashn.org Android - composants graphiques de base 5 - 53/56
Button
● Des actions sont souvent utilisés avec le widget
Button
● de manière générale des actions sont utilisables sur
tous les widgets
● Hérite de TextView
● propriétés utiles
– onClick : nom de la méthode de l'activité à exécuter
● la signature de la méthode doit être:
– public void nomMethode(View vue);
antislashn.org Android - composants graphiques de base 5 - 54/56
Button
● Java peut aussi être utiliser pour lier l'action au
bouton
● appel de listener
– même type de programmation événementielle que Swing
● la mise en place du listener se fait par la méthode
– public void setOnClickListener(View.OnClickListener listener)
– même choix d'implémentation que sous Swing
● doit implémenter View.OnClickListener
– classe anonyme
– méthode de l'activité
– méthode d'une classe de traitement
– l'implémentation doit fournir une méthode
● public void onClick(View v)
antislashn.org Android - composants graphiques de base 5 - 55/56
Button
● Mise en place de l'action par le fichier XML
● listings incomplets
<Button
android:id="@+id/btnEnvoyer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Envoyer"
android:onClick="enregistrerUtilisateur" />
public void enregistrerUtilisateur(View v){
Button b = (Button) v;
EditText nom = (EditText) this.findViewById(R.id.nom);
Toast.makeText(this, b.getText()+"n"+ nom.getText(),
Toast.LENGTH_LONG).show();
}
création et affichage d'un toast
rendu du toast
antislashn.org Android - composants graphiques de base 5 - 56/56
Button
● Exécution de l'action par utilisation d'un listener
● listings incomplets
<Button
android:id="@+id/btnEnvoyer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Envoyer"
/>
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button b = (Button) findViewById(R.id.btnEnvoyer);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EditText nom = (EditText) findViewById(R.id.nom);
Toast.makeText(v.getContext(), "Bonjour "+ nom.getText(),
Toast.LENGTH_LONG).show();
}
});
}
création d'une classe anonyme
antislashn.org Android - Intent 6 - 1/28
Intent
antislashn.org Android - Intent 6 - 2/28
Bus de messages
● Les modules applicatifs ne sont pas invoqués directement
● ils sont activés via des messages, les "intentions"
– classe Intent
● Le message contient la description de l'opération devant être
exécutée
● sous forme divers
– nom de la classe
– action sous forme de chaîne de caractère
– type MIME
● Les messages sont aussi utilisés pour les retours de résultats
entre modules
antislashn.org Android - Intent 6 - 3/28
Bus de messages
Producteur
Système Android
Module applicatif
Intent
IntentResolver
Application 2
Activité
Activité
IntentFilter
IntentFilter
Application 1
Activité
Service
IntentFilter
IntentFilter
Le composant dont le filtre
d'intention correspond est
activé
antislashn.org Android - Intent 6 - 4/28
Bus de messages
● Activation d'activité
● Context.startActivity()
● Context.startActivityForResult()
– un intention est associée à Activity.setResult()
● Activation de service
● Context.startService()
● Context.bindService()
● Activation de BroadcastReceiver
● Context.sendBroadcast()
● Context.sendOrderedBroadcast()
● Context.sendBroadcast()
antislashn.org Android - Intent 6 - 5/28
Bus de messages
● La collaboration entre les applications s'effectue via un
bus de message
● une instance de Intent est le message
● Contient plusieurs champs
● nom du composant qui doit gérer l'Intent
● l'action qui doit être exécutée
– sous forme de String
● une donnée sous forme d'URI et de type MIME
● une catégorie qui correspond au type de composant devant
gérer l'Intent
● des données supplémentaires – les Extras
● des flags utilisés par Android pour gérer le mode de
chargement d'une activité
antislashn.org Android - Intent 6 - 6/28
Bus de messages
Activité principale
Activité A
Intent de lancement
Intent de résultat
Activité BIntent de lancement
extra
antislashn.org Android - Intent 6 - 7/28
Lancement d'un message
● Selon le mode d'instanciation d'un Intent, les
champs précédents peuvent être nuls.
● Deux groupes de messages
● les intentions explicites
– le composant à activé est désigné par son nom
– en général utilisés au sein d'une même application
● les intentions implicites
– le nom du composant à activer n'est pas connu
– permet d'activer des composants d'autres application
antislashn.org Android - Intent 6 - 8/28
Intent
● Intention explicite
● le composant cible est connu
– souvent une activité de la même application
– le composant cible n'a pas besoin de déclarer de filtre
d'intention dans le manifeste
● seulement des iintentions explicites peuvent alors l'invoquer
● syntaxe
● public Intent(Context ctx, Class<?> cls)
● public Intent(String action, Context ctx, Class<?> cls)
Intent intent = new Intent(this,ExplicitActivity.class);
startActivity(intent);
antislashn.org Android - Intent 6 - 9/28
Intent
● Intention implicite
● le composant destinataire n'est pas connu
● le système est chargé de trouver le composant
destinataire
– si plusieurs composants cibles existent, le système demande
à l'utilisateur de choisir
● création d'une intention implicite
– l'action est positionnée
– une donnée associée (URI) peut être ajoutée
● syntaxe
● public Intent(String action)
● public Intent(String action, Uri uri)
antislashn.org Android - Intent 6 - 10/28
Intent
● Intention implicite
● exemple
– le système cherche alors le meilleur composant parmi
ceux ayant déclarés leur capacité à réaliser l'action
● les composants ayant la capacité de réaliser
l'action doivent déclarer un filtre d'intentions
– un filtre d'intention n'a aucune incidence sur les
intentions explicites
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:0102030405"));
antislashn.org Android - Intent 6 - 11/28
Résolution des intentions
● Pour les intentions implicites Android doit trouver le – ou
les – composants susceptibles de gérer l'intention
● L'objet Intent est comparé aux filtres d'intentions
déclarés par les composants prenant en charge le
message
● dans le fichier manifeste
● balise <intent-filter>
● Trois champs sont retenus pour ce test
● l'action
● la donnée : URI et type MIME
● la catégorie
antislashn.org Android - Intent 6 - 12/28
Résolution des intentions
● Test sur l'action
● le test échoue si le filtre ne contient pas l'action de
l'intention
● Test sur la catégorie
● chacune des catégories de l'intention doit correspondre
aux catégories du filtre
● toutes les catégories du filtre n'ont pas a être présentes
dans l'intention
● un objet Intent qui ne possède pas de catégorie
passera donc toujours ce test
– une exception : le démarrage d'une activité nécessite la
catégorie android.intent.category.DEFAULT
antislashn.org Android - Intent 6 - 13/28
Résolution des intentions
● L'élément <data> spécifie une URI et un type
MIME
● l'URI est constituée de schema, host, port et path
– schema://host:port/path
– host:port forme l'authority
● Test sur la donnée
● un Intent qui ne contient pas de data passe le test
● un Intent qui contient une URI sans type de donnée
passe le test si le filtre correspond
● un Intent qui contient un type MIME passe le test si le
type correspond
antislashn.org Android - Intent 6 - 14/28
Résolution des intentions
● Utilisation des types MIME
● par défaut l'application SMS Android récupère
l'ensemble des intentions sur les types MIME
● il faut associer une action propre au composant pour
filtrer sur le type MIME et l'action
● Si plusieurs modules applicatifs peuvent répondre
à l'intention, Android présente une boite de
dialogue de choix à l'utilisateur
antislashn.org Android - Intent 6 - 15/28
Intent
● La méthode getIntent() permet de récupérer
l'intention ayant lancée le composant
● L'action d'une intention peut être mise à jour et
récupérée par
● public Intent setAction(String action)
● public String getAction()
● Des données supplémentaires peuvent être
fournies à l'intention, sous forme de
● de catégories
● de données
● d'extras
antislashn.org Android - Intent 6 - 16/28
Intent
● La catégorie
● utilisée pour déterminer le type de composant qui doit
réaliser l'action
● ajout par la méthode
– public Intent addCategory(String category)
● le paramètre String décrit la catégorie
● Android définie un certains nombre de catégories,
comme CATEGORY_LAUNCH, CATEGORY_HOME
– cf. la documentation
antislashn.org Android - Intent 6 - 17/28
Intent
● Les données
● regroupe l'URI et le type MIME de la données cible
● le format et la signification des données sont
dépendants de l'action spécifiée
● en général le type MIME peut être déduit de l'URI
● méthodes utiles
– public Intent setData(Uri data)
– public Uri getData()
– public Intent setType(String type)
– public String getType()
● l'utilisation de setData et setType sont concurrentes,
elles écrasent leurs données respective
antislashn.org Android - Intent 6 - 18/28
Intent
● Filtre d'intentions
● balise XML : intent-filter
– balise fille de la balise de déclaration du composant applicatif
– attributs
● icon : affichage pour l'utilisateur
● label : affichage pour l'utilisateur
● priority : donne une priorité de choix auprès du système, la valeur
la plus forte est la plus prioritaire
● balises filles principales
– action : nom de l'action sur laquelle réagir
– category : nom de la catégorie sur laquelle réagir
– data : spécifie une URI et/ou un type MIME
antislashn.org Android - Intent 6 - 19/28
Résolution des intentions
● Un composant applicatif peut déclarer plusieurs
filtres d'intention
<activity android:name=".Activity2">
<intent-filter >
<action android:name="org.antislashn.android.action.TOTO" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="org.antislashn.android.category.LAUNCH"/>
</intent-filter>
<intent-filter >
<action android:name="org.antislashn.android.action.TOTO" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="moncontent" android:host="org.antislashn.android"
android:port="150"/>
</intent-filter>
<intent-filter >
<action android:name="org.antislashn.android.action.TOTO" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="type/antislashn"/>
</intent-filter>
</activity>
nécessaire pour lancer l'activité
antislashn.org Android - Intent 6 - 20/28
Résolution des intentions
● Filtre avec action et catégorie
● appel avec action
● appel avec action et catégorie
<intent-filter >
<action android:name="org.antislashn.android.action.TOTO" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="org.antislashn.android.category.LAUNCH"/>
</intent-filter>
Intent intent = new Intent(Activity2.ACTION);
startActivity(intent);
défini l'action TOTO
Intent intent = new Intent(Activity2.ACTION);
intent.addCategory(Activity2.LAUNCH_CATEGORY);
startActivity(intent);
défini l'action TOTO
défini la catégorie LAUNCH
antislashn.org Android - Intent 6 - 21/28
Résolution des intentions
● Filtre avec action et URI
● appel
<intent-filter >
<action android:name="org.antislashn.android.action.TOTO" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="moncontent" android:host="org.antislashn.android"
android:port="150"/>
</intent-filter>
Uri uri = Uri.parse("moncontent://org.antislashn.android:150/exemple/toto");
Intent intent = new Intent(Activity2.ACTION,uri);
startActivity(intent);
antislashn.org Android - Intent 6 - 22/28
Résolution des intentions
● Filtre avec action et type MIME
● appel
<intent-filter >
<action android:name="org.antislashn.android.action.TOTO" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="type/antislashn"/>
</intent-filter>
Intent intent = new Intent(Activity2.ACTION);
intent.setType("type/antislashn");
startActivity(intent);
antislashn.org Android - Intent 6 - 23/28
Intent
● Exemples d'utilisation d'intentions
● utilisation d'une action et d'une URI
– ACTION_VIEW et content://contacts/people/1
● affichera les informations du contact ayant l'identifiant 1
– ACTION_DIAL et tel:123
● provoque l'affichage du clavier téléphonique avec le numéro de
téléphone
– ACTION_GET_CONTENT et vnd.android.cursor.item/phone
● affiche la liste des numéros de téléphone
● autres exemples
– ACTION_MAIN et CATEGORY_HOME
● affichage de l'écran d'accueil
antislashn.org Android - Intent 6 - 24/28
Intent
● Les Extras
● données applicatives ajoutées à l'intention
● méthodes
– public Intent putExtras(Bundle extra)
– public Bundle getExtras()
antislashn.org Android - Intent 6 - 25/28
Intent
● Bundle
● similaire à la classe Map
– clé : uniquement de type String
– valeur associée à la clé : toute instance, ou tableau
d'instances, de classe implémentant l'interface Parcelable
● mécanisme de sérialisation léger propre à Andoid
● de nombreuses méthodes de la classe Intent
permettent de ne pas instancier directement un Bundle
– public Intent putExtra(String name, int value)
– public int getIntExtra(String name, int defaultValue)
– public Intent putExtra(String name, String value)
– public String getStringExtra(String name, String
defaultValue)
– etc.
antislashn.org Android - Intent 6 - 26/28
Intent
● Des indicateurs (flags, drapeaux) peuvent aussi
être ajouter à l'intention
● public Intent setFlags(int flags)
● public Intent addFlags(int flags)
● public int getFlags()
● Les flags permettent de changer certains
comportements par défaut des activité
● gestion de la pile des activités par exemple
antislashn.org Android - Intent 6 - 27/28
PendingIntent
● Intention en attente
● de type PendingIntent
● contient une instance d'Intent décrivant l'action à
réaliser
● cette action est réalisée ultérieurement
– par une autre application qui reçoit alors les droits de
l'application qui a créée l'intention en attente
● création d'une intention en attente par les méthodes
statique de PendingIntent
– getActivity : lancera une activité
– getService : lancera un service
– getBroadcast : diffuse un événement
antislashn.org Android - Intent 6 - 28/28
PendingIntent
● Avec un Intent, un module applicatif A demande
le lancement d'un module applicatif B
● Avec un PendingIntent, un module applicatif A
demande à un module X de lancer un module B
Activité A Activité BIntent
Activité A Module X Activité BIntentPendingIntent
antislashn.org Android - Activity 7 - 1/22
Les activités
Activity
antislashn.org Android - Activity 7 - 2/22
Activity
● Composant applicatif
● peut-être constitué de fragments (Fragment)
– sera abordé plus loin
● représente la gestion d'un écran pour l'utilisateur
– une application simple peut être composée d'une seule
activité
– l'écran géré par l'activité est celui qui est vu par l'utilisateur
● s'exécute dans le thread principal de l'application
– ne pas bloquer ce thread principal par des calculs ou attentes
de ressources
● mauvaise expérience utilisateur
● Android peut alors décider de tuer l'activité
antislashn.org Android - Activity 7 - 3/22
Activity
● Une activité spécialise la classe Activity
● Activity hérite de Context
● l'activité est déclarée dans le fichier manifeste
● Possède un cycle de vie qui est géré par Android
● nous avons vu la méthode onCreate(...)
● Une activité est déclenchée par une intention
(Intent)
● intention implicite
● intention explicite
antislashn.org Android - Activity 7 - 4/22
Activity
● Activités et intentions
● une activité qui accepte des intentions implicites doit
déclarer dans ses filtres d'intention la catégorie
– android.intent.category.DEFAULT
● une activité qui est le point d'entrée de l'application doit
déclarer
– l'action : android.intent.action.MAIN
● composant point d'entrée de l'application
– la catégorie : android.intent.category.LAUNCHER
● composant pouvant être lancé par l'utilisateur
– la combinaison MAIN et LAUNCHER ajoutera l'activité au
"Lanceur d'applications" Android
– ne déclare pas android.intent.category.DEFAULT
antislashn.org Android - Activity 7 - 5/22
Activity
● Déclaration dans le manifeste
● attributs courants
– label : nom de l'activité, si non précisé le label de
l'application est utilisé
– icon : icône de l'activité, si non précisé l'icône de l'application
est utilisé
– name : spécifie la classe de l'activité, si le package est le
même que l'attribut package de la balise manifest, il peut
être remplacé par point (.).
– screenOrientation : orientation de l'écran que doit
adopter l'application
● pas recommandé de fixer cette valeur
– hardwareAcceleration : (depuis API 11) demande
d'amélioration des performances d'affichage
antislashn.org Android - Activity 7 - 6/22
Activity
● Exemple de fichier manifeste
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.antislashn.android.activity"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".AppelactivityActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="explicit"
android:name=".ExplicitActivity" >
</activity>
</application>
</manifest>
activité point d'entrée de l'application
activité ne pouvant être appelée que par un intent explicite
antislashn.org Android - Activity 7 - 7/22
Activity
● Cycle de vie
● une activité peut-être détruite par le système à partir du
moment ou cette activité est en pause
● les différentes méthodes du cycle de vie peuvent être
surchargées
– il faut commencer par appeler la méthode du même nom dans
la classe mère
● exemple : super.onCreate(savedInstanceState)
● bien garder à l'esprit que l'activité peut être exécutée en
arrière plan
– l'activité est toujours en mémoire, mais pas d'affichage
antislashn.org Android - Activity 7 - 8/22
Activity
antislashn.org Android - Activity 7 - 9/22
Activity
● onCreate
● appelée à la création de l'activité
● un seul appel lors du cycle de vie
● permet de créer les IHM, initialiser l'activité, …
● reçoit un objet de type Bundle
– récupère des informations sauvegardées précédemment lors de la
dernière exécution
– la sauvegarde est faite par le système
● une fermeture normale de l'activité ne provoque pas de sauvegarde
● si Android ferme l'activité la sauvegarde est effectuée
– les méthodes onSaveInstance et onRestoreInstance
permettent d'ajouter des objets dans Bundle
● ne pas utiliser pour la persistance, car onSaveInstance n'est pas toujours
appelée (arrêt normal de l'application par exemple)
antislashn.org Android - Activity 7 - 10/22
Activity
● onStart
● appelée après la méthode onCreate ou onRestart
● précède l'affichage de la vue de l'activité
● onResume
● appelée après la méthode onStart ou onPause
● après l'affichage de la vue de l'activité
antislashn.org Android - Activity 7 - 11/22
Activity
● onPause
● appelée lorsque une autre activité prend la main pour
passer en premier plan
● l'exécution de la méthode doit être rapide
● sauvegarde des données persistantes, arrêt des tâches
consommatrices de ressources, …
● la méthode isFinishing() permet de savoir si
l'activité va être détruite ou juste mise en pause
● jusqu'à l'API 11 Android peut décider de tuer
l'application à partir de la sortie de cette méthode
● à partir de l'API 11 Android peut décider de tuer
l'application après onStop
antislashn.org Android - Activity 7 - 12/22
Activity
● onStop
● permet de libérer certaines ressources
● jusqu'à l'API 11 l'appel de cette méthode peut ne jamais
être exécutée
● onRestart
● appelée si l'activité revient au premier plan
● suivi d'un appel à onStart
● onDestroy
● appelée après un appel de la méthode finish ou par le
système si celui-ci à besoin de ressources
● permet de libérer des ressources liées à l'activité
antislashn.org Android - Activity 7 - 13/22
Activity
● Des méthodes événementielles permettent de
gérer la persistance de l'instance
● onSaveInstanceState(Bundle) qui est appelée
juste avant que l'activité soit tuée onDestroy()
● onRestoreInstanceState(Bundle) qui est
appelée après la méthode onStart() et avant
onPostCreate(Bundle)
antislashn.org Android - Activity 7 - 14/22
Activity
● lancement d'une activité par la méthode
startActivity
● public void startActivity(Intent intent)
● l'intention peut-être explicite ou implicite
● si l'activité invoquée doit retourner un résultat
● appeler l'activité avec startActivityForResult
● coder une méthode callback onActivityResult
antislashn.org Android - Activity 7 - 15/22
Activity
● startActivityForResult
● public void startActivityForResult(Intent intent,
int requestCode)
● paramètres
– intent : intention envoyée au sysème
– requestCode : si >=0, ce même code sera retourné à la
méthode onActivityResult
–
antislashn.org Android - Activity 7 - 16/22
Activity
● onActivityResult
● public void onActivityResult(int requestCode,
int resultCode,
Intent data)
● paramètres
– requestCode : code utilisé dans
startActivityForResult
– resultCode : résultat de retour de l'activité
● ce code a été positionné par l'activité par la méthode
setResult(int)ou setResult(int,Intent)
– data : intention retournée par l'activité, ce qui permet de
récupérer les extras ajoutés à l'intention par l'activité
● ce code a été positionné par l'activité appelée via sa méthode
setResult(int,Intent)
antislashn.org Android - Activity 7 - 17/22
Activity
● Résumé : appel d'une activité avec retour de résultat
● dans l'activité appelante
– coder la méthode onActivityResult
– lancer l'intention pour démarrer l'activité appelée, celle qui retourne
le résultat
● dans l'activité appelée
– avant de finir l'activité, créer un nouvel Intent
– ajouter un extra
– ajouter à setResult
– puis appeler finish()
● au retour, dans l'activité appelée
– récupérer l'intention et extraire l'extra
antislashn.org Android - Activity 7 - 18/22
Activity
● Exemple de code
● activité appelante
public class ActivityResultActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void appelAutreActivity(View v){
Intent intent = new Intent(this,AutreActivity.class);
startActivityForResult(intent, 0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
int r = data.getIntExtra("resultat", 0);
Toast.makeText(this, "RESULTAT = "+r, Toast.LENGTH_LONG).show();
}
}
appel de l'activité devant retourner
un résultat
récupération du résultat préparé par
l'activité appelée
antislashn.org Android - Activity 7 - 19/22
Activity
● Exemple de code
● activité appelée retournant le résultat
public class AutreActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.autre_activity);
}
public void stopActivity(View v){
Intent intent = new Intent();
intent.putExtra("resultat", 10);
this.setResult(0, intent);
this.finish();
}
}
préparation du résultat renvoyé à
l'activité appelante
antislashn.org Android - Activity 7 - 20/22
Activity
● A chaque application le système associe une pile
LIFO
● la pile d'activités
● empile les activités lancées les une après les autres
● le bouton retour dépile les activités
● si l'utilisateur revient sur la page d'accueil Android
(touche Accueil) la pile est sauvegardée
– elle est restituée lorsque l'application est relancée
– l'activité courante est donc retrouvée
antislashn.org Android - Activity 7 - 21/22
Activity
● Il est possible de changer le mode de
fonctionnement par défaut de la pile
● utilisation des attributs de la balise activity
– alwaysRetainTaskState : (yes | no)
– clearTaskOnLaunch : (yes | no)
– finishOnTaskLauch : (yes | no)
– launchMode : (standard | singleTop | singleTask |
singleInstance)
● ajout du flag Intent.FLAG_ACTIVITY_CLEAR_TOP
pour dépiler la pile jusqu'à l'activité qui doit être lancée
antislashn.org Android - Activity 7 - 22/22
Activity
● Des classes dérivées de Activity permettent de
simplifier la gestion de certains contrôles
graphiques
● ListActivity
● MapActivity
● AccountAthentificationActivity
● ...
antislashn.org Android - ListView 8 - 1/29
Composant ListView
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android
Développement Android

Contenu connexe

Tendances

Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
Oussama BEN KHIROUN
 
Chp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesChp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications Mobiles
Lilia Sfaxi
 
diagramme des cas d'utilisation
diagramme des cas d'utilisationdiagramme des cas d'utilisation
diagramme des cas d'utilisation
Amir Souissi
 
Cours architecture
Cours architectureCours architecture
Cours architecture
Abdelaziz Elbaze
 
Android - Tp3 - intents
Android - Tp3 -  intentsAndroid - Tp3 -  intents
Android - Tp3 - intents
Lilia Sfaxi
 
Chapitre2_fragmentation_Abdali.pptx
Chapitre2_fragmentation_Abdali.pptxChapitre2_fragmentation_Abdali.pptx
Chapitre2_fragmentation_Abdali.pptx
AimadBenzakry
 
Modélisation de données pour MongoDB
Modélisation de données pour MongoDBModélisation de données pour MongoDB
Modélisation de données pour MongoDB
MongoDB
 
BigData_TP3 : Spark
BigData_TP3 : SparkBigData_TP3 : Spark
BigData_TP3 : Spark
Lilia Sfaxi
 
Support du cours : Programmation Web 2
Support du cours : Programmation Web 2Support du cours : Programmation Web 2
Support du cours : Programmation Web 2
Faycel Chaoua
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
ENSET, Université Hassan II Casablanca
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
ENSET, Université Hassan II Casablanca
 
Introduction aux systèmes répartis
Introduction aux systèmes répartisIntroduction aux systèmes répartis
Introduction aux systèmes répartis
Heithem Abbes
 
cours j2ee -présentation
cours  j2ee -présentationcours  j2ee -présentation
cours j2ee -présentation
Yassine Badri
 
eServices-Tp1: Web Services
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web Services
Lilia Sfaxi
 
Architecture réparties et les services web
Architecture réparties et les services webArchitecture réparties et les services web
Architecture réparties et les services web
CHOUAIB EL HACHIMI
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
ENSET, Université Hassan II Casablanca
 
Tp n 1 linux
Tp n 1 linuxTp n 1 linux
Tp n 1 linux
Amir Souissi
 
Applications Android - cours 11 : Boites de dialogue
Applications Android - cours 11 : Boites de dialogueApplications Android - cours 11 : Boites de dialogue
Applications Android - cours 11 : Boites de dialogue
Ahmed-Chawki Chaouche
 
P4 intents
P4 intentsP4 intents
P4 intents
Lilia Sfaxi
 
BigData_Chp1: Introduction à la Big Data
BigData_Chp1: Introduction à la Big DataBigData_Chp1: Introduction à la Big Data
BigData_Chp1: Introduction à la Big Data
Lilia Sfaxi
 

Tendances (20)

Design patterns - Exemples en Java
Design patterns - Exemples en JavaDesign patterns - Exemples en Java
Design patterns - Exemples en Java
 
Chp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications MobilesChp3 - Architecture Logicielle des Applications Mobiles
Chp3 - Architecture Logicielle des Applications Mobiles
 
diagramme des cas d'utilisation
diagramme des cas d'utilisationdiagramme des cas d'utilisation
diagramme des cas d'utilisation
 
Cours architecture
Cours architectureCours architecture
Cours architecture
 
Android - Tp3 - intents
Android - Tp3 -  intentsAndroid - Tp3 -  intents
Android - Tp3 - intents
 
Chapitre2_fragmentation_Abdali.pptx
Chapitre2_fragmentation_Abdali.pptxChapitre2_fragmentation_Abdali.pptx
Chapitre2_fragmentation_Abdali.pptx
 
Modélisation de données pour MongoDB
Modélisation de données pour MongoDBModélisation de données pour MongoDB
Modélisation de données pour MongoDB
 
BigData_TP3 : Spark
BigData_TP3 : SparkBigData_TP3 : Spark
BigData_TP3 : Spark
 
Support du cours : Programmation Web 2
Support du cours : Programmation Web 2Support du cours : Programmation Web 2
Support du cours : Programmation Web 2
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Introduction aux systèmes répartis
Introduction aux systèmes répartisIntroduction aux systèmes répartis
Introduction aux systèmes répartis
 
cours j2ee -présentation
cours  j2ee -présentationcours  j2ee -présentation
cours j2ee -présentation
 
eServices-Tp1: Web Services
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web Services
 
Architecture réparties et les services web
Architecture réparties et les services webArchitecture réparties et les services web
Architecture réparties et les services web
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Tp n 1 linux
Tp n 1 linuxTp n 1 linux
Tp n 1 linux
 
Applications Android - cours 11 : Boites de dialogue
Applications Android - cours 11 : Boites de dialogueApplications Android - cours 11 : Boites de dialogue
Applications Android - cours 11 : Boites de dialogue
 
P4 intents
P4 intentsP4 intents
P4 intents
 
BigData_Chp1: Introduction à la Big Data
BigData_Chp1: Introduction à la Big DataBigData_Chp1: Introduction à la Big Data
BigData_Chp1: Introduction à la Big Data
 

Similaire à Développement Android

introAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdfintroAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdf
RihabBENLAMINE
 
android.pdf
android.pdfandroid.pdf
android.pdf
med_univ78
 
Introduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfIntroduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdf
med_univ78
 
Chapitre 1 android
Chapitre 1 androidChapitre 1 android
01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)TECOS
 
cours-android.pdf
cours-android.pdfcours-android.pdf
cours-android.pdf
med_univ78
 
Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016
Hadina RIMTIC
 
Ch1. Développement mobile
Ch1. Développement mobileCh1. Développement mobile
Ch1. Développement mobile
Haifa Chorfi
 
Workshop android
Workshop androidWorkshop android
Workshop android'Med Douik
 
Cours android 2016
Cours android 2016Cours android 2016
Cours android 2016
Saber LAJILI
 
Cours android 2016_partie1
Cours android 2016_partie1Cours android 2016_partie1
Cours android 2016_partie1
Sabeur LAJILI
 
Chapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-androidChapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-android
Salah Gharbi
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contact
Jasmine Conseil
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contact
Jasmine Conseil
 
chapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdfchapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdf
olfaharrabi2
 
Environnement Android.pdf
Environnement Android.pdfEnvironnement Android.pdf
Environnement Android.pdf
RihabBENLAMINE
 
1 tours horizon
1 tours horizon1 tours horizon
1 tours horizon
Saber LAJILI
 
Hackathon Android Abidjan
Hackathon Android  AbidjanHackathon Android  Abidjan
Hackathon Android Abidjan
Bacely YoroBi
 

Similaire à Développement Android (20)

introAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdfintroAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdf
 
android.pdf
android.pdfandroid.pdf
android.pdf
 
Introduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfIntroduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdf
 
Chapitre 1 android
Chapitre 1 androidChapitre 1 android
Chapitre 1 android
 
01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)
 
Chapitre 4 sem
Chapitre 4 semChapitre 4 sem
Chapitre 4 sem
 
cours-android.pdf
cours-android.pdfcours-android.pdf
cours-android.pdf
 
Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016
 
Intro Android
Intro AndroidIntro Android
Intro Android
 
Ch1. Développement mobile
Ch1. Développement mobileCh1. Développement mobile
Ch1. Développement mobile
 
Workshop android
Workshop androidWorkshop android
Workshop android
 
Cours android 2016
Cours android 2016Cours android 2016
Cours android 2016
 
Cours android 2016_partie1
Cours android 2016_partie1Cours android 2016_partie1
Cours android 2016_partie1
 
Chapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-androidChapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-android
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contact
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contact
 
chapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdfchapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdf
 
Environnement Android.pdf
Environnement Android.pdfEnvironnement Android.pdf
Environnement Android.pdf
 
1 tours horizon
1 tours horizon1 tours horizon
1 tours horizon
 
Hackathon Android Abidjan
Hackathon Android  AbidjanHackathon Android  Abidjan
Hackathon Android Abidjan
 

Plus de Franck SIMON

Distribuer une librairie via maven
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via maven
Franck SIMON
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
Franck SIMON
 
Java 8 - lambda
Java 8 - lambdaJava 8 - lambda
Java 8 - lambda
Franck SIMON
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfaces
Franck SIMON
 
Java 8 - DateTime
Java 8 - DateTimeJava 8 - DateTime
Java 8 - DateTime
Franck SIMON
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
Franck SIMON
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
Franck SIMON
 
Description d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumDescription d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimum
Franck SIMON
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd training
Franck SIMON
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
Franck SIMON
 
JBoss - chapitre JMX
JBoss - chapitre JMXJBoss - chapitre JMX
JBoss - chapitre JMX
Franck SIMON
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
Franck SIMON
 
Android Input Method Editor
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method Editor
Franck SIMON
 
Squid
SquidSquid
Architectures distribuées
Architectures distribuéesArchitectures distribuées
Architectures distribuées
Franck SIMON
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
Franck SIMON
 
jQuery
jQueryjQuery
jQuery
Franck SIMON
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
Franck SIMON
 

Plus de Franck SIMON (18)

Distribuer une librairie via maven
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via maven
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
 
Java 8 - lambda
Java 8 - lambdaJava 8 - lambda
Java 8 - lambda
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfaces
 
Java 8 - DateTime
Java 8 - DateTimeJava 8 - DateTime
Java 8 - DateTime
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Description d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumDescription d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimum
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd training
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
JBoss - chapitre JMX
JBoss - chapitre JMXJBoss - chapitre JMX
JBoss - chapitre JMX
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 
Android Input Method Editor
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method Editor
 
Squid
SquidSquid
Squid
 
Architectures distribuées
Architectures distribuéesArchitectures distribuées
Architectures distribuées
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
 
jQuery
jQueryjQuery
jQuery
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
 

Dernier

Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
mrelmejri
 
Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024
Friends of African Village Libraries
 
Iris et les hommes.pptx
Iris      et         les      hommes.pptxIris      et         les      hommes.pptx
Iris et les hommes.pptx
Txaruka
 
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La JeunesseConseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Oscar Smith
 
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
SYLLABUS DU COURS  MARKETING DTS 1-2.pdfSYLLABUS DU COURS  MARKETING DTS 1-2.pdf
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
Moukagni Evrard
 
Mémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et auditMémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et audit
MelDjobo
 
Iris van Herpen. pptx
Iris            van        Herpen.     pptxIris            van        Herpen.     pptx
Iris van Herpen. pptx
Txaruka
 
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupeCours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
Yuma91
 
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
IES Turina/Rodrigo/Itaca/Palomeras
 
Edito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdfEdito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdf
WarlockeTamagafk
 
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
cristionobedi
 
Système de gestion des fichiers de amine
Système de gestion des fichiers de amineSystème de gestion des fichiers de amine
Système de gestion des fichiers de amine
sewawillis
 
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Formation
 

Dernier (13)

Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
 
Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024
 
Iris et les hommes.pptx
Iris      et         les      hommes.pptxIris      et         les      hommes.pptx
Iris et les hommes.pptx
 
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La JeunesseConseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
 
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
SYLLABUS DU COURS  MARKETING DTS 1-2.pdfSYLLABUS DU COURS  MARKETING DTS 1-2.pdf
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
 
Mémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et auditMémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et audit
 
Iris van Herpen. pptx
Iris            van        Herpen.     pptxIris            van        Herpen.     pptx
Iris van Herpen. pptx
 
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupeCours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
 
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
 
Edito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdfEdito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdf
 
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
 
Système de gestion des fichiers de amine
Système de gestion des fichiers de amineSystème de gestion des fichiers de amine
Système de gestion des fichiers de amine
 
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
 

Développement Android

  • 2. antislashn.org Android - Objectifs 0 - 2/7 Objectifs ● Présenter la plateforme Android ● Utiliser l'environnement de développement Android avec Eclipse ● Présenter les composants d'une application Android ● Créer une application Android ● Présenter certaines fonctionnalités avancées de la plateforme Android
  • 3. antislashn.org Android - Objectifs 0 - 3/7 Chapitres 1.Présentation de la plateforme 2.Les outils de développement 3."Hello, world" expliqué 4.Architecture et développement d'une application 5.Composants graphiques de base 6.Les intentions 7.Les activités 8.ListView 9.Autres composants graphiques 10.Les menus
  • 4. antislashn.org Android - Objectifs 0 - 4/7 Chapitres 11.Les notifications 12.Persistance de données 13.Les services 14.Les fournisseurs de contenu 15.Le BroadcastReceiver 16.Les processus et threads 17.Les applications widgets 18.Les fragments 19.Graphisme 20.Gestion de équipements 21.Géolocalisation et Google Map
  • 5. antislashn.org Android - Objectifs 0 - 5/7 Annexes A.Publier avec Google Play B.Développer en code natif : le NDK C.Input Method Editor D.Persistance avec OrmLite
  • 6. antislashn.org Android - Objectifs 0 - 6/7 copyleft Support de formation créé par Franck SIMON http://www.franck-simon.com
  • 7. antislashn.org Android - Objectifs 0 - 7/7 copyleft Cette œuvre est mise à disposition sous licence Attribution Pas d'Utilisation Commerciale Partage dans les Mêmes Conditions 3.0 France. Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-sa/3.0/fr/ ou écrivez à Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
  • 8. antislashn.org Android - Présentation de la plateforme 1 - 1/15 Présentation de la plateforme Android
  • 9. antislashn.org Android - Présentation de la plateforme 1 - 2/15 Matériels sous Android
  • 10. antislashn.org Android - Présentation de la plateforme 1 - 3/15 Généralités ● Android est issu du travail d'une startup ● racheté par Google en 2005 ● Création le 7 Novembre 2007 de l'OHA ● Open Handset Alliance ● consortium créé par Google réunissant des acteurs du marché de la mobilité – constructeurs, opérateurs en téléphonie, éditeurs de logiciels ● annonce officielle de la plateforme Android le même jour ● sortie du premier SDK le 12 Novembre 2007
  • 11. antislashn.org Android - Présentation de la plateforme 1 - 4/15 Généralités ● Le source du SDK est mis à disposition sous licence Apache 2.0 ● le 21 Octobre 2008 ● lien : http://source.android.com/ ● Android Market est lancé en Novembre 2008 ● lien : https://market.android.com ● Octobre 2008 : sortie du premier samrtphone Android aux Etats-Unis ● Mars 2009 en France ● 2009 : premières tablettes Android ● vrai succès à partir de début 2011, avec la version Android 3.0
  • 12. antislashn.org Android - Présentation de la plateforme 1 - 5/15 Présentation de la plateforme ● Principales caractéristique ● environnement de développement complet – émulateur de téléphone, outils de débogage, mesure des performances, … ● framework applicatif ● machine virtuelle Dalvik – optimisée pour les appareils nomades ● navigateur intégré – WebKit ● graphisme 2D et 3D ● base de données SQLite ● CODEC audio et vidéo (MPEG4, MP3, AAC, PNG, …) ● options matérielles : téléphonie GSM, caméra, GPS, accéléromètre, boussole, EDGE, Wifi, Bluetooth, …
  • 13. antislashn.org Android - Présentation de la plateforme 1 - 6/15 Présentation de la plateforme
  • 14. antislashn.org Android - Présentation de la plateforme 1 - 7/15 Application Android ● Langage de développement : Java ● attention, toutes les classes du JDK ne sont pas disponibles – Swing par exemple ● possibilité d'utiliser du C pour certaines parties critiques – utilisation du NDK (Native Development Kit) ● Les outils du SDK compilent le code Java et les ressources associées ● création d'un fichier .apk qui contient toute l'application et ses ressources – c'est ce fichier qui sera installé sur la plateforme Android ● Toutes les applications Android ont les même droits ● même pied d'égalité que les applications natives
  • 15. antislashn.org Android - Présentation de la plateforme 1 - 8/15 Application Android ● Une fois installée, une application Android est exécutée au sein d'un sandbox ● Le système d'exploitation Android est basé sur Linux ● une application Android est un utilisateur du système d'exploitation ● chaque application reçoit par défaut un identifiant unique – user ID, seulement connu par Linux, pas par l'application – l'OS positionne les permissions sur les fichiers de l'application afin que seule celle- ci puisse les utiliser ● une application est exécutée dans sa propre VM (Virtual Machine) ● par défaut une application est exécutée dans un process Linux – le process est démarré par Android si un composant de l'application doit être exécuté – le process est tué lorsque l'application se termine ou si d'autres applications ont besoin de mémoire
  • 16. antislashn.org Android - Présentation de la plateforme 1 - 9/15 Application Android ● Il existe 4 types de composant applicatif ● dont les objectifs et cycles de vie sont différents ● activité (activity) : interface graphique pour l'utilisateur – classe Activity ● service (service) : composant exécuté en tâche de fond, sans interface graphique – exemple : écoute de musique – classe Service ● fournisseur de données (content provider) : gère et partage des données applicatives – exemple : les contacts – classe ContentProvider ● récepteur broadcast (broadcast receiver) : réagit à des messages, systèmes ou applicatifs – mise hors tension, baterie faible, … – classe BrodcastReceiver
  • 17. antislashn.org Android - Présentation de la plateforme 1 - 10/15 Application Android ● Une application Android n'a accès qu'à ses propres ressources ● politique "principe of least privilege" ● environnement sécurisé qui interdit à l'application d'utiliser le système sans en avoir la permission ● Il est possible de donner le même user ID à plusieurs applications ● les applications sont exécutées dans le même process Linux ● les application partage la même VM ● permet de partager des ressources ● Une application doit posséder les permissions adéquats pour accéder aux composants du système ● liste des contacts, APN (Appareil Photo Numérique), SMS, ...
  • 18. antislashn.org Android - Présentation de la plateforme 1 - 11/15 Versions Android et SDK ● Le système Android évolue très vite ● ce qui est une marque de dynamisme ● ce qui provoque une fragmentation importante des plateformes ● nécessite un développement basé sur une version minimale répandue ● Pour les développeurs, Google met à disposition un SDK (Software Development Kit) ● lien : http://developer.android.com/sdk/index.html ● En plus du SDK il existe des bibliothèques tiers ● leur support n'est pas obligatoire par les intégrateurs ● exemples : API Google, Samsung, LG, ...
  • 19. antislashn.org Android - Présentation de la plateforme 1 - 12/15 Versions Android et SDK ● La version 1.0 est sortie en septembre 2008 ● c'est la version 1.1 qui fut commercialisée en France – sortie en Février 2009 ● Passage direct à la version 1.5 ● prise en charge de la détection de rotation, de l'accéléromètre, enregistrement vidéo, App Widgets ● La version 1.6 apporte le support de plusieurs résolutions ● Les versions 2 se sont succédées rapidement ● HTML5, Wifi, stockage externe, NFC, VoIP, SIP, … ● Étape importante : la version 3, conçue spécifiquement pour les tablettes
  • 20. antislashn.org Android - Présentation de la plateforme 1 - 13/15 Versions Android et SDK ● Il coexistait deux branches de versions ● version 3 pour les tablettes – version 3.2 actuellement ● version 2 pour les smart phones – version 2.3.4 actuellement ● Depuis la version 4 ● fusion entre téléphones, tablettes et télévisions
  • 21. antislashn.org Android - Présentation de la plateforme 1 - 14/15 Historique des versions Plateforme Nom API Level Date Android 1.1 2 Android 1.5 Cupcake 3 Avril 2009 Android 1.6 Donet 4 Septembre 2009 Android 2.1 Eclair 7 Janvier 2010 Android 2.2 Froyo 8 Mai 2010 Android 2.3 Gingerbread 9 Décembre 2010 Android 3.0 Honeycomb 11 Janvier 2011 Android 4.0 Ice Cream Sandwich 14 Octobre 2011 Android 4.1 Jelly Bean 16 Juillet 2012 Android 4.4 KitKat 19 Octobre 2013 Android 5.0 L ????? 20 courant 2014
  • 22. antislashn.org Android - Présentation de la plateforme 1 - 15/15 Quelle cible choisir ? ● Google publie la répartition d'utilisation des versions ● informations collectées via Google Play – lien : http://developer.android.com/about/dashboards/index.html ● ici en date du 21/03/2014
  • 23. antislashn.org Android - Outils de développement 2 - 1/48 Outils de développement
  • 24. antislashn.org Android - Outils de développement 2 - 2/48 Outils du développeur ● Présentation des outils ● Eclipse avec ADT – ADT : Android Development Tools ● le SDK ● le SDK et AVD Manager – AVD : Android Virtual Device ● le ADB : Android Debug Bridge ● le DDMS : Dalvik Debug Monitor Server ● Android Studio : autre outil mis à disposition par Google, basé sur IntelliJ IDEA ● http://developer.android.com/sdk/index.html
  • 25. antislashn.org Android - Outils de développement 2 - 3/48 Installation du plugin ADT ● Prérequis ● JDK 1.6 installé ● Eclipse installé – la version pour le développement Java de base suffit ● Installer le SDK ● télécharger l'archive de démarrage – contient les outils de base, pas les APIS – http://developer.android.com/sdk/index.html ● décompresser l'archive dans un répertoire – nous y ferons référence sous l'appellation SDK_HOME
  • 26. antislashn.org Android - Outils de développement 2 - 4/48 Installation du plugin ADT ● Démarrer Eclipse ● Sélectionner l'installation de nouveaux plugins ● Help → Install New Software
  • 27. antislashn.org Android - Outils de développement 2 - 5/48 Installation du plugin ADT ● Cliquer sur le bouton Add de l'assistant d'installation ● Ajouter le repository ● remplir les deux champs – Name : ADT Plugin – Location : https://dl-ssl.google.com/android/eclipse/ – puis OK
  • 28. antislashn.org Android - Outils de développement 2 - 6/48 Installation du plugin ADT ● Une fois que les outils sont affichés ● sélectionner Select All – attention : il faut que CDT soit installé pour que le NDK puisse être installé ● cf annexe A ● puis Next
  • 29. antislashn.org Android - Outils de développement 2 - 7/48 Installation du plugin ADT ● Cliquer sur Next dans la fenêtre suivante ● Accepter les licences ● puis cliquer sur Finish
  • 30. antislashn.org Android - Outils de développement 2 - 8/48 Installation du plugin ADT ● Accepter l'alerte de sécurité ● Puis redémarrer Eclipse
  • 31. antislashn.org Android - Outils de développement 2 - 9/48 Installation du plugin ADT ● Au redémarrage la version du plugin est vérifié ● accepter l'éventuelle mise à niveau ● ou sélectionner le répertoire d'installation du plugin ● puis Finish
  • 32. antislashn.org Android - Outils de développement 2 - 10/48 Installation du plugin ADT ● Les plate-formes cibles ne sont pas installées ● une fenêtre peut le signaler ● Installation des API ● dans la barre d'outils sélectionner le "SDK Manager" ● Dans la fenêtre suivante, sélectionner les niveaux d'API souhaités
  • 33. antislashn.org Android - Outils de développement 2 - 11/48 Installation du plugin ADT ● Cliquer sur le bouton Install xx packages ● Accepter toutes les licences puis cliquer sur Install
  • 34. antislashn.org Android - Outils de développement 2 - 12/48 Installation du plugin ADT ● le téléchargement des plate-formes démarre ● cette étape peut être assez longue
  • 35. antislashn.org Android - Outils de développement 2 - 13/48 Le SDK ● Une fois l'installation terminée le répertoire d'installation du SDK comporte l'ensemble des outils, documentations, exemples, plateformes cibles ● L'installation étant relativement lente, ce répertoire peut être copier sur les autres machines
  • 36. antislashn.org Android - Outils de développement 2 - 14/48 Émulateur AVD ● AVD : Android Virtual Device ● émulateur de matériel ● complètement configurable ● Avant d'utiliser un émulateur il faut le créer
  • 37. antislashn.org Android - Outils de développement 2 - 15/48 Émulateur AVD ● L'émulateur Android peut être lancé ● via Eclipse ● via la ligne de commande
  • 38. antislashn.org Android - Outils de développement 2 - 16/48 Émulateur AVD ● L'émulateur se comporte (presque) comme un téléphone ● possibilité de changer les réglages de base – langue, format date et heure, … ● d'ajouter des contacts ● de supprimer des applications ● de recevoir des SMS et des appels téléphoniques – depuis l'onglet "Emulator Control" – depuis un autre émulateur ● en précisant le numéro d'écoute de l'émulateur au lieu d'un numéro de téléphone
  • 39. antislashn.org Android - Outils de développement 2 - 17/48 Émulateur AVD ● Ligne de commande ● dans le répertoire tools ● emulator -avd <avd_name> [-<option> [<value>]] … – exemple : emulator -avd Samsung_S ● documentation des options de la ligne de commande – http://developer.android.com/tools/help/emulator.html ● Utilisation de l'émulateur derrière un proxy ● en ligne de commande ajouter l'option – -http-proxy <proxy> ● le proxy peut-être réglé dans l'émulateur lui-même
  • 40. antislashn.org Android - Outils de développement 2 - 18/48 Émulateur AVD ● Réglage du proxy dans l'émulateur ● Applications … Paramètres … Sans fils et réseaux – Réseaux mobiles ... Nom des points d'accès … TelKila
  • 41. antislashn.org Android - Outils de développement 2 - 19/48 Émulateur AVD ● L'émulateur peut être contrôlé ● par le clavier du PC pour certaines opérations – Ctrl-F11 et Ctrl-F12 pour le mode portrait / paysage par exemple – l'ensemble des raccourcis est disponible à ● http://developer.android.com/tools/help/emulator.html ● par la vue "Emulator Control" dans Eclipse
  • 42. antislashn.org Android - Outils de développement 2 - 20/48 Outil adb ● adb : Android Debug Bridge ● Permet de se connecter sur l'émulateur ● ou sur un téléphone réel connecté en mode debug ● Programme articulé autour de 3 composants ● un client exécuté sur la machine de développement – lancé par la console ou le plugin ADT ● un serveur qui s'exécute en arrière plan sur la machine de développement ● un démon exécuté sur chaque émulateur
  • 43. antislashn.org Android - Outils de développement 2 - 21/48 Outil adb ● Le serveur maintient un client adb liée à un démon adb ● émulateur 1 en 5554, client adb 1 en 5555 ● émulateur 2 en 5556, client adb 1 en 5557 ● adb permet ● de connaître la liste des émulateur ● d'installer des applications ● adb emulator-5556 install hello.apk ● de copier des fichiers vers/depuis l'émulateur ● d'exécuter des commandes shell sur l'émulateur – se connecter à la base de données SQL par exemple
  • 44. antislashn.org Android - Outils de développement 2 - 22/48 Outil adb ● Quelques commandes adb ● adb start-server – démarre le serveur adb s'il ne l'est pas – eclipse peut être configuré pour utiliser un serveur externe ● adb kill-server – arrête le serveur ● adb devices – liste les matériels et émulateurs attachés
  • 45. antislashn.org Android - Outils de développement 2 - 23/48 Outil adb ● Quelques commandes adb ● adb [-d | -e | -s <serialNumber>] command – envoie d'une commande adb ● -d : vers le seul matériel connecté ● -e : vers le seul émulateur connecté ● -s <serialNumber> : vers un matériel ou émulateur connecté ● command : une commande adb ● si un seul matériel ou émulateur est connecté -d, -e ou -s peut être omis ● adb -e shell – passage en mode shell ● ici sur le seul émulateur connecté
  • 46. antislashn.org Android - Outils de développement 2 - 24/48 DDMS ● Dalvik Debug Monitor Server ● outil de debug ● Intégré à Eclipse ● perspective DDMS ● Ligne de commande ● tools/ddms
  • 47. antislashn.org Android - Outils de développement 2 - 25/48 DDMS ● DDMS permet ● de suivre l'utilisation du tas ● de suivre les allocations d'objets et mémoire ● de travailler sur le système de fichier de l'émulateur ● de voir les threads executés sur l'émulateur ● d'effectuer du profiling de méthode – nombre d'appels, temps d'exécution, … ● Debug.startMethodTracing() et Debug.stopMethodTracing() – à partir d'Android 2.1 ● 2.1 : doit avoir une carte SD et la permission d'écriture sur la carte SD ● à partir de 2.2 : plus de SD nécessaire, les traces de logs sont envoyés vers l'environnement de développement
  • 48. antislashn.org Android - Outils de développement 2 - 26/48 DDMS ● Vue File Explorer mouvements de fichiers entre l'équipement et le PC suppression et ajout dans le système de fichier de l'équipement
  • 49. antislashn.org Android - Outils de développement 2 - 27/48 DDMS ● Vue des threads actifs ● il faut d'abord lancer la capture thread de l'application thread du garbage collector thread dédié à la réception des signaux Linux threads systèmes ● ID : identifiant du thread dans la VM ● Tid : identifiant du thread Linux ● Status ● running, sleeping, monitor, wait, native, vmwaait, zombie, init, starting ● * si deamon ● utime : durée cumulée de l'exécution du code utilisateur (en "jiffies", 10ms) ● stime : durée cumulée de l'exécution du code système (en "jiffies", 10ms) ● Name : nom du thread
  • 50. antislashn.org Android - Outils de développement 2 - 28/48 DDMS ● Vue Emulator Control ● envoi de SMS ● émulation d'appel téléphonique ● envoi de points de géolocalisation
  • 51. antislashn.org Android - Outils de développement 2 - 29/48 DDMS ● DDMS permet aussi d'interagir avec l'émulateur ● envoi de SMS ● émulation d'appel téléphonique vers un émulateur ● mise à jour de la géolocalisation du téléphone – manuellement ou par fichier ● GPX : GPS eXchange file ● KML : Keyhole Markup Language
  • 52. antislashn.org Android - Outils de développement 2 - 30/48 Débogage ● Le débogage sous Eclipse est effectué de manière classique ● par utilisation de traces dans les sources – classe Log ● par mise en place de points d'arrêts – lancer alors l'application en mode debug
  • 53. antislashn.org Android - Outils de développement 2 - 31/48 Gestion des logs ● L’outil logcat permet de visualiser les logs du système de logs Android ● logcat est utilisable via adb ou DDMS ● Par défaut les logs sont dirigés vers /dev/log/main ● deux autres journaux de logs existent – /dev/log/radio pour les activité réseau et téléphone – /dev/log/events pour les événements système ● Les sorties vers les flux out et err sont redirigés vers /dev/null ● utilisation de System.out ou System.err
  • 54. antislashn.org Android - Outils de développement 2 - 32/48 Gestion des logs source : elinux.org/Android_Logging_System
  • 55. antislashn.org Android - Outils de développement 2 - 33/48 Gestion des logs ● Classe Log ● ne comporte que des méthodes statiques ● signatures des méthodes raccourci ● d(...) pour DEBUG, e(...) pour ERROR – static int method(String tag, String msg) – static int method(String tag, String msg, Throwable tr) ● tag : identificateur du message ● msg : message ● tr : exception ● méthode générique – static int println(int priority, String tag, String msg) ● priority : DEBUG, ERROR, etc.
  • 56. antislashn.org Android - Outils de développement 2 - 34/48 Gestion des logs ● Niveaux de log ● VERBOSE – méthode Log.v(...) ● DEBUG – méthode Log.d(...) ● INFO – méthode Log.i(...) ● WARN – méthode Log.w(...) ● ERROR – méthode Log.e(...) ● ASSERT ● méthode Log.wtf(...) – "What a Terrible Failure" : erreur ne devant jamais arriver
  • 57. antislashn.org Android - Outils de développement 2 - 35/48 Gestion des logs ● Tag d'identification ● souvent le nom de la classe ● bonne pratique : déclarer une constante dans la classe private static final String tag = SensorListActivity.class.getCanonicalName();
  • 58. antislashn.org Android - Outils de développement 2 - 36/48 Documentation de référence ● Disponible en ou hors connexion ● sur internet :http://developer.android.com/reference/packages.html ● dans le répertoire doc du SDK
  • 59. antislashn.org Android - Outils de développement 2 - 37/48 Documentation de référence ● Possibilité de tri par classe ● Champ de recherche
  • 60. antislashn.org Android - Outils de développement 2 - 38/48 Documentation de référence ● Niveau d'API à partir de laquelle la classe peut-être utilisée
  • 61. antislashn.org Android - Outils de développement 2 - 39/48 Développer sur un équipement réel ● La plupart des équipement tournant sous Android peuvent être utilisés pour tester et déboguer une application ● certains fabricants bride le support sur leur matériel – Archos, autres ??? – voir sur le site du fabricant pour la procédure à suivre ● http://www.archos.com/support/support_tech/updates_adb.html?country=fr&lang=fr ● Configuration du développement sur le matériel ● l'application doit être déclarée comme "débogable" – dans l'élément <application>, ajouter l'attribut android:debuggable="true" ● le téléphone doit être configuré en mode USB Debugging
  • 62. antislashn.org Android - Outils de développement 2 - 40/48 Développer sur un équipement réel ● L'activation du mode développeur dépend du niveau d'API ● < Android 4 – l'activation du mode développeur se trouve dans la gestion des applications ● < Android 4.2 – entrée "Options pour les développeurs" dans les paramètres ● > Android 4.2 – le menu "Options pour les développeurs" doit être activée ● taper 7 fois sur l'item "Numéro de build" du menu "A propos du téléphone" ● le mode développeur est alors activé, et l'entrée "Options pour les développeurs" est affichée
  • 63. antislashn.org Android - Outils de développement 2 - 41/48 Développer sur un équipement réel ● Passage en mode USB debugging sur Android 1.x et 2.x ● Settings → Applications → Development
  • 64. antislashn.org Android - Outils de développement 2 - 42/48 Développer sur un équipement réel ● Passage en mode USB debugging sur Android 1.x et 2.x ● puis activer le débogage USB
  • 65. antislashn.org Android - Outils de développement 2 - 43/48 Développer sur un équipement réel ● Passage en mode USB debugging sur Android 3.0 ● Settings → Applications → Development
  • 66. antislashn.org Android - Outils de développement 2 - 44/48 Développer sur un équipement réel ● Passage en mode USB debugging sur Android 3.x ● puis activer le debogage USB
  • 67. antislashn.org Android - Outils de développement 2 - 45/48 Développer sur un équipement réel ● Passage en mode USB debugging sur Android 4.x ● Settings → Developer options ● attention depuis Android 4.2 l'entrée est cachée – l'activation est effectuée en tapant 7 fois sur le numéro de build du téléphone
  • 68. antislashn.org Android - Outils de développement 2 - 46/48 Développer sur un équipement réel ● Passage en mode USB debugging sur Android 4.x ● puis activer le débogage USB ● De très nombreux outils sont disponibles pour aider le développeur
  • 69. antislashn.org Android - Outils de développement 2 - 47/48 Développer sur un équipement réel ● Paramétrer le poste de développement ● Windows – installer le driver USB du matériel – ce driver est fourni par le constructeur – cf : http://developer.android.com/tools/extras/oem-usb.html ● Mac, CentOS – rien à faire ● Ubuntu – ajouter une règle au fichier /etc/udev/rules.d/51-android.rules ● SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev" ● où {idevendor} correspond à un identifiant – http://developer.android.com/tools/device.html ● exécuter – chmod a+r /etc/udev/rules.d/51-android.rules
  • 70. antislashn.org Android - Outils de développement 2 - 48/48 Développer sur un équipement réel ● Déboguer via le Wifi ● les appareils ne possédant qu'un seul port USB il est parfois nécessaire de déboguer via le réseau WIFI ● étapes à suivre – activer le WIFI ● récupérer l'adresse TCP IP du matériel dans les propriétés WIFI – connecter le matériel en USB – vérifier que le débogage fonctionne bien mode USB – lancer la commande : adb tcpip 5555 – puis lancer : adb connect <ip_matériel>:5555 – pour revenir au mode usb : adb usb
  • 71. antislashn.org Android - Hello, world 3 - 1/20 Application Hello, world
  • 72. antislashn.org Android - Hello, world 3 - 2/20 "Hello, world" ● création du projet ● liaison avec l'architecture de l'application ● Activity ● fichier de AndroidManifest.xml ● utilisation d'un émulateur
  • 73. antislashn.org Android - Hello, world 3 - 3/20 "Hello, world" ● Création du projet ● File...New...Project ● la fenêtre de choix de projet s'affiche – choisir un nouveau projet Android
  • 74. antislashn.org Android - Hello, world 3 - 4/20 "Hello, world" ● L'assistant de création de projet s'affiche ● donner un nom au projet, puis Next
  • 75. antislashn.org Android - Hello, world 3 - 5/20 "Hello, world" ● Dans l'écran suivant choisir le SDK cible ● ici le SDK version 1.6, puis Next
  • 76. antislashn.org Android - Hello, world 3 - 6/20 "Hello, world" ● Donner un nom à l'application, et choisir un package
  • 77. antislashn.org Android - Hello, world 3 - 7/20 "Hello, world" sources de notre application activité (écran) de l'application répertoire où sont déposés les ressources générées fichier R.java généré par les outils Android bibliothèques du SDK cible répertoire des ressources fichier de configuration de l'application répertoire des données brutes : MP3, ... propriétés du projet
  • 78. antislashn.org Android - Hello, world 3 - 8/20 "Hello, world" ● Certains fichiers sont maintenus par le plugin ADT ● il ne faut pas les éditer, ils sont mis à jour automatiquement – R.java – default.properties ● Les ressources contenues dans le répertoire res peuvent être modifiées lors la compilation ● pour optimisation ● se retrouvent dans les ressources R.java ● Les ressources du répertoire assets ne sont pas impactées par la compilation ● possibilité de les lire en tant que flux d'octets
  • 79. antislashn.org Android - Hello, world 3 - 9/20 "Hello, world" ● Pour exécuter l'application sélectionner le projet ● puis avec un click droit, sélectionner – Run As … Android Application ● Si un émulateur est configuré il est automatiquement chargé ● l'application est lancée ● si aucun émulateur n'est configuré l'écran de gestion des émulateurs est affichée ● si plusieurs émulateurs sont configurés, en choisir un ● Une fois l'émulateur chargé il est préférable de ne pas le fermer
  • 80. antislashn.org Android - Hello, world 3 - 10/20 Ressources de l'application ● Les ressources sont des données utilisables par l'application ● elles sont intégrées au binaire de l'application ● res/anim : animations de transition au format XML ● res/color : couleurs définis dans des fichiers XML ● res/drawable : images, plusieurs densités d'écran sont disponibles (hdpi, mdpi et ldpi) ● des ressources images peuvent être spécifiées pour une configuration matérielle et/ou logicielle précise, le nom du dossier de ressource est alors complété par des qualificatifs séparés par des traits d'union – largeur d'écran, orientation de l'écran, langue système, ... ● res/layout : interfaces graphiques ● res/values : valeurs utilisées par l'application ● les valeurs sont définies dans un fichier XML
  • 81. antislashn.org Android - Hello, world 3 - 11/20 Ressources de l'application ● Chaque ressource du dossier res possède un identifiant entier unique ● permet d'atteindre depuis le code Java, ou XML, une ressource – cette valeur peut changer au grès des ajouts et suppression de ressources ● pour éviter le codage en dur de ces valeur, des constantes sont créées dans une classe R.java public final class R { public static final class attr { } public static final class drawable { public static final int ic_launcher=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } }
  • 82. antislashn.org Android - Hello, world 3 - 12/20 Ressources de l'application ● Le nom complet de la constante est composé : ● du nom du package – facultatif car il s'agit du package courant ● du type de ressource – correspond au sous dossier res ● du nom de la ressource – pour les ressources situées dans res/values, le nom est celui défini dans le fichier xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, HelloActivity!</string> <string name="app_name">Hello</string> </resources>
  • 83. antislashn.org Android - Hello, world 3 - 13/20 Ressources de l'application ● syntaxe Java pour accéder à une ressource : [package.]R.type.nom R.string.app_name ● syntaxe XML pour accéder à une ressource : @[package:]type/nom @string/app_name
  • 84. antislashn.org Android - Hello, world 3 - 14/20 Structure de l'application "Hello, world" ● Le fichier AndroidManifest.xml ● contient la configuration principale de l'application – composants applicatifs, point d'entrée principal, sécurité et droits, etc. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.antislashn.android.hello" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".HelloActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
  • 85. antislashn.org Android - Hello, world 3 - 15/20 "Hello, world" - AndroidManifest.xml ● Les balises et attributs de ce fichier XML sont très nombreux ● beaucoup sont facultatifs ● Certains seront détaillées au cours de cette formation ● au fur et à mesure de leur utilisation ● Balise racine : manifest ● attributs – package : package de l'application – versionCode : version de l'application (numérique) – versionName : version de l'application (string)
  • 86. antislashn.org Android - Hello, world 3 - 16/20 "Hello, world" - AndroidManifest.xml ● Balise uses-sdk ● indique les versions de SDK pour que l'application puisse être exécutée ● attributs – minSdkVersion : niveau minimum pour que l'application puisse être utilisée – targetSdkVersion : niveau de l'API utilisé lors du développement – utilisé par Android pour ajouter si nécessaire des mécanismes de compatibilité : thèmes graphiques, densité écran, ...
  • 87. antislashn.org Android - Hello, world 3 - 17/20 "Hello, world" - AndroidManifest.xml ● Balise application ● informations sur l'application ● attributs – icon : icône de l'application ● valeur : @drawable/ic_launcher qui référencie la ressource ic_launcher.png située dans un des répertoire res/drawable, en fonction de la densité d'écran – label : titre de l'application – il est préférable d'utiliser des références à des ressources plutôt qu'une chaine de caractères ● valeur : @strinf/app_name qui référencie la ressource de type string contenue dans le fichier res/values/string.xml ● application contient des balises enfants
  • 88. antislashn.org Android - Hello, world 3 - 18/20 "Hello, world" - AndroidManifest.xml ● Balises filles ● elles seront vues en détails lors des prochains chapitres ● activity – défini une activité (écran) – l'activité est lancée par une intention (intent) ● service – défini un service ● provider – défini un fournisseur de données ● reicever – défini un récepteur de messages ● uses-library – librairies utilisées
  • 89. antislashn.org Android - Hello, world 3 - 19/20 "Hello, world" - activity ● Le nom (attribut name) de l'activité (balise activity) référencie la classe HelloActivity ● préfixée par le point, car appartenant au package courant – la méthode onCreate(...) est le point d'entrée de l'application ● invoque la méthode onCreate() de la classe mère ● charge l'écran de l'activité public class HelloActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
  • 90. antislashn.org Android - Hello, world 3 - 20/20 "Hello, world" - IHM ● L'écran de l'application est décrite dans un fichier XML ● ici le fichier res/layout/main.xml <?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:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> gestionnaire de positionnement composant de type texte ressource définie dans res/values/string.xml
  • 91. antislashn.org Android - architecture et développement 4 - 1/17 Application Android architecture et développement
  • 92. antislashn.org Android - architecture et développement 4 - 2/17 Cycle de développement ● création du projet ● codage ● compilation ● effectuée en deux étape – java vers .class avec l'outil javac – .class vers .dex avec l'outil dx ● création de l'archive apk ● clé pour le développement
  • 93. antislashn.org Android - architecture et développement 4 - 3/17 Architecture d'une application ● Une application Android est constituée d'un ou plusieurs modules applicatifs : ● Activity : code de gestion d'une IHM ● Service : traitement exécuté en tâche de fond ● ContentProvider : exposition de données à d'autres applications ● BroadcastReceiver : récepteur de messages ● Les modules applicatifs communiquent entre eux par des messages ● de type Intent
  • 94. antislashn.org Android - architecture et développement 4 - 4/17 Architecture d'une application ● Le contexte applicatif est accessible par la classe Context ● les types Activity et Services dérivent de Context ● permet de lancer des intentions vers un autre composant – qui appartient à l'application ou non ● permet de récupérer les ressources de l'application – répertoire, base de données, ...
  • 95. antislashn.org Android - architecture et développement 4 - 5/17 Architecture d'une application ● La configuration de l'application est décrite dans le fichier AndroidManifest.xml ● nom de l'application ● icônes ● compatibilité : SDK, écrans, présence d'un clavier, ... ● déclaration des modules applicatifs ● déclarations des filtres de messages ● déclaration des permissions : utilisation GPS, internet, etc. ● classe d'instrumentation de l'application
  • 96. antislashn.org Android - architecture et développement 4 - 6/17 Architecture d'une application ● Fichier AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.antislashn.android.hello" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".HelloActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
  • 97. antislashn.org Android - architecture et développement 4 - 7/17 Les ressources ● Les ressources nécessaires à l'application sont intégrées dans le répertoire res du projet ● ses ressources seront compilées avec l'application ● un identifiant unique est associé à chacune des ressources – voir la classe générée R.java – un fichier ic_launcher.png placé dans un répertoire (ou sous-répertoire) de res/drawable sera utilisable par : ● R.drawable.ic_launcher en java ● @drawable/ic_launcher en XML
  • 98. antislashn.org Android - architecture et développement 4 - 8/17 Les données brutes ● Les données brutes (audio, vidéo, …) sont placées dans le répertoire assets ● la taille maximale autorisée est de 1 Mo – pour les fichiers compressé par APK (csv, txt,...) – pas pour les fichiers binaires (mp3, png, ...) ● elles sont accessible via un AssetManager – une instance d'AssetManager peut être récupérée par le Context ● méthode getAssets() – la méthode open(String fileName) renvoie un InputStream sur la ressource désirée
  • 99. antislashn.org Android - architecture et développement 4 - 9/17 Le bus de message ● Les différents modules applicatifs ne sont pas directement instanciés par le développeur ● Un bus de messages permet au système de choisir le composant à monter en mémoire ● les messages sont de type Intent ● les intentions décrivent quelle est l'opération qui devra être effectuée – plusieurs composants applicatifs peuvent répondre à un même Intent ● l'utilisateur aura alors le choix
  • 100. antislashn.org Android - architecture et développement 4 - 10/17 Le bus de messages ● Un message est principalement constitué ● d'une action – affichage, composition d'un numéro de téléphone, démarrage d'un module, ... ● d'une catégorie – informations supplémentaires pour l'action à mener ● préférences utilisateur, affichage dans les applications, … ● d'autres données : type MIME, composant à invoquer, données supplémentaires, URI
  • 101. antislashn.org Android - architecture et développement 4 - 11/17 Le bus de message ● Un composant décrit une configuration de messages auxquels il est susceptible de répondre ● dans le fichier AndroidManifest.xml ● balise <intent-filter> – exemple : point d'entrée d'un application <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
  • 102. antislashn.org Android - architecture et développement 4 - 12/17 Le bus de message Producteur Système Android Module applicatif Intent IntentResolver Application 2 Activité Activité IntentFilter IntentFilter Application 1 Activité Service IntentFilter IntentFilter Le composant dont le filtre d'intention correspond est activé
  • 103. antislashn.org Android - architecture et développement 4 - 13/17 Bonnes pratiques ● Le développement sous Android est différent d'un développement Java classique ● Il existe des bonnes pratiques liées à la plateforme Android ● codage ● ergonomie ● compatibilité entres matériels ● design
  • 104. antislashn.org Android - architecture et développement 4 - 14/17 Bonnes pratiques de codage ● Ne pas perdre de vue que l'application est exécutée sur une plateforme dont les ressources sont limitées ● Minimiser la création d'objets ● Ne pas utiliser les getteurs / setteurs au sein de la classe ● préférer la lecture ou l'affectation directe des propriétés ● Déclarer static les méthodes qui peuvent l'être ● Préférer les constantes plutôt que les énumération ● enum est une classe
  • 105. antislashn.org Android - architecture et développement 4 - 15/17 Bonnes pratiques d'ergonomie ● Souvent sans clavier et dispositif de pointage ● le doigt est utilisé sur l'écran ● Ne pas dessiner des widgets trop petits ● taille recommandée aux alentour de 9mm, soit 48dp – dp : density-independant pixels – http://developer.android.com/design/style/metrics-grids.html
  • 106. antislashn.org Android - architecture et développement 4 - 16/17 Bonnes pratiques d'ergonomie ● Utiliser le retour haptique et le changement de couleur des boutons ● attribut android:hapticFeedbackEnable ●
  • 107. antislashn.org Android - architecture et développement 4 - 17/17 Bonnes pratiques de design ● Les icônes de lancement d'applications font une taille de 48x48 dp ● les icônes de Play Store font 512 x 512 px ● Utiliser les icônes prédéfinies pour la barre d'action ● téléchargement : https://dl-ssl.google.com/android/design/Android_Design_Icons_20120229.zip
  • 108. antislashn.org Android - composants graphiques de base 5 - 1/56 Composants graphiques de base
  • 109. antislashn.org Android - composants graphiques de base 5 - 2/56 Les écrans Android ● En général, une application Android possède une interface utilisateur (IHM, GUI) ● La configuration matérielle exacte sur laquelle sera exécutée l'application n'est pas connue ● taille écran, densité, profondeur de couleur, … ● Caractéristiques d'un écran ● taille : diagonale de 6,5 cm à 30 cm – 1 pouce = 2,54 cm ● résolution – QVGA : 240 x 320 pixels – WXGA 16/9 : 1366 x 768 pixels – WXGA 16/10 : 1280 x 800 pixels
  • 110. antislashn.org Android - composants graphiques de base 5 - 3/56 Les barres système ● La barre d'état résume l'état du matériel et affiche certaines notifications ● La barre de navigation permet de naviguer entre les applications / pages / accueil source : Google
  • 111. antislashn.org Android - composants graphiques de base 5 - 4/56 Les écrans Android ● Les écrans Android sont classés en : ● petit (small) : diagonale de 2,5" ● normal (normal) : diagonale de 4" ● grand (large) : diagonale de 7" ● très grand (xlarge) : diagonale de 10" – depuis API 9 ● La résolution est exprimée en points par pouce ● dpi : dots per inch ● mesure la densité de pixels sur l'écran
  • 112. antislashn.org Android - composants graphiques de base 5 - 5/56 Les écrans Android ● La densité de pixels est classée en : ● faible (ldpi) : 120 dpi ● moyenne (mdpi) : 160 dpi ● haute (hdpi) : 240 dpi ● très haute (xhdpi) : 320 dpi – depuis API 8 ● Les caractéristiques d'un écran peuvent être récupérées via une instance de WindowManager DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); Log.d("WindowManagerActivity", "Density DPI : "+displayMetrics.densityDpi); Log.d("WindowManagerActivity", "Resolution X : "+displayMetrics.widthPixels); Log.d("WindowManagerActivity", "Resolution Y : "+displayMetrics.heightPixels);
  • 113. antislashn.org Android - composants graphiques de base 5 - 6/56 Les écrans Android ● Si les résolutions sont différentes pour une même taille d'écran les composants graphiques s'afficheront avec une taille différente ● Google préconise l'utilisation de l'unité dp – appelée aussi dip (density independent pixel) ● ne pas confondre avec dpi ● il existe aussi une métrique pour les polices de caractères : sp (ou sip pour scale independent pixel) ● Il existe aussi : ● px pour le pixel ● in pour inch ● mm pour millimètre
  • 114. antislashn.org Android - composants graphiques de base 5 - 7/56 Les écrans Android source : Google
  • 115. antislashn.org Android - composants graphiques de base 5 - 8/56 Les écrans Android ● Pour les images ● Android recherche d'abord une ressource correspondant à la densité utilisé par le matériel – dans res/drawable-hdpi, ldpi, mdpi ● sinon une ressource dans la densité la plus proche est utilisée et l'image est retaillée – ration 3 – 4 – 6 – 8 pour ldpi, mdpi, hdpi et xdpi – si une image existe en mdpi de 100x100 px ● un ratio 6/4 est utilisé pour un écran hdpi soit 150x150 px ● un ratio ¾ est utilisé pour un écran ldpi soit 75x75 px
  • 116. antislashn.org Android - composants graphiques de base 5 - 9/56 Les écrans Android ● Balise support-screens ● depuis Android 1.6 (level 4) ● balise fille de la balise manifest ● permet d'indiquer les écrans supportés au système et Android Market <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  • 117. antislashn.org Android - composants graphiques de base 5 - 10/56 Interface graphique ● Les interfaces graphiques sont réalisées dans une activité (activity) ou un fragment (fragment) ● un écran peut alors être composé de plusieurs fragments ● sera vu plus tard ● La réalisation de l'IHM peut être faite de manière ● programmée : les composants graphiques sont créés par le code Java et ajoutés à la vue – permet de générer une vue dynamiquement ● déclarée : dans des fichiers XML – séparation du code de la présentation ● les deux modes peuvent être utilisés – manipulation en java des composants déclarés en XML
  • 118. antislashn.org Android - composants graphiques de base 5 - 11/56 Interface graphique ● Eclispe : plugin ADT ● permet de créer la vue via un éditeur XML ou par l'éditeur graphique (Graphical Layout)
  • 119. antislashn.org Android - composants graphiques de base 5 - 12/56 Hiérarchie des composants graphiques ● les fragments ● les vues ● les gestionnaires de placement ● layout manager ● arbre des composants graphiques
  • 120. antislashn.org Android - composants graphiques de base 5 - 13/56 Hiérarchie des composants graphiques ● La vue est l'élément de base de l'IHM ● classe View – tous les composants graphiques héritent de cette classe – les classes ViewGroup contiennent plusieurs composants graphiques ● pattern Composite
  • 121. antislashn.org Android - composants graphiques de base 5 - 14/56 Hiérarchie des composants graphiques ● Principaux attributs XML des View ● background : fond de la vue (couleur, image) ● clickable : indique si réaction aux clics ● id : identifiant unique de la vue ● minHeight et minWidth : hauteur et largeur minimales ● onClick : méthode à invoquer lors d'un clic ● padding : dimension de la marge interne pour les 4 côté de la vue – cf paddingBottom, paddingLeft, paddingRight, paddingTop ● tag : associe un objet au composant ● visibility : indique si le composant est visible ou non
  • 122. antislashn.org Android - composants graphiques de base 5 - 15/56 Les layouts ● Les layouts sont de type ViewGroup ● conteneurs de composants graphiques ● gèrent le placement des composants ● chaque layout offre une structure de positionnement qui lui est propre ● Attributs XML obligatoires ● layout_width et layout_heigth : largeur et hauteur – valeurs possibles ● fill_parent : remplit l'espace du conteneur parent, moins la marge ● wrap_content : se dimensionne en fonction du contenu du composant ● match_parent : est remplacé par fill_parent depuis la version 8 du SDK ● une valeur en dip, px, mm, in, ...
  • 123. antislashn.org Android - composants graphiques de base 5 - 16/56 Les layouts ● Divers propriétés sont disponibles sur les layouts pour paramétrer l'affichage ● voir en fonction des layouts ● Il faut penser en terme ● d'orientation ● modèle de remplissage ● poids ● gravité ● remplissage
  • 124. antislashn.org Android - composants graphiques de base 5 - 17/56 Les layouts ● Orientation (android:orientation) ● des layouts, comme LinearLayout, présentent les widgets en ligne ou en colonne ● l'orientation peut-être modifiée en cours d'exécution avec setOrientation(...) ● Poids (android:layout_weigth) ● comment deux widgets se partagent l'espace disponible ? ● layout_weigth indique la proportion par widget – si 1 pour deux widgets l'espace libre est divisé en 2 – si 1 pour un widget, et 2 pour le second, le second utilisera deux fois moins d'espaces que le premier
  • 125. antislashn.org Android - composants graphiques de base 5 - 18/56 Les layouts ● Modèle de remplissage ● les widgets ont une taille "naturelle" qui repose sur le texte affiché – que faire de l'espace restant ? ● les widgets peuvent fournir une valeur pour layout_width et layout_height – la valeur peut être ● une dimension précise : 120 dp ● wrap_content pour que le widget occupe sa place naturelle ● fill_parent pour que le widget occupe toute la place disponible
  • 126. antislashn.org Android - composants graphiques de base 5 - 19/56 CONTENEUR Les widgets de base ● Positionnement des widgets WIDGET top padding layout_margin left width height
  • 127. antislashn.org Android - composants graphiques de base 5 - 20/56 Les layouts ● Gravité ● layout_gravity gère le placement du widget dans le layout – indique au conteneur et au widget comment l'alignement doit être effectué ● gravity gère le placement du texte dans le widget ● Remplissage ● les widgets sont par défaut serrés les uns contre les autres – padding gère les 4 zones – paddingTop, paddingBottom, paddingLeft, paddingRight gèrent le remplissage zone par zone
  • 128. antislashn.org Android - composants graphiques de base 5 - 21/56 Les layouts ● Positions relatives par rapport à un conteneur ● layout_alignParentTop : haut du widget aligné avec celui du conteneur ● layout_alignParentBottom : bas du widget aligné avec celui du conteneur ● layout_alignParentLeft : bord gauche du widget aligné avec celui du conteneur ● layout_alignParentRigth : bord droit du widget aligné avec celui du conteneur ● layout_alignCenterHorizontal : widget centré horizontalement ● layout_alignCenterVertical : widget centré verticalement
  • 129. antislashn.org Android - composants graphiques de base 5 - 22/56 Les layouts ● Position relative des widgets ● attribuer un identifiant à tous les widgets devant être désignés (par @+id/... ) ● désigner un widget dans un autre avec son identifiant (avec @id/... ) ● le contrôle du placement d'un widget par rapport à un autre est effectué par : – android:layout_above le widget doit être placé au-dessus de celui qu'il désigne – android:layout_below le widget doit être placé sous celui qu'il désigne – android:layout_toLeftOf le widget doit être placé à gauche de celui qu'il désigne – android:layout_toRightOf le widget doit être placé à droite de celui qu'il désigne
  • 130. antislashn.org Android - composants graphiques de base 5 - 23/56 Les layouts ● Alignement d'un widget par rapport à un autre ● android:layout_alignTop le haut du widget est aligné avec le haut du widget désigné ● android:layout_alignBottom le bas du widget est aligné avec le bas du widget désigné ● android:layout_alignLeft le bord gauche du widget est aligné avec le bord gauche du widget désigné ● android:layout_alignRight le bord droit du widget est aligné avec le bord droit du widget désigné ● android:layout_alignLBaseLine les lignes de base des deux widgets doivent être alignées
  • 131. antislashn.org Android - composants graphiques de base 5 - 24/56 Les layouts ● Le plugin ADT simplifie la mise en place des layouts ● affiche le résultat
  • 132. antislashn.org Android - composants graphiques de base 5 - 25/56 FrameLayout ● Le plus simple des conteneurs ● tous les éléments sont placés les uns au-dessus des autres à partir du coin haut-gauche ● le dernier élément graphique ajouté vient recouvrir les autres éléments
  • 133. antislashn.org Android - composants graphiques de base 5 - 26/56 LinearLayout ● Les composants sont placés les un après les autres, selon l'attribut d'orientation ● verticalement : les uns sous les autres ● horizontalement : les un après les autres, à la droite du précédent
  • 134. antislashn.org Android - composants graphiques de base 5 - 27/56 LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> ... </LinearLayout> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> ... </LinearLayout> </LinearLayout>
  • 135. antislashn.org Android - composants graphiques de base 5 - 28/56 LinearLayout ● Attributs utilisés dans l'exemple ● orientation : orientation verticale ou horizontale ● layout_width : largeur ● layout_heigth : hauteur ● layout_weight : proportion de la place prise par le widget dans son parent ● gravity : poisition dans son conteneur ● background : couleur du fond ● text : texte affiché ● textSize : taille du texte
  • 136. antislashn.org Android - composants graphiques de base 5 - 29/56 RelativeLayout ● Les positions des composants enfants sont précisées par rapport à la vue parente ou par rapport aux autres composants
  • 137. antislashn.org Android - composants graphiques de base 5 - 30/56 RelativeLayout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/label" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Type here:"/> <EditText android:id="@+id/entry" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:drawable/editbox_background" android:layout_below="@id/label"/> <Button android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/entry" android:layout_alignParentRight="true" android:layout_marginLeft="10dip" android:text="OK" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/ok" android:layout_alignTop="@id/ok" android:text="Cancel" /> </RelativeLayout>
  • 138. antislashn.org Android - composants graphiques de base 5 - 31/56 RelativeLayout ● Attributs utilisés dans l'exemple ● id : identifiant unique ● layout_below : positionne le haut d'un widget en dessous du widget référencé ● layout_alignParentRight : aligne le côté droit du widget avec le côté droit de son parent ● layout_marginLeft : espace pour la marge gauche ● layout_toBeLeftOf : positionne le côté droit du widget à gauche du widget référencer ● layout_alignTop : aligne le haut du widget avec le haut du widget référencé
  • 139. antislashn.org Android - composants graphiques de base 5 - 32/56 TableLayout ● Les composants enfants sont disposés sous forme de tableau ● les vues enfants sont des lignes de type TableRow ● les composants graphiques sont insérés dans les lignes
  • 140. antislashn.org Android - composants graphiques de base 5 - 33/56 TableLayout <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1"> <TableRow> <TextView android:layout_column="1" android:text="Open..." android:padding="3dip" /> <TextView android:text="Ctrl-O" android:gravity="right" android:padding="3dip" /> </TableRow> <TableRow> <TextView android:layout_column="1" android:text="Save..." android:padding="3dip" /> <TextView android:text="Ctrl-S" android:gravity="right" android:padding="3dip" /> </TableRow> <TableRow> <TextView android:layout_column="1" android:text="Save As..." android:padding="3dip" /> <TextView android:text="Ctrl-Shift-S" android:gravity="right" android:padding="3dip" /> </TableRow> </TableLayout>
  • 141. antislashn.org Android - composants graphiques de base 5 - 34/56 TableLayout ● Attributs utilisés dans l'exemple ● layout_column : index de la colonne où doit être positionné le widget ● gravity : position du widget dans son conteneur ● padding : espacement entre la bordure du widget et son contenu
  • 142. antislashn.org Android - composants graphiques de base 5 - 35/56 Autres layout ● Il existent d'autres gestionnaires de positionnement ● seront vu plus tard ● GridView : positionne les éléments dans une grille – la grille est muni d'ascenseurs – les éléments sont ajoutés via un ListAdapter ● Mise en place d'onglets – nécessite une construction spécifique de layouts ● Liste déroulante – utilise une classe ListView
  • 143. antislashn.org Android - composants graphiques de base 5 - 36/56 Autres layout ● Il existent d'autres gestionnaires de positionnement ● seront vu plus tard ● GridView : positionne les éléments dans une grille – la grille est muni d'ascenseurs – les éléments sont ajoutés via un ListAdapter ● Mise en place d'onglets – nécessite une construction spécifique de layouts ● Liste déroulante – utilise une classe ListView
  • 144. antislashn.org Android - composants graphiques de base 5 - 37/56 Mode déclaratif ● Mode le plus simple pour déclarer et réutiliser les IHM ● les exemples précédents illustrent le mode déclaratif ● Création du fichier XML dans le répertoire res/layout ● possibilité de fournir des layouts adaptés aux écrans physiques dans les répertoires res/layout-small, res/layout-normal, res/layout-large, res/layout-xlarge ● des layouts adaptés à l'orientation de l'écran sont aussi possibles – ajouter le qualificatif port pour portrait et land pour paysage ● res/layout-port, res/layout-normal-land, ...
  • 145. antislashn.org Android - composants graphiques de base 5 - 38/56 Mode déclaratif ● Utilisation du layout ● une activité crée l'interface utilisateur ● utilisation de la méthode setContentView(...) de la classe Activity – prend en paramètre un identifiant correspondant à l'identifiant du composant graphique ● utilisation de la classe R.java public class FrameLayoutActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
  • 146. antislashn.org Android - composants graphiques de base 5 - 39/56 Programmation des IHM ● Mode plus puissants, mais plus complexe ● ne facilite pas la réutilisation des IHM ● n'utilise pas les stratégies de choix de ressource en fonction du type d'écran – pas d'utilisation des fichiers XML res/layout-xxx ● Création du layout ● instanciation – le constructeur prend en argument le contexte de l'application – Activity hérite de la classe Context ● paramétrage du layout créé – utilise une instance de ViewGroup.LayoutParams
  • 147. antislashn.org Android - composants graphiques de base 5 - 40/56 Programmation des IHM ● Appel de la méthode setContentView(...) public class LayoutProgrammationActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.setLayoutParams(params); this.setTitle("Exemple instanciation layout"); setContentView(layout); } }
  • 148. antislashn.org Android - composants graphiques de base 5 - 41/56 Programmation des IHM ● Les modes déclaratif et programmatique sont souvent utilisés conjointement ● l'IHM est décrite dans le fichier XML ● le code java agit dynamiquement sur l'IHM ● c'est ce mode de développement qui est privilégié ● Interactions entre le mode déclaratif et programmatique ● le fichier XML déclare les composants graphique ● le code java retrouve le widget qu'il doit manipuler
  • 149. antislashn.org Android - composants graphiques de base 5 - 42/56 Programmation des IHM ● Récupération des widgets ● le code java doit récupérer les widgets qui sont déclarés dans le fichier XML ● un identifiant est associé au widget, par l'attribut id – id="@[+][package]id/nom_ressource" ● le signe + signifie que l'identifiant doit être ajouté, il apparaîtra dans le fichier R.java ● la méthode findViewById(...) permet de récupérer un widget – public View findViewById(int id) – l'identifiant est retrouvé par la classe R.java
  • 150. antislashn.org Android - composants graphiques de base 5 - 43/56 Programmation des IHM <?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_message" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> public class ModeMixteActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView text = (TextView) findViewById(R.id.text_message); text.setText("Comment ça va ?"); } } ajout de l'identifiant récupération du widget
  • 151. antislashn.org Android - composants graphiques de base 5 - 44/56 Les widgets de base ● Nous allons présenter quelques widgets de base ● le nombre de composants Android évolue en fonction des versions ● le nombre de propriétés de chaque composant est impressionnant – les propriétés communes à tous les composants, plus les propriétés spécifiques ● atteint plusieurs dizaines de propriétés par composants – ce référer à la documentation fournie avec le SDK pour plus de détails ● tous les composants font partie du package android.widget ● D'autres composants seront présentés au fur et à mesure des exemples et exercices
  • 152. antislashn.org Android - composants graphiques de base 5 - 45/56 Les widgets de base ● Le tiroir "Form Widget" du plugin ADT permet de choisir les widgets disponibles en fonction du niveau de SDK choisi ● attention, sur certaines plateformes de développement, le rendu ne correspond pas à l'affichage réel – l'émulateur permet alors de vérifier les attributs positionnés
  • 153. antislashn.org Android - composants graphiques de base 5 - 46/56 View ● La classe View la classe de base utilisée par tous les widgets ● View est spécialisée en ViewGroup pour les conteneurs ● Une vue occupe un rectangle dans l'interface graphique ● La vue est responsable de son affichage et de la gestion des événement
  • 154. antislashn.org Android - composants graphiques de base 5 - 47/56 View ● De nombreux événements sont exploitables ● clic, survol, création, drag and drop, … ● cf. la documentation ● Un ou plusieurs objets peuvent être attachés à une vue ● notion de tag ● voir les méthodes setTag(...) et getTag(...)
  • 155. antislashn.org Android - composants graphiques de base 5 - 48/56 Les widgets de base ● La documentation permet de connaître, widget par widget, les attributs XML et les méthodes équivalentes Java ● onglet "Reference"
  • 156. antislashn.org Android - composants graphiques de base 5 - 49/56 TextView ● Affichage d'un texte ● Principales propriétés ● autoLink : convertit les liens HTTP et adresses mails en liens cliquables ● ellipsize : règle d'affichage du texte si plus long que la zone de visualisation ● height, width, maxHeight, maxWidth : hauteur et largeur ● lines, minLines, maxLines : nombre de lignes ● text : texte à afficher ● textColor, textSize, textStyle : caractéristiques du texte ● gravity : endroit où est afficher le texte dans le conteneur si la zone d'affichage du texte est plus petit que le conteneur ● drawableTop, drawableBottom, drawableLeft, drawableRight : permet la gestion de l'affichage d'une ressource drawable à côté du texte
  • 157. antislashn.org Android - composants graphiques de base 5 - 50/56 TextView <?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:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#FFF" android:textColor="#000" android:textSize="25sp" android:textStyle="italic" android:text="@string/hello" /> </LinearLayout>
  • 158. antislashn.org Android - composants graphiques de base 5 - 51/56 EditText ● Permet la saisie d'un texte ● Hérite de TextView ● même propriétés ● Principales propriétés supplémentaires ● inputType : permet d'ajouter un filtre de saisie : email, mot de passe, numérique, multi-lignes, … – pas de validation, affiche le clavier adéquat, filtre les touches ● scrollHorizontally : défilement horizontal du texte si celui-ci est plus grand que la zone de saisie ● La méthode getText() permet de récupérer le texte saisi
  • 159. antislashn.org Android - composants graphiques de base 5 - 52/56 EditText <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > ... <EditText android:id="@+id/nom" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" /> ... <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" > </EditText> ... <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress" > </EditText> </LinearLayout> Listing incomplet
  • 160. antislashn.org Android - composants graphiques de base 5 - 53/56 Button ● Des actions sont souvent utilisés avec le widget Button ● de manière générale des actions sont utilisables sur tous les widgets ● Hérite de TextView ● propriétés utiles – onClick : nom de la méthode de l'activité à exécuter ● la signature de la méthode doit être: – public void nomMethode(View vue);
  • 161. antislashn.org Android - composants graphiques de base 5 - 54/56 Button ● Java peut aussi être utiliser pour lier l'action au bouton ● appel de listener – même type de programmation événementielle que Swing ● la mise en place du listener se fait par la méthode – public void setOnClickListener(View.OnClickListener listener) – même choix d'implémentation que sous Swing ● doit implémenter View.OnClickListener – classe anonyme – méthode de l'activité – méthode d'une classe de traitement – l'implémentation doit fournir une méthode ● public void onClick(View v)
  • 162. antislashn.org Android - composants graphiques de base 5 - 55/56 Button ● Mise en place de l'action par le fichier XML ● listings incomplets <Button android:id="@+id/btnEnvoyer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Envoyer" android:onClick="enregistrerUtilisateur" /> public void enregistrerUtilisateur(View v){ Button b = (Button) v; EditText nom = (EditText) this.findViewById(R.id.nom); Toast.makeText(this, b.getText()+"n"+ nom.getText(), Toast.LENGTH_LONG).show(); } création et affichage d'un toast rendu du toast
  • 163. antislashn.org Android - composants graphiques de base 5 - 56/56 Button ● Exécution de l'action par utilisation d'un listener ● listings incomplets <Button android:id="@+id/btnEnvoyer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Envoyer" /> public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button b = (Button) findViewById(R.id.btnEnvoyer); b.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { EditText nom = (EditText) findViewById(R.id.nom); Toast.makeText(v.getContext(), "Bonjour "+ nom.getText(), Toast.LENGTH_LONG).show(); } }); } création d'une classe anonyme
  • 164. antislashn.org Android - Intent 6 - 1/28 Intent
  • 165. antislashn.org Android - Intent 6 - 2/28 Bus de messages ● Les modules applicatifs ne sont pas invoqués directement ● ils sont activés via des messages, les "intentions" – classe Intent ● Le message contient la description de l'opération devant être exécutée ● sous forme divers – nom de la classe – action sous forme de chaîne de caractère – type MIME ● Les messages sont aussi utilisés pour les retours de résultats entre modules
  • 166. antislashn.org Android - Intent 6 - 3/28 Bus de messages Producteur Système Android Module applicatif Intent IntentResolver Application 2 Activité Activité IntentFilter IntentFilter Application 1 Activité Service IntentFilter IntentFilter Le composant dont le filtre d'intention correspond est activé
  • 167. antislashn.org Android - Intent 6 - 4/28 Bus de messages ● Activation d'activité ● Context.startActivity() ● Context.startActivityForResult() – un intention est associée à Activity.setResult() ● Activation de service ● Context.startService() ● Context.bindService() ● Activation de BroadcastReceiver ● Context.sendBroadcast() ● Context.sendOrderedBroadcast() ● Context.sendBroadcast()
  • 168. antislashn.org Android - Intent 6 - 5/28 Bus de messages ● La collaboration entre les applications s'effectue via un bus de message ● une instance de Intent est le message ● Contient plusieurs champs ● nom du composant qui doit gérer l'Intent ● l'action qui doit être exécutée – sous forme de String ● une donnée sous forme d'URI et de type MIME ● une catégorie qui correspond au type de composant devant gérer l'Intent ● des données supplémentaires – les Extras ● des flags utilisés par Android pour gérer le mode de chargement d'une activité
  • 169. antislashn.org Android - Intent 6 - 6/28 Bus de messages Activité principale Activité A Intent de lancement Intent de résultat Activité BIntent de lancement extra
  • 170. antislashn.org Android - Intent 6 - 7/28 Lancement d'un message ● Selon le mode d'instanciation d'un Intent, les champs précédents peuvent être nuls. ● Deux groupes de messages ● les intentions explicites – le composant à activé est désigné par son nom – en général utilisés au sein d'une même application ● les intentions implicites – le nom du composant à activer n'est pas connu – permet d'activer des composants d'autres application
  • 171. antislashn.org Android - Intent 6 - 8/28 Intent ● Intention explicite ● le composant cible est connu – souvent une activité de la même application – le composant cible n'a pas besoin de déclarer de filtre d'intention dans le manifeste ● seulement des iintentions explicites peuvent alors l'invoquer ● syntaxe ● public Intent(Context ctx, Class<?> cls) ● public Intent(String action, Context ctx, Class<?> cls) Intent intent = new Intent(this,ExplicitActivity.class); startActivity(intent);
  • 172. antislashn.org Android - Intent 6 - 9/28 Intent ● Intention implicite ● le composant destinataire n'est pas connu ● le système est chargé de trouver le composant destinataire – si plusieurs composants cibles existent, le système demande à l'utilisateur de choisir ● création d'une intention implicite – l'action est positionnée – une donnée associée (URI) peut être ajoutée ● syntaxe ● public Intent(String action) ● public Intent(String action, Uri uri)
  • 173. antislashn.org Android - Intent 6 - 10/28 Intent ● Intention implicite ● exemple – le système cherche alors le meilleur composant parmi ceux ayant déclarés leur capacité à réaliser l'action ● les composants ayant la capacité de réaliser l'action doivent déclarer un filtre d'intentions – un filtre d'intention n'a aucune incidence sur les intentions explicites Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:0102030405"));
  • 174. antislashn.org Android - Intent 6 - 11/28 Résolution des intentions ● Pour les intentions implicites Android doit trouver le – ou les – composants susceptibles de gérer l'intention ● L'objet Intent est comparé aux filtres d'intentions déclarés par les composants prenant en charge le message ● dans le fichier manifeste ● balise <intent-filter> ● Trois champs sont retenus pour ce test ● l'action ● la donnée : URI et type MIME ● la catégorie
  • 175. antislashn.org Android - Intent 6 - 12/28 Résolution des intentions ● Test sur l'action ● le test échoue si le filtre ne contient pas l'action de l'intention ● Test sur la catégorie ● chacune des catégories de l'intention doit correspondre aux catégories du filtre ● toutes les catégories du filtre n'ont pas a être présentes dans l'intention ● un objet Intent qui ne possède pas de catégorie passera donc toujours ce test – une exception : le démarrage d'une activité nécessite la catégorie android.intent.category.DEFAULT
  • 176. antislashn.org Android - Intent 6 - 13/28 Résolution des intentions ● L'élément <data> spécifie une URI et un type MIME ● l'URI est constituée de schema, host, port et path – schema://host:port/path – host:port forme l'authority ● Test sur la donnée ● un Intent qui ne contient pas de data passe le test ● un Intent qui contient une URI sans type de donnée passe le test si le filtre correspond ● un Intent qui contient un type MIME passe le test si le type correspond
  • 177. antislashn.org Android - Intent 6 - 14/28 Résolution des intentions ● Utilisation des types MIME ● par défaut l'application SMS Android récupère l'ensemble des intentions sur les types MIME ● il faut associer une action propre au composant pour filtrer sur le type MIME et l'action ● Si plusieurs modules applicatifs peuvent répondre à l'intention, Android présente une boite de dialogue de choix à l'utilisateur
  • 178. antislashn.org Android - Intent 6 - 15/28 Intent ● La méthode getIntent() permet de récupérer l'intention ayant lancée le composant ● L'action d'une intention peut être mise à jour et récupérée par ● public Intent setAction(String action) ● public String getAction() ● Des données supplémentaires peuvent être fournies à l'intention, sous forme de ● de catégories ● de données ● d'extras
  • 179. antislashn.org Android - Intent 6 - 16/28 Intent ● La catégorie ● utilisée pour déterminer le type de composant qui doit réaliser l'action ● ajout par la méthode – public Intent addCategory(String category) ● le paramètre String décrit la catégorie ● Android définie un certains nombre de catégories, comme CATEGORY_LAUNCH, CATEGORY_HOME – cf. la documentation
  • 180. antislashn.org Android - Intent 6 - 17/28 Intent ● Les données ● regroupe l'URI et le type MIME de la données cible ● le format et la signification des données sont dépendants de l'action spécifiée ● en général le type MIME peut être déduit de l'URI ● méthodes utiles – public Intent setData(Uri data) – public Uri getData() – public Intent setType(String type) – public String getType() ● l'utilisation de setData et setType sont concurrentes, elles écrasent leurs données respective
  • 181. antislashn.org Android - Intent 6 - 18/28 Intent ● Filtre d'intentions ● balise XML : intent-filter – balise fille de la balise de déclaration du composant applicatif – attributs ● icon : affichage pour l'utilisateur ● label : affichage pour l'utilisateur ● priority : donne une priorité de choix auprès du système, la valeur la plus forte est la plus prioritaire ● balises filles principales – action : nom de l'action sur laquelle réagir – category : nom de la catégorie sur laquelle réagir – data : spécifie une URI et/ou un type MIME
  • 182. antislashn.org Android - Intent 6 - 19/28 Résolution des intentions ● Un composant applicatif peut déclarer plusieurs filtres d'intention <activity android:name=".Activity2"> <intent-filter > <action android:name="org.antislashn.android.action.TOTO" /> <category android:name="android.intent.category.DEFAULT"/> <category android:name="org.antislashn.android.category.LAUNCH"/> </intent-filter> <intent-filter > <action android:name="org.antislashn.android.action.TOTO" /> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="moncontent" android:host="org.antislashn.android" android:port="150"/> </intent-filter> <intent-filter > <action android:name="org.antislashn.android.action.TOTO" /> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="type/antislashn"/> </intent-filter> </activity> nécessaire pour lancer l'activité
  • 183. antislashn.org Android - Intent 6 - 20/28 Résolution des intentions ● Filtre avec action et catégorie ● appel avec action ● appel avec action et catégorie <intent-filter > <action android:name="org.antislashn.android.action.TOTO" /> <category android:name="android.intent.category.DEFAULT"/> <category android:name="org.antislashn.android.category.LAUNCH"/> </intent-filter> Intent intent = new Intent(Activity2.ACTION); startActivity(intent); défini l'action TOTO Intent intent = new Intent(Activity2.ACTION); intent.addCategory(Activity2.LAUNCH_CATEGORY); startActivity(intent); défini l'action TOTO défini la catégorie LAUNCH
  • 184. antislashn.org Android - Intent 6 - 21/28 Résolution des intentions ● Filtre avec action et URI ● appel <intent-filter > <action android:name="org.antislashn.android.action.TOTO" /> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="moncontent" android:host="org.antislashn.android" android:port="150"/> </intent-filter> Uri uri = Uri.parse("moncontent://org.antislashn.android:150/exemple/toto"); Intent intent = new Intent(Activity2.ACTION,uri); startActivity(intent);
  • 185. antislashn.org Android - Intent 6 - 22/28 Résolution des intentions ● Filtre avec action et type MIME ● appel <intent-filter > <action android:name="org.antislashn.android.action.TOTO" /> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="type/antislashn"/> </intent-filter> Intent intent = new Intent(Activity2.ACTION); intent.setType("type/antislashn"); startActivity(intent);
  • 186. antislashn.org Android - Intent 6 - 23/28 Intent ● Exemples d'utilisation d'intentions ● utilisation d'une action et d'une URI – ACTION_VIEW et content://contacts/people/1 ● affichera les informations du contact ayant l'identifiant 1 – ACTION_DIAL et tel:123 ● provoque l'affichage du clavier téléphonique avec le numéro de téléphone – ACTION_GET_CONTENT et vnd.android.cursor.item/phone ● affiche la liste des numéros de téléphone ● autres exemples – ACTION_MAIN et CATEGORY_HOME ● affichage de l'écran d'accueil
  • 187. antislashn.org Android - Intent 6 - 24/28 Intent ● Les Extras ● données applicatives ajoutées à l'intention ● méthodes – public Intent putExtras(Bundle extra) – public Bundle getExtras()
  • 188. antislashn.org Android - Intent 6 - 25/28 Intent ● Bundle ● similaire à la classe Map – clé : uniquement de type String – valeur associée à la clé : toute instance, ou tableau d'instances, de classe implémentant l'interface Parcelable ● mécanisme de sérialisation léger propre à Andoid ● de nombreuses méthodes de la classe Intent permettent de ne pas instancier directement un Bundle – public Intent putExtra(String name, int value) – public int getIntExtra(String name, int defaultValue) – public Intent putExtra(String name, String value) – public String getStringExtra(String name, String defaultValue) – etc.
  • 189. antislashn.org Android - Intent 6 - 26/28 Intent ● Des indicateurs (flags, drapeaux) peuvent aussi être ajouter à l'intention ● public Intent setFlags(int flags) ● public Intent addFlags(int flags) ● public int getFlags() ● Les flags permettent de changer certains comportements par défaut des activité ● gestion de la pile des activités par exemple
  • 190. antislashn.org Android - Intent 6 - 27/28 PendingIntent ● Intention en attente ● de type PendingIntent ● contient une instance d'Intent décrivant l'action à réaliser ● cette action est réalisée ultérieurement – par une autre application qui reçoit alors les droits de l'application qui a créée l'intention en attente ● création d'une intention en attente par les méthodes statique de PendingIntent – getActivity : lancera une activité – getService : lancera un service – getBroadcast : diffuse un événement
  • 191. antislashn.org Android - Intent 6 - 28/28 PendingIntent ● Avec un Intent, un module applicatif A demande le lancement d'un module applicatif B ● Avec un PendingIntent, un module applicatif A demande à un module X de lancer un module B Activité A Activité BIntent Activité A Module X Activité BIntentPendingIntent
  • 192. antislashn.org Android - Activity 7 - 1/22 Les activités Activity
  • 193. antislashn.org Android - Activity 7 - 2/22 Activity ● Composant applicatif ● peut-être constitué de fragments (Fragment) – sera abordé plus loin ● représente la gestion d'un écran pour l'utilisateur – une application simple peut être composée d'une seule activité – l'écran géré par l'activité est celui qui est vu par l'utilisateur ● s'exécute dans le thread principal de l'application – ne pas bloquer ce thread principal par des calculs ou attentes de ressources ● mauvaise expérience utilisateur ● Android peut alors décider de tuer l'activité
  • 194. antislashn.org Android - Activity 7 - 3/22 Activity ● Une activité spécialise la classe Activity ● Activity hérite de Context ● l'activité est déclarée dans le fichier manifeste ● Possède un cycle de vie qui est géré par Android ● nous avons vu la méthode onCreate(...) ● Une activité est déclenchée par une intention (Intent) ● intention implicite ● intention explicite
  • 195. antislashn.org Android - Activity 7 - 4/22 Activity ● Activités et intentions ● une activité qui accepte des intentions implicites doit déclarer dans ses filtres d'intention la catégorie – android.intent.category.DEFAULT ● une activité qui est le point d'entrée de l'application doit déclarer – l'action : android.intent.action.MAIN ● composant point d'entrée de l'application – la catégorie : android.intent.category.LAUNCHER ● composant pouvant être lancé par l'utilisateur – la combinaison MAIN et LAUNCHER ajoutera l'activité au "Lanceur d'applications" Android – ne déclare pas android.intent.category.DEFAULT
  • 196. antislashn.org Android - Activity 7 - 5/22 Activity ● Déclaration dans le manifeste ● attributs courants – label : nom de l'activité, si non précisé le label de l'application est utilisé – icon : icône de l'activité, si non précisé l'icône de l'application est utilisé – name : spécifie la classe de l'activité, si le package est le même que l'attribut package de la balise manifest, il peut être remplacé par point (.). – screenOrientation : orientation de l'écran que doit adopter l'application ● pas recommandé de fixer cette valeur – hardwareAcceleration : (depuis API 11) demande d'amélioration des performances d'affichage
  • 197. antislashn.org Android - Activity 7 - 6/22 Activity ● Exemple de fichier manifeste <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.antislashn.android.activity" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".AppelactivityActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:label="explicit" android:name=".ExplicitActivity" > </activity> </application> </manifest> activité point d'entrée de l'application activité ne pouvant être appelée que par un intent explicite
  • 198. antislashn.org Android - Activity 7 - 7/22 Activity ● Cycle de vie ● une activité peut-être détruite par le système à partir du moment ou cette activité est en pause ● les différentes méthodes du cycle de vie peuvent être surchargées – il faut commencer par appeler la méthode du même nom dans la classe mère ● exemple : super.onCreate(savedInstanceState) ● bien garder à l'esprit que l'activité peut être exécutée en arrière plan – l'activité est toujours en mémoire, mais pas d'affichage
  • 199. antislashn.org Android - Activity 7 - 8/22 Activity
  • 200. antislashn.org Android - Activity 7 - 9/22 Activity ● onCreate ● appelée à la création de l'activité ● un seul appel lors du cycle de vie ● permet de créer les IHM, initialiser l'activité, … ● reçoit un objet de type Bundle – récupère des informations sauvegardées précédemment lors de la dernière exécution – la sauvegarde est faite par le système ● une fermeture normale de l'activité ne provoque pas de sauvegarde ● si Android ferme l'activité la sauvegarde est effectuée – les méthodes onSaveInstance et onRestoreInstance permettent d'ajouter des objets dans Bundle ● ne pas utiliser pour la persistance, car onSaveInstance n'est pas toujours appelée (arrêt normal de l'application par exemple)
  • 201. antislashn.org Android - Activity 7 - 10/22 Activity ● onStart ● appelée après la méthode onCreate ou onRestart ● précède l'affichage de la vue de l'activité ● onResume ● appelée après la méthode onStart ou onPause ● après l'affichage de la vue de l'activité
  • 202. antislashn.org Android - Activity 7 - 11/22 Activity ● onPause ● appelée lorsque une autre activité prend la main pour passer en premier plan ● l'exécution de la méthode doit être rapide ● sauvegarde des données persistantes, arrêt des tâches consommatrices de ressources, … ● la méthode isFinishing() permet de savoir si l'activité va être détruite ou juste mise en pause ● jusqu'à l'API 11 Android peut décider de tuer l'application à partir de la sortie de cette méthode ● à partir de l'API 11 Android peut décider de tuer l'application après onStop
  • 203. antislashn.org Android - Activity 7 - 12/22 Activity ● onStop ● permet de libérer certaines ressources ● jusqu'à l'API 11 l'appel de cette méthode peut ne jamais être exécutée ● onRestart ● appelée si l'activité revient au premier plan ● suivi d'un appel à onStart ● onDestroy ● appelée après un appel de la méthode finish ou par le système si celui-ci à besoin de ressources ● permet de libérer des ressources liées à l'activité
  • 204. antislashn.org Android - Activity 7 - 13/22 Activity ● Des méthodes événementielles permettent de gérer la persistance de l'instance ● onSaveInstanceState(Bundle) qui est appelée juste avant que l'activité soit tuée onDestroy() ● onRestoreInstanceState(Bundle) qui est appelée après la méthode onStart() et avant onPostCreate(Bundle)
  • 205. antislashn.org Android - Activity 7 - 14/22 Activity ● lancement d'une activité par la méthode startActivity ● public void startActivity(Intent intent) ● l'intention peut-être explicite ou implicite ● si l'activité invoquée doit retourner un résultat ● appeler l'activité avec startActivityForResult ● coder une méthode callback onActivityResult
  • 206. antislashn.org Android - Activity 7 - 15/22 Activity ● startActivityForResult ● public void startActivityForResult(Intent intent, int requestCode) ● paramètres – intent : intention envoyée au sysème – requestCode : si >=0, ce même code sera retourné à la méthode onActivityResult –
  • 207. antislashn.org Android - Activity 7 - 16/22 Activity ● onActivityResult ● public void onActivityResult(int requestCode, int resultCode, Intent data) ● paramètres – requestCode : code utilisé dans startActivityForResult – resultCode : résultat de retour de l'activité ● ce code a été positionné par l'activité par la méthode setResult(int)ou setResult(int,Intent) – data : intention retournée par l'activité, ce qui permet de récupérer les extras ajoutés à l'intention par l'activité ● ce code a été positionné par l'activité appelée via sa méthode setResult(int,Intent)
  • 208. antislashn.org Android - Activity 7 - 17/22 Activity ● Résumé : appel d'une activité avec retour de résultat ● dans l'activité appelante – coder la méthode onActivityResult – lancer l'intention pour démarrer l'activité appelée, celle qui retourne le résultat ● dans l'activité appelée – avant de finir l'activité, créer un nouvel Intent – ajouter un extra – ajouter à setResult – puis appeler finish() ● au retour, dans l'activité appelée – récupérer l'intention et extraire l'extra
  • 209. antislashn.org Android - Activity 7 - 18/22 Activity ● Exemple de code ● activité appelante public class ActivityResultActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void appelAutreActivity(View v){ Intent intent = new Intent(this,AutreActivity.class); startActivityForResult(intent, 0); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ int r = data.getIntExtra("resultat", 0); Toast.makeText(this, "RESULTAT = "+r, Toast.LENGTH_LONG).show(); } } appel de l'activité devant retourner un résultat récupération du résultat préparé par l'activité appelée
  • 210. antislashn.org Android - Activity 7 - 19/22 Activity ● Exemple de code ● activité appelée retournant le résultat public class AutreActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.autre_activity); } public void stopActivity(View v){ Intent intent = new Intent(); intent.putExtra("resultat", 10); this.setResult(0, intent); this.finish(); } } préparation du résultat renvoyé à l'activité appelante
  • 211. antislashn.org Android - Activity 7 - 20/22 Activity ● A chaque application le système associe une pile LIFO ● la pile d'activités ● empile les activités lancées les une après les autres ● le bouton retour dépile les activités ● si l'utilisateur revient sur la page d'accueil Android (touche Accueil) la pile est sauvegardée – elle est restituée lorsque l'application est relancée – l'activité courante est donc retrouvée
  • 212. antislashn.org Android - Activity 7 - 21/22 Activity ● Il est possible de changer le mode de fonctionnement par défaut de la pile ● utilisation des attributs de la balise activity – alwaysRetainTaskState : (yes | no) – clearTaskOnLaunch : (yes | no) – finishOnTaskLauch : (yes | no) – launchMode : (standard | singleTop | singleTask | singleInstance) ● ajout du flag Intent.FLAG_ACTIVITY_CLEAR_TOP pour dépiler la pile jusqu'à l'activité qui doit être lancée
  • 213. antislashn.org Android - Activity 7 - 22/22 Activity ● Des classes dérivées de Activity permettent de simplifier la gestion de certains contrôles graphiques ● ListActivity ● MapActivity ● AccountAthentificationActivity ● ...
  • 214. antislashn.org Android - ListView 8 - 1/29 Composant ListView