You are on page 1of 27

Organisation du module

Programmation des systèmes mobiles & sans fil

● CM/TD/TP
Ο Ο

Cours magistraux : 5 heures Travaux pratiques : 37,5 heures

● Évaluation
Ο Ο

Contrôle continu : 1 séance (1h30) Note de TP : projet MobileApp (~6h)

[70%] [30%]

● Ressources

pédagogiques

Olivier Le Goaer
M2 TI – Année 2012-2013

Ο

Tout au format électronique (PDF) sur WebCampus

Prérequis du module
● Langages
Ο

Plan du module
● Avant-propos
Ο

de développement

HTML, CSS, JavaScript, Java SE, PHP

● Formats
Ο

d'échange

Comprendre les tendances et les enjeux du développement d'applications pour terminaux mobiles

XML, JSON

● Développer
Ο

une WebApp

● Outils
Ο Ο

de développement

Apprendre à développer une application Web compatible mobile à l'aide du framework jQuery Mobile

IDE Eclipse phpMyAdmin

● Développer
Ο

une MobileApp

● Base
Ο

de données

Apprendre à développer une application native sur la plateforme mobile Android

SQL

Un marché en explosion

Avant-propos

● Vente
Ο

de "terminaux mobiles" évolués

Un téléphone mobile sur trois vendu dans le monde est un smartphone L'explosion des ventes doit beaucoup à l'énorme succès de l'iPhone d'Apple. L'arrivée en force des tablettes (ardoises numériques) Des utilisateurs de plus en plus accros (les "nomophobes")

Ο

Ο Ο

● Vente
Ο

d'applications associées

On prévoit 20 milliards d’applications téléchargées par an en 2014 contre 2,3 en 2009 C'est la nouvelle ruée vers l'or !

Ο

De nouvelles opportunités
● Demande
Ο

SmartPhone

croissante des entreprises

Écrans
Ο Ο

Définition et mise en œuvre de leur stratégie Web et/ou mobile Postes de « Développeur Applications Mobiles H/F » Niveau Bac+5 (école d'ingénieur ou universitaire) exigé

QVGA, WVGA... Mono/multi-touch

Ο Ο

● Capteurs
Ο

GPS, boussoles, accéléromètres...

● Une
Ο

offre de formation qui s'adapte

● Connectivité
Ο

Les écoles et universités intègrent peu à peu la programmation mobile dans leurs plaquettes de formation L'université de Pau a lancé ce module dès 2008, en ciblant alors J2ME (Java 2 Micro Edition)

GSM (voix + données), WiFi, Bluetooth, NFC

Ο

Réseaux sans fil
● Les

OS Mobile : l'offre actuelle

quatre catégories de réseaux sans fil

GSM, GPRS, EDGE, UMTS (3G) LTE Adv. (4G)

Zone de couverture
Réseaux personnels sans fil (WPAN) Réseaux locaux sans fil (WLAN) Réseaux métropolitains sans fil (WMAN) Réseaux étendus sans fil (WWAN)

OS mobile : développements
Plateforme
Windows Phone iOS Blackberry OS Java ME Android Palm WebOS Symbian OS Brew MP Bada MeeGo Firefox OS (B2G) Ubuntu Mobile

Modèles de développement
● MobileApp
Portabilité Développement /coût Mises à jour Disponibilité Fonctionnalités

Programmation
VB.Net, C# Objective-C Java Java Java, code natif C++ JavaScript, C/C++ C++ C++ C++ Qt C++ HTML5/CSS3/JavaScript C/C++, JavaScript

IDE conseillé
Visual studio .Net X-CODE MDS Studio EclipseME (CLDC, MIDP) Eclipse + plug-in ADT Eclipse + webOS plug-in Performance Visual Studio + plug-in badaIDE QtCreator Xemacs ? ;-) Qt Creator

versus WebApp
Application mobile (native) Application web
Navigateur Web Langage du Web (HTML / JS / CSS / PHP...) Mise à jour rapide en mettant à jour tout simplement les fichiers sur le serveur Web Nécessite obligatoirement une connexion internet Limitées aux possibilités du navigateur

Développement spécifique à chaque plateforme Nécessite un SDK + connaissance d’un langage spécifique Soumission à un magasin d’applications et éventuelle validation + retéléchargement par le client Mode online et offline Utilise toutes les fonctionnalités du mobile (GPS, voix, notifications, contacts...)

● HybridApp
Ο Ο

: le modèle hybride

Encapsulation d'une WebApp dans une MobileApp Ce modèle de développement reste un compromis...

fr Ο C++.. JavaScript DSL DSL HTML5. fournir à l'utilisateur un niveau global d'interactivité imitant les applications natives auxquelles il est habitué ... * Diapositive expérimentale – Merci de votre compréhension Technique Interprétation Interprétation Transcompilation Transcompilation Transcompilation Commentaires API android-like API générique Développer une WebApp [avec jQuery Mobile] IDE online .. Programmation JavaScript HTML.. Java. Les langages dédiés (DSL) Solutions cross-platform * Nom commercial Titanium Mobile Apache Cordova (PhoneGap) NeoMAD Codename One MoSync appMobi Canappi Applause IBM Worklight Rhodes . JavaScript Ruby.Middleware IBM fournit Le browsing sur mobile ● Le Ο WebApp mobile-friendly ● Customisation Ο browsing sur mobile est déjà une réalité pour terminal mobile Il est aujourd'hui possible de reproduire une expérience utilisateur similaire à celle d'une application native Un site mobile sera toujours moins cher qu'une application développée dans un environnement propriétaire. CSS. Renvoyer au terminal mobile une page adaptée à ses spécificités (mobile-friendly) Taille écran limitée.. HTML. C/C++ HTML5. run everywhere" ● Les WebApp (et les HybridApp) sont un faux problème N'exploitent pas la plateforme (même si les standards W3C évoluent vite) Ο Les MobApp sont au cœur du problème ● ● Redévelopper une application native pour chaque plateforme Nécessite des compétences et du temps ($$) ● Quelle Ο ● lingua franca pour programmer ? Les langages du web JavaScript. Google Chrome : moteur WebKit Microsoft IE : moteur Trident Mozilla Firefox : moteur Gecko Opera : moteur Presto ● Deux • solutions sont envisageables 1) Handheld stylesheets Voir ''Media Query'' du W3C Fournir une feuille de style CSS spécifique aux périphériques mobiles (media="handheld") 2) Mobile-optimized site • En plus d'une feuille de style spécifique.. Ο Ο ● Les Ο Ο Ο Ο browsers et leur support des standards W3C sont donc au cœur des enjeux Apple Safari.Basé sur PhoneGap . HTML.Arbre de décision ● Un Ο Le défi du cross-plateforme slogan : "Write once... . pointage tactile. CSS3.. CSS. débit limité.. JavaScript. CSS... Transcompilation Transcompilation Interprétation Interpretation . JavaScript Java Java HTML5. JavaScript . Ο Les langages mainstream ● © Ekito..

min.css" href="http://code.1.css) La bibliothèque JavaScript jQuery (..Frameworks actuels Sencha Sencha Touch Touch iUI iUI jQuery jQuery Mobile Mobile jqTouch jqTouch Dojo Dojo mobile mobile .js) Ο Ο Versions compactées <link <link rel="stylesheet" rel="stylesheet" href="http://code.6.js"></script> <script <script type="text/javascript" type="text/javascript" src="http://code. Principes de base ● Vous Ο jQuery Mobile en images.0b1.mobile-1.js"></script> Ο ..0b1.6.min.jquery. Ο Ο jQuery Mobile modifie le DOM des documents au chargement En ajoutant des éléments et des attributs de style En exploitant de façon transparente la technologie Ajax ● Au Ο Ο final on obtient automatiquement Une apparence graphique très "iOS-like" Des effets de transition entre les pages Étape 1 : importation ● Des Ο Ο Étape 2 : structure ● Exploitez Ο bibliothèques sont requises Soit stockées en local sur votre serveur Soit directement sur le serveur public à haute disponibilité de jQuery.min.min.mobile-1..mobile-1.min.0b1.jquery.css" /> /> <script <script type="text/javascript" type="text/javascript" src="http://code.0b1/jquery.com/mobile/1.0b1..1.mobile-1. allez créer des documents Conformes au doctype HTML 5 ● Puis.jquery.0b1/jquery.jquery.com/jquery-1.com/mobile/1. où * est la fonctionnalité désirée data-role – précise la nature du bloc (page|header|content| footer) data-position – spécifie où l'élément doit être positionné (top| bottom|right|left) data-inset – spécifie si l'élément doit être contenu dans les marges ou à l'extérieur de celles-ci (true|false) data-transition – spécifie quelle transition utiliser lors du chargement de nouvelles pages (slide|slideup|slidedown| pop|flip|fade) data-theme – spécifie le thème graphique à utiliser pour les éléments d'un conteneur (a|b|c|d|e) ● Importation Ο Ο Ο dans le document courant Ο Une feuille de style spécifique mobile (.js"></script> src="http://code.0b1/jquery.com/jquery-1.com l'attribut data-* dans votre document.min..js"></script> src="http://code.js) La bibliothèque JavaScript jQuery Mobile (. .jquery..com/mobile/1.com/mobile/1.0b1/jquery.jquery.

Utilisez l'URL du document cible: <a href="..0b1/jquery.jquery.js"></script> src="http://code.js"></script> </head> </head> <body> <body> <div ="page" <div data-role data-role ="page" id=''foo''> id=''foo''> <div ="header"> <div data-role data-role ="header"> <h1>Page <h1>PageTitle</h1> Title</h1> </div><!-</div><!-..jquery..mobile-1.jquery.js"></script> src="http://code...</p> <a <a href="#" href="#" data-role="button" data-role="button" data-rel="back">Ok</a> data-rel="back">Ok</a> </div> </div> </div> </div> ● Puis.com/mobile/1..com/mobile/1. imbriquées.Template d'un document <!DOCTYPE <!DOCTYPE html> html> <html> <html> <head> <head> <title>Page <title>Page Title</title> Title</title> <link <link rel="stylesheet" rel="stylesheet" href="http://code.html" data-rel="dialog">Voir</a> .css" /> /> <script <script type="text/javascript" type="text/javascript" src="http://code. ● Pour Ο Utilisez des blocs dont le rôle est "fieldcontain" <div <div data-role="fieldcontain"> data-role="fieldcontain"> <label <label for="name">Numéro for="name">Numéro client client :</label> :</label> <input <input type="text" type="text" name="name" name="name" id="name" id="name" value="" value="" required required /> /> </div> </div> ● Tout Ο se joue ensuite sur le lien vers la page <a href=".6.min. menu déroulant. séparateurs.jquery..min. ajoutez rel="external" au lien. blocs rétractables & effet accordéon.0b1/jquery. footer. case à cocher.1.0b1. <div <div data-role="page" data-role="page" id="foo"> id="foo"> <div <div data-role="header" data-role="header" data-position="inline"> data-position="inline"> <h1>Attention</h1> <h1>Attention</h1> </div> </div> <div data-role="content"> <div data-role="content"> <h1>Connectivité <h1>Connectivité limitée</h1> limitée</h1> <p>Vérifiez <p>Vérifiez vos vos branchements. bouton radio...mobile-1. attribut data-transition) header. navbar. ● Formatage Ο ● Lien Ο interdocument Layout..</p> here.html">next</a> Une requête Ajax est forgée.6. numérotés.mobile-1.css" href="http://code.com/mobile/1. message informatif. Ο ● Listes Ο Simples./page --> </body> </body> </html> </html> Deux approches possibles ● Monopage Ο ● Multipages Ο 1 document = 1 page 1 document = n pages HTML HTML Permet le préfetching des pages HTML HTML Page Page Page Page lien interdocument Page Page HTML HTML lien intradocument Page Page Page Page Modèle de navigation ● Lien Ο Ο Quelques composants ● Barre Ο intradocument d'outils Utilisez l'id de la page cible : <a href="#foo">next</a> Le contenu de la page est déjà dans le DOM courant et une transition opère (cf.. etc. icônes.0b1/jquery.0b1.0b1.</form> page peut être stylisée en tant que boite de dialogue modale Accapare l'écran jusqu'à ce qu'elle soit fermée Utile pour : confirmation./foo.0b1/jquery. Ο ● Formulaires (voir diapo suivante) Formulaires ● Balise Ο Dialogues ● Une Ο Ο classique <form action="form.com/jquery-1.php" method="POST">. inline.com/mobile/1../header /header --> --> ="content"> <div <div data-role data-role ="content"> <p>Page <p>Page content content goes goes here..min./content /content --> --> <div ="footer"> <div data-role data-role ="footer"> <h4>Page <h4>Page Footer</h4> Footer</h4> </div><!-</div><!-.min. Ο inclusion des éléments de HTML 5 une mise en forme soignée Slider.jquery.com/jquery-1.mobile-1..0b1./bar./footer /footer --> --> </div><!-/page --> </div><!-..jquery.min. groupes.. ou bien data-ajax="false" ● Boutons Ο simples.1.</p> branchements.</p> </div><!-</div><!-.min. le contenu de la page est ajouté au DOM courant et une transition opère Si le document cible est multipages.js"></script> <script <script type="text/javascript" type="text/javascript" src="http://code.

function(event){ $('#aboutPage'). pagecreate Et la "touche finale" ● Immiter Ο Ο Tester votre WebApp ● Test Ο une icône de lancement native en visuel.foo') $('div > p') $('#bar') ● Liés Ο scrollstart.function(event){ alert('Cette alert('Cette page page vient vient d'être d'être améliorée améliorée par par Jquery'). '. callback). pageshow.jquery. doivent être positionnées dans le document maître ! ● Exemples orientationchange //s'applique //s'applique à à tout tout le le document document (non (non testé) testé) $(document). swipe. scrollstop ● Liés Ο pagebeforeshow. taphold.live(' $('div'). il a accès à son solde et aux opérations de virements Exemples login/password : demo/demo. fonctionnement des sélecteurs CSS : $('div') $('div.com/ Opera Mobile Emulator http://www.function(event. }). via un terminal mobile Créer une favicon de 57x57 pixels. }).function(event.live('pagecreate pagecreate '.png" /> Consulter le niveau de support (le grade) du navigateur http://jquerymobile. }).live(' '. active').com/developer/tools/mobile/ Ο ● Framework Ο de test pour jQuery Qunit : http://docs. $(document). Jquery'). swipeleft/swiperight $('elem'). sans terminal mobile jQuery Mobile fonctionne sur un navigateur standard ! Ripple Emulator (Extension pour Chrome) http://ripple.com/Qunit Démo : Bankster ● Bankster Ο : La banque des gangsters de l'application Bankster Flashez pour accéder à la démo Plagie une WebApp mobile-friendly d'un organisme bancaire ● Fonctionnalités Ο Développer une MobileApp [sous Android] Partie publique ● Formulaire d'identification. annuaire Ο Partie privée ● Le client s'est authentifié. infos bourse (récupérés au format JSON). }).Catégories d'événements ● Liés Ο Gestion des événements ● Méthodes Ο au pointage/touché au changement d'orientation de l'écran au défilement de l'écran à l'affichage des pages à l'initialisation des pages live() ou bien bind() en vrac : tap. //S'applique //S'applique à à toutes toutes les les pages pages $('div'). }). alert('Tapotage'). Cf. //Ne //Ne s'applique s'applique qu'à qu'à une une page page donnée donnée $('#aboutPage'). ui){ ui){ alert('Tapotage').opera.tinyhippos.live(' tap '. ui){ ui){ alert('Affichage alert('Affichage de de la la page page active'). }).function(event.live('eventName'. ● Liés Ο Pour fonctionner.live('pageshow pageshow'.live(' tap '. pagebeforehide. au format PNG <link rel="apple-touch-icon" href="myIcon.com/gbs/ ● Solution sous iPhone et sous Android ● Tester Ο Ο en visuel.function(event. liste des agences (image google maps). pagehide ● Liés Ο pagebeforecreate. dsk/dsk ● .

0 Android 4. ● Objectif Ο : 2005 Rachat Rachat de de la la startup startup par par Google Google inc.6 Android 2. intuitif. inc. intuitif. 2008 Premier Premier mobile mobile sous sous Android Android :: le le T-Mobile T-Mobile G1 G1 Développer des normes ouvertes pour les appareils de téléphonie mobile Matériels Android APN APN Tablette Tablette Points forts d'Android Point de vue constructeur Point de vue utilisateur Système Système Linux Linux + + Java Java Embarqué Embarqué Smartphone Smartphone Point de vue bidouilleur Système Système fonctionnel.. 2012 – Google Inc Android en images. fonctionnel..1 ? API Level 3 4 7 8 9 11 14 16 ? Key Lime Pie Kouign-Amann Version Ice Cream Sandwich (ICS) .0 Android 4. évolutif évolutif Point de vue développeur Netbook Netbook Télévision Télévision Projet Projet Open Open Source Source C++ C++ // Java Java Applications Applications développées développées en en syntaxe syntaxe Java Java SDK SDK complet complet fourni fourni Versions d'Android CodeName Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean November 1.gl/LejV9 Open Handset Alliance (OHA) ● Regroupement Ο Ο Ο Ο de + de 50 entreprises Fabricants de matériels Opérateurs mobile Développeurs d'applications .. Platform Android 1.1 Android 2. inc.Bref historique 2003 Naissance Naissance de de la la startup startup Android Android inc..2 Android 2. 2007 Annonce Annonce d'Android d'Android +SDK +SDK Open Open Handset Handset Alliance Alliance Voir annonce par Sergey Brin sur YouTube : http://goo.5 Android 1.3 Android 3.

... compilateur. Observer (Listener). Builder... Android : android.google. interface. java.. DAO.e.view.maps.6 *couche outrepassée dans le cas du NDK Machine virtuelle "Dalvik" ● Offre Ο Priorités des processus Processus Processus actif actif l'avantage de toute machine virtuelle ● Android Couche d'abstraction entre le développeur d'applications et des implémentations matérielles particulières ● La Ο Ο VM Dalvik n'est pas une VM Java Priorité Processus Processus visible visible gère ses ressources de manière agressive Ο Tient compte des contraintes de CPU et mémoire Exécute des fichiers . ● Design Ο patterns Singleton. annotation.*. Assistant à la création de projets Créateur d'interface graphique (WYSIWYG) Vues et perspectives dédiées ● Idiomes Ο Classes anonymes. API Émulateurs Débogeur..dex (Dalvik Executable) optimisés Pour garantir une haute réactivité Élimination de processus sans avertissement ! Politique de priorité basée sur une hiérarchisation des processus Processus Processus de de service service en en cours cours d'exécution d'exécution Ο ● La Ο VM créé une instance Dalvik pour chaque application (i. Google : com. processus lourds) Les applications sont totalement indépendantes ("sandbox") ● ● Ο Processus Processus d'arrière-plan d'arrière-plan Espaces protégés (mémoire.. ● Bibliothèques Ο Ο Ο (API) Apache Harmony ● Android Ο Ο Ο Ο Ο SDK J2SE (subset) : java.*.*.. android. disque) Évite un plantage généralisé ! Processus Processus vide vide Le petit univers Java ● Concepts Ο Outils du développeur ● Plugin Ο Ο Ο de la POO Java Eclipse ADT (Android Development Tools) Paquetage.*.. signature Exemples (démos) ..telephony.. classe. POJO. classes internes.*.lang.io. empaqueteur. ..android.Architecture logicielle Couches logicielles APPLICATIONS Applications préinstallées sur un périphérique APPLICATION FRAMEWORK API offertes aux dévelopeurs ANDROID RUNTIME* LIBRARIES Machine virtuelle Bibliothèques C/C++ LINUX KERNEL Linux version 2.. héritage.

Météo. layout.. SharedPreferences. textes. images.java) Fichier source automatiquement généré (à partir du contenu du répertoire res) API Android (ici version 2.) Ressources organisées (icônes.) ● Fonctionnalités Ο Ο Ο Ο Ο Ο non-disponibles Applications système (. HTML.. Calculatrice. couleurs....2) Ressources non-organisées (zip. Stockées dans les sousrépertoires de /res/ du projet ● Ο un seul niveau de profondeur est autorisé ! .apk) (Horloge.. etc. styles. niveau d'indirection) versus simulation Noyau Linux + extensions android Données des applications (database SQLite.apk) (AngryBirds. chaînes de caractères. ls.) Appareil photo (Camera↔Webcam supporté) Vibreur Appels téléphoniques réels Capteurs en général Connexions USB Évolution de la charge de la batterie Commandes système (mkdir...Plugin ADT Eclipse ● Perspectives ● Vues Numéro du terminal Émulateur : aperçu Bouton 'HOME' Bouton 'MENU' Bouton 'BACK' Écran ''Tactile'' Thème (skin) par défaut Émulateur : limitations ● Lent Ο Ο Arborescence système Alternative : AndroVM sur VirtualBox Applications utilisateur (..) Arborescence projet Le plugin ADT gère et facilite cette structuration Externaliser les ressources ● Android Dossier du projet prévoit de facto l'externalisation des ressources Ο Vos fichiers sources (*. menu.e..) au démarrage et à l'usage Emulation (i. Browser. layout.. PDF. chmod.. de mise à jour et de gestion ● Créer Ο des ressources Simples valeurs.) Fichier Manifest Facilité de maintenance.

droit d'accéder au GPS.dex .class .) Déclare le niveau minimum de compatibilité du SDK pour que l'application fonctionne .xml . broadcast receivers.java .. services.java . content providers) de l'application et leurs filtres si nécessaire (à quels intents ils réagissent) Déclare les permissions que l'application doit avoir pour fonctionner (droit de passer des appels. composants. prérequis prérequis Ο Ο . Ce dernier sert d'identificateur unique de l'application..Compilation et déploiement Bytecode Dalvik (optimisé) . Déclare les composants applicatifs (activities.xml qui : Nomme le paquetage Java de l'application.dex Entièrement automatisé avec le plugin ADT sous Eclipse !! Environnement contraint ● Pour Ο Ο Ο Sources Java Bytecode Java vos développements. Ο Content Providers Sources Sources de de données données partageables partageables Broadcast Receivers Réactions à Réactions à des des Ecrans Ecrans de de présentation présentation annonces/évènements annonces/évènements Ο Manifeste Métadonnées.apk .png .class ..png . Métadonnées. droit d'accéder à Internet. gardez à l'esprit que les appareils mobiles ont : Une puissance processeur plus faible Une RAM limitée Des capacités de stockage permanent limitées De petits écrans avec de faibles résolutions Des coûts élevés de transfert de données Des taux de transfert plus lents avec une latence élevée Des connexions réseau moins fiables Des batteries à autonomie limitée .xml Application empaquetée /data/app Ο Ο Ο Types d'applications Android Construction d'une application Android Application Application de de premier premier plan plan (ex: (ex: jeu jeu de de Poker) Poker) (ex: (ex: répondeur répondeur automatique automatique aux aux SMS) SMS) Application Application d'arrière d'arrière plan plan (ex: (ex: météo météo du du jour) jour) (ex: (ex: lecteur lecteur de de média) média) Widget Widget Intermittente Intermittente Les différents composants ● Chaque Activities Écrans Écrans de de présentation présentation Services Tâches Tâches d'arrière-plan d'arrière-plan Intents Activations Activations & & messages messages inter/intra-applications inter/intra-applications Ο Le manifeste projet contient à sa racine un fichier AndroidManifest..apk Ο Ο Ressources + Manifest . composants.

onCreate(savedInstanceState).onDestroy().bankster..Activity. getContentResolver. /* Désallocation des ressources ici */ } } Le bundle sert à mémoriser l'état de l'UI de l'activité lorsqu'elle passe en arrière plan Lancer une activité ● Pour ● Une Ο pouvoir être lancée. startActivity. .. . sendBroadcast.. public class Home extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super...app. . getSystemService.0" encoding="utf-8"?> <manifest package="fr.xml <?xml version="1. import android. /* Allocation des ressources ici */ } @Override protected void onDestroy() { super. toute activité doit être préalablement déclarée dans le manifeste activité est désignée comme activité initiale de l'application Ceci est indiqué dans le fichier manifeste ● Lancer Ο une activité Méthode startActivity(. Nœud d'un service de l'application <service> <intent-filter> ..bankster"> Permissions requises <uses-permission /> <uses-sdk /> <supports-screens /> <application> <activity> <intent-filter> <action /> <category /> <data /> </intent-filter> </activity> Notion de contexte Pensez à bien déclarer tous les composants applicatifs de votre application ! ● Le contexte modélise les informations globales sur l'environnement de l'application les méthodes importantes Ο Ο Ο Nœud de l'application Nœud d'une activité de l'application ● Possède getRessources. getSharedPreferences. </intent-filter> </service> <receiver> <intent-filter> .) . openFileInput.) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy() Incarne souvent un cas d'utilisation (use case UML) ● Une ● Exemple 1) Numéroteur 2) Annuaire des contacts 3) Fiche d'un contact 4) Ajout d'un contact Ο Ο Ο ● Étend android. getPackageName.getContext() </manifest> Activité ● Une Ο Cycle de vie d'une activité ●7 Ο Ο Ο Ο activité ≈ un écran graphique application est formée de n activités : application de téléphonie méthodes de callback void onCreate(. startService. ..) ● Lancer Ο une activité en vue d'obtenir un résultat en retour Méthode startActivityForResult(.AndroidManifest..app.univpau..univpau. </intent-filter> </receiver> <provider> <grant-uri-permission /> </provider> </application> Nœud d'un broadcast receiver de l'application ● Accès Ο Ο Ο au contexte Nœud d'un content provider de l'application Depuis une Activity ou un Service : this (car héritage) Depuis un BroadcastReceiver : en argument de onReceive() Depuis un ContentProvider : this. openOrCreateDatabase.Activity Diagramme de cas d'utilisation (UML) Activité : code source package fr....

app.e.) stopService(..Service dans le processus courant Service : code source package fr. public class AccountCleaner extends Service { @Override public void onCreate() { /* Allocation des ressources ici */ } @Override void onStartCommand(Intent intent. /* Désallocation des ressources ici */ } } Appel d'un service ● Mode Ο Unbounded ● Mode Ο Bounded Un composant démarre et arrête un traitement en tâche de fond comme il le souhaite ● Opérations Ο Ο Des composants (appelés "clients") établissent une connexion permanente afin d'interagir avec un service par le biais d'une interface startService(..La pile des activités ● Les Ο Multitâches ● Plusieurs Ο activités sont empilées/dépilées Empilée quand une activité démarre Dépilée (i..0 onStartCommand() onDestroy() onBind() onUnbind() ● Deux Ο types de services : Local : service qui s’exécute dans le même processus que votre application Distant (IPC) : service qui s’exécute dans des processus indépendants de votre application (nécessite une description AIDL) Ο ● Un Ο service est une classe qui étend ● S'exécute android.. Ο Elle passe simplement en arrière plan Reprend l'activité située au sommet de la pile Service ● Sert Ο Cycle de vie d'un service ●5 Ο Ο Ο Ο Ο Ο à effectuer des opérations ou des calculs en dehors de l’interaction utilisateur Ne nécessite pas une interface graphique méthodes de callback onCreate() onStart() SDK<2. import android.) Un même service peut supporter les 2 modes simultanément ● Opérations Ο Ο Ο bindService(.app..onDestroy().Service. détruite) quand on presse le bouton 'BACK' piles d'activités peuvent coexister avec Android L'utilisateur passe de l'une à l'autre Ο ● Une pression sur le bouton 'HOME' ne dépile pas l'activité.bankster.) unbindService(.. int startId) { /* Votre code du service ici */ } @Override protected void onDestroy() { super..univpau.) + toutes les méthodes de l'interface java définie . int flags..

● Actions Ο natives android d'une URI Constantes de la classe android. i.123.. Service et BroadcastReceveir Activity Intent Intent getIntent() getIntent() ● Principe A d'un bus à messages asynchrones S B Filtre d'intentions de A Filtre d'intentions de S Filtre d'intentions de B BroadcastReceiver Service onStartCommand( onStartCommand(Intent Intent)) IBinder IBinderonBind( onBind(Intent Intent)) Intent Intent Bus onReceive( onReceive(Intent Intent)) Natures des intents ● Types 1. Direct ● Intents : les extras ● Il ● Désignations 1.Intent Le composant cible est activé par le composant source Le composant cible est nommé « Activer tel composant » Une à une. } this. .123.Intents : principes ● Trois Ο Intents : vue d'ensemble Main Activity onActivityResult( onActivityResult(Intent Intent)) sendBroadcast(Intent) sendOrderedBroadcast(Intent) sendStickyBroadcast(Intent) startService(Intent) stopService(Intent) bindService(Intent) startActivity(Intent) startActivityForResult(Intent) finishActivity(int) setResult(Intent) types de composants applicatifs sont activés via des intentions (Intents) Activity.content.content. mailto. NextActivity.. ou regroupées dans un bundle (android. import android. tel.startActivity(i).setAction(Intent. mms.PendingIntent Le composant cible est activé par un élément tiers. } else { /* Désignation implicite (action + data) */ i. import android. public class Home extends Activity { void goToNextScreen() { Intent i = new Intent().. longitude).this...content.parse("tel:01-56-60-12-34")).ou Serializable ● ● ● ● Récupération Ο Méthode propre à chaque type.5000 tel:0156601234 google.. .streetview: cbll=49.Bundle) ● 2.class).ACTION_DIAL).Intent ● Format Ο scheme://host:port/path schemes usuels : http. . false).5000. /* Intent de type direct */ i. Explicite ● ● est possible d'utiliser l'intent pour convoyer des données supplémentaires Ο Instance de android. /* Poussé sur le bus */ } } Ο Actions et URI courantes Action ACTION_EDIT ACTION_VIEW ACTION_CALL ACTION_VIEW URI content://contacts/people/125 geo:49. file. sur cette donnée » Les filtres d'intention indiquent au bus si le message d'activation doit être délivré au composant ● Stockage Ο Ο Ο sur le principe d'une table de hash Instance de android.Activity.bankster. Implicite ● 2. /* Donnée additionnelle */ if(je_connais_la_cible) { /* Désignation explicite (implémentation) */ i. Par procuration ● Le composant cible n'est pas nommé « Activer un composant capable de prendre en charge cette action. geo.os.setClass(Home.app..putExtra("happy".5000 Signification Éditer la fiche du contact 125 Ouvrir l’application de géolocalisation à la position donnée (latitude.setData(Uri. de la forme getXXXExtra() Intent : code source package fr.5000.univpau..Intent. Appeller le numéro Ouvrir google street view à la localisation donnée .content. de la part du composant source (toutes ses permissions lui sont cédées pour l'occasion) Méthode putExtra surchargée Les types de base (+array) sont gérés Les types complexes (c-a-d les classes) doivent implémenter Parcelable.

1 ou plusieurs composants sont éligibles ● Dans le cas spécifiques des activités.DEFAULT"/> </intent-filter> </service> </application> </manifest> Applications et Tâches ● Ainsi. etc. sans en lancer la totalité android. etc.. } } Ο Liaison dynamique dans le cas d'une désignation implicite ● la classe à charger sera découverte au moment de l'éxécution ● Mécanisme Ο implémenté par com.VIEW"/> <data scheme="http"/> </intent-filter> </activity> <activity android:name="A2"> <activity android:name="A2"> <intent-filter> <intent-filter> <action name=". l'utilisateur sera invité à faire un choix A1 A2 A3 ● Permettra au bus de savoir si le message d'activation (i..android.DEBITER"/> <category android:name="android.IntentResolver Mise en correspondance des intentions (« la demande ») et des filtres d'intentions disponibles (« l'offre ») Calcul de correspondance basé..VIEW"/> <data scheme="tel"/> <data scheme="tel"/> </intent-filter> </intent-filter> </activity> </activity> <activity android:name="A3"> </activity> ● L'absence Bus Mécanisme de résolution ● Principe Ο ● Actions personnalisées ● Définir d'un chargeur de classes ses propres verbes d'action Liaison statique dans le cas d'une désignation explicite la classe à charger est connue au moment de la compilation package fr. @Override public void onCreate(Bundle savedInstanceState) { startService(new Intent(Home.Filtres d'intention ● Chaque Ο Ο Ο Résolution des intentions ● Repose Ο Ο composant peut définir ses filtres d'intention au niveau du manifeste ACTION : Quelles actions sont supportées ? DATA : Pour des données de quelle nature ? CATEGORY : Dans quelles circonstances ? sur le mode de désignation choisi Explicite : le composant cible est exécuté Implicite : 0.bankster. un SMS vient d'arriver.bankster. User-defined : solde bancaire négatif.e.DEBITER". ● Une Ο Ο succession d'activités pour atteindre un objectif donné est appelée "Tâche" Les activités empilées proviennent de diverses applications Complètement transparent du point de vue de l'utilisateur Ο ● Ne ● Un Ο nécessite pas une interface graphique broadcast receiver est une classe qui étend ● Une Ο application peut possèder plusieurs points d'entrée (pas de "main" unique donc) Il est possible de lancer n'importe quelle partie exposée d'une application via le manifest..category.. public class Home extends Activity { public static final string DEBITER = "fr.bankster.. et enfin les Data <manifest> <application> <service android:name="AccountManager"> <intent-filter> <action android:name="fr.BroadcastReceiver ● Un receiver s'abonne/désabonne via le fichier manifest ou programmatiquement .univpau...DEBITER)). l'intent) doit être délivré au composant ou non de filtres implique une désignation explicite du composant ACTION_VIEW tel:112 <activity android:name="A1"> <intent-filter> <action name=". Ο Broadcast receiver ● Réagit Ο une application peut faire appel à des "morceaux" d'autres applications Réutilisation/partage de composants voulu par Android à aux annonces diffusées à l'aide sendBroadcast(.) System-defined : la batterie est faible. puis les Catégories.univpau. comme une seule d'entre elles peut être exécutée.server. dans l'ordre.univpau. sur ● ● Déclarer des filtres en conséquence Ο Les Actions.content.VIEW"/> <action name=".intent.

android.bankster 2) Plusieurs enregistrements ● ● URI : content://fr. ● Deux ● ● cas de figure : : content://fr.Images Content Resolver MediaStore.bankster/account"). …) { /* En fonction du format de l'URI */ if (uri_termine_par_un_ID) { /* Renvoyer un seul compte client */ } else { /* Renvoyer tous les comptes */ } } } l'URI de votre provider Elle sera utilisée pour y accéder via le ContentResolver public static final URI CONTENT_URI = Uri.BroadcastReceiver.content.univpau.dir/fr.ContentProvider ● Expose <manifest> <application> <receiver class="fr. arg0.ContentProvider. public class Sleep extends BroadcastReceiver { @Override public void onReceive(Context arg0. Intent arg1) { //si besoin.item/fr. public boolean onCreate() { /* Initialiser la source de données ici */ return true.univpau.intent.Sleep"> <intent-filter> <action android:name="android. accéder aux extras de l'intent arg1 Intent i = new Intent(arg0. } public Cursor query(Uri uri. CallLog ● La Ο façon dont sont réellement stockées les données doit rester transparente Interface commune pour manipuler les données offerte par un content provider Elle s'obtient via un contentResolver ● MediaStore.Receiver : code source package fr.bankster/account/ Type MIME : vnd.univpau.bankster/account/28854165 Résolution de contenu ● Différentes Ο Ο Ο Ο Content Resolver : exemples content://call_log/calls SpyApp techniques de persistance Content Providers Natifs Settings + + delete() delete() + + insert() insert() + + notifyChange() notifyChange() + + query() query() + + update() update() Fichier binaire (sérialisation d'objets) Fichier XML/JSON Base de données embarquée ou distante Etc.bankster/account/[id] 1) Un seul enregistrement URI Type MIME : vnd.cursor.univpau.cursor. } } Content Provider ● Un content provider sert à rendre une partie des données d'une application accessibles aux autres applications Ο Seul moyen pour un partage de données interapplications ● Un Ο content provider est une classe qui étend android.SCREEN_OFF"/> </intent-filter> </receiver> </application> </manifest> les données via une URI dont le schème dédié est 'content' Ο Ο System-defined : content://sms/inbox/125 User-defined : content://fr.bankster.bankster .parse("content://fr.univpau.action.parse("content://fr.bankster.startService(i).univpau.univpau.content.univpau. String[] projection. URI et type MIME ● Publier Ο Ο Provider : code source package fr.bankster.Audios Ο ContentResolver cr = getContentResolver(). import android. import android. public class AccountProvider extends ContentProvider { public static final URI CONTENT_URI = Uri.class).android.univpau.univpau.content. AccountCleaner.bankster/account").

java public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000.java user-defined : fr.View::onDraw(Canvas canvas) ● ViewGroup Ο Ο Ο ● ViewSimple (widget) Ο Ο Ο Ο Ο LinearLayout TableLayout RelativeLayout FrameLayout ScrollView Button EditText TextView Spinner CheckBox ● Rendu Ο 2D/3D (non abordé dans ce cours) Ο Ο OpenGL.getResources() R.* +onDraw(Canvas canvas) +invalidate() ViewGroup +addView(View child) ViewSimple Sépare la vue du code métier ● Fonctionnalité Ο Ο Ο de personnalisation Hériter et redéfinir un widget de base Combiner des widgets existants Dessin 100% personnalisé ..rose_bonbon). Ο Ο Le fichier R permet de tirer parti d'une complétion automatique de code dans l'éditeur Eclipse ● Référencer des ressources depuis d'autres ressources Ο Ο Ο attribute="@[packageName]:resourcetype/resourseIdent" <EditText android:textColor="@color/rose_bonbon"/> <EditText android:textColor="@android:color/darker_gray"/> UI : User Interface ● Une API Ο Les Vues Android View Java riche déclarative à la XML Mais peut se faire de façon 100% programmatique ● Principe Des layouts et des widgets (appelés « Vues ») ● Programmation Ο du design pattern Composite 0. } public static final class layout { public static final int main=0x7f030000.Resources Ressources du projet en cours : context.R. ainsi que des constantes de type entier sur 32bits ● Chemin Ο Ο d'accès aux ressources via R.setColor(R.Principe de R.univpau.R. obj. public static final int hello=0x7f040000. Renderscript .darker_gray).res.color.java (à ne pas toucher) Génération automatique de classes internes à la classe R.color.color.content.foo. } } Exploiter les ressources ● Utiliser Le fichier R permet de tirer parti d'une vérification syntaxique par le compilateur des ressources depuis le code Ο La plupart des éléments de l'API sont prévus pour accepter des ressources Android en paramètre (int ressource) obj.java Interface graphique utilisateur (GUI) ● Chaque Ο élément défini dans le répertoire /res impacte le fichier R.setColor(android.color.rose_bonbon system-defined : android.R. public static final int listView1=0x7f050001. } public static final class string { public static final int app_name=0x7f040001. } public static final class id { public static final int editText1=0x7f050000.darker_gray ● Objet Ο Ο java représentant les ressources Instance de la classe android.

..app. chargeables indépendamment Même idée que les "Frames" en HTML Ο Sauvegarde/restauration manuelle via un bundle ● ● Un Ο fragment est une classe qui étend onSaveInstanceState() et onRestoreInstanceState() android.. L'activité change de configuration (orientation. Propriétés de placement ● Poids Ο Ο Widgets : aperçu Taux d'espace libre affectés à chaque widgets android:layout_weight = ? (0 par défaut) ● Espacement Ο Ο (intra) Espacement entre un contenu et les bords de sa vue android:padding? = top | left | right | bottom ● Espacement Ο Ο (inter) Espacement entre les vues android:layout_margin? = ??px Sauvegarder/restaurer l'état des vues ● Lorsqu'une Ο Fragments ● Nouveauté Ο activité passe en arrière-plan depuis Android 3.) 2. langage.Fragment Ο Pour qu'un objet survive à un changement de configuration ● ● Les onRetainNonConfigurationInstance() et getLastNonConfigurationInstance() fragments sont ensuite attachés/détachés à une activité hôte .Layouts : aperçu Propriétés de placement ● Orientation Ο Ο Sens de placement des vues dans un conteneur android:orientation = vertical | horizontal ● Taille Ο Ο Surface prise par la vue android:layout_width/android:layout_height = ??px | fill_parent | wrap_content ● Gravité Ο Ο Alignement d'une vue dans son conteneur android:layout_gravity = left | center_horizontal | top | bottom | right | .0 L'état de tous les widgets (munis d'un id) sont automatiquement sauvegardé/restauré via un bundle Prévus pour les écrans plus larges.. L'activité passe en arrière plan mais est tuée par le système (réquisition !) Ο Fragmentation de l'espace d'affichage en différentes zones. comme les tablettes ● Lorsqu'une Ο activité doit être recréée ● Principe Ο de base Deux cas de recréation complète suite à une destruction 1.

background. R. padding.control.Activités dédiées ● Afin Ο Ο Dialogues et Toasts ● Dialogues Ο de simplifier les choses. .id. MenuInflater.e. il existe des classes prédéfinies à étendre directement ListActivity : si votre activité présente une liste d'items ExpandableListActivity : si votre activité présente une liste d'items extensible TabActivity : si votre activité présente des onglets PreferenceActivity : si votre activité présente un panneau de préférences FragmentActivity : si votre activité contient des fragments MapActivity : si votre activité présente une carte google maps (introduite par l'API Google Maps) ● Toasts Ο Confirmation Message compact et rapide à l'intention de l'utilisateur Ο Ο Ο Progession Ο Ο Menus ● Menu Barres ● Menu principal contextuel ● Barre d'action rapide ● Barre d'action Thèmes et styles ● Un Ο Ο Instanciation des vues ● Il thème correspond à une "feuille de styles" Ensemble de styles à appliquer à une activité Thèmes par défaut : Theme.Joli.Holo..main. ..style. .menu. my_menu).style. System-defined : android. obtenir des objets) pour pouvoir les manipuler les widgets depuis le code Ο Ο ● Récupérer ● Un Ο Ο Ο style est une ressource Android Grâce aux identifiants affectés à chaque vue Button myButton = (Button) findViewById(R. textColor. Propriétés : taille. Héritage de style possible en xml (parent="@style/Joli") ● Récupérer Ο toute une vue depuis le code ● Chaque Ο Ο vue est stylisable Ο Ο Désérialiser (inflate) un fichier XML décrivant un layout ou un menu View my_view = LayoutInflater.inflate(R.. est nécessaire d'instancier les vues (i.layout. .style. null).Widget_Button.inflate(R.....Joli2. Un seul style applicable à la fois (android:style="@style/Joli") ..my_button).Dark. User-defined : R.R.

xml /res/layout-land/main..widget. ainsi qu'un texte noir sur fond blanc. query data refresh Ο android...drawable.. AdapterView AdapterView (ArrayList.BaseAdapter SimpleAdapter. MODEL MODEL Cursor Cursor ou ou Collection Collection VIEW VIEW (Spinner.. nm.mon_bel_item Notifications ● Différentes Ο Ο Ο Ο Application Multi-écrans ● Prévoir Ο Ο Ο formes différentes variantes d'une même image LED Son Vibreur Barre de notification (icône) /res/drawable-hdip/icon.) .png ● Prévoir ● Utilisation Ο facilitée par le notification manager les deux orientations possibles (portrait ou landscape) Ο Ο NotificationManager nm = (NotificationManager) getSystemService(Context. gesture) Ο OnTouchListener onTouchEvent(MotionEvent) Ο CursorAdapter : sert à récupérer des données stockées dans une base de données relationelle (SQLite) Vous pouvez étendre ces classes de base pour gérer finement vos items (conseillé) Model-View-Presenter (MVP) Register/Unregister Observers Apparences des items ● L'apparence Ο PRESENTER PRESENTER Notify data changed (CursorAdapter.png /res/drawable-ldip/icon.. new Notification(.NOTIFICATION_SERVICE).. ArrayAdapter..) ● Vous Ο pouvez évidemment définir vos propres layouts pour créer des items plus complexes fr...simple_list_item_1 ● Spécifie un texte aligné à gauche.layout.simple_spinner_item ● BaseAdapter BaseAdapter adapted-by spécifie un texte aligné à gauche et un bouton radio à droite.AdapterView ● Gestion Ο ● du KeyPad (tap.) des items sont définies par défaut par des layouts système android. ListView. on manipule une seule ressource. sans se soucier de la résolution (R..R.bankster. (ArrayList..png /res/drawable-mdip/icon.widget. ArrayAdapter. (Spinner..Gestion des évènements ● Principe Ο Les adaptateurs ● Les Ο des écouteurs de Java SE Fournir une implémentation respectant un contrat (interface) afin de réagir à des types d'évènements particuliers adaptateurs sont des classes qui lient des données aux vues de l'UI Les vues concernées étendent android.)) /res/layout-port/main. ArrayAdapter<?> : sert à récupérer des données stockées dans une collection ● Ο OnKeyListener ● onKeyUp(KeyEvent).icon) .) ]..layout.layout. onKeyDown(KeyEvent) Exploite par défaut la valeur de la méthode toString() des objets de la liste ● Gestion Ο ● du TouchScreen (pression.) ListView.. OnLongClickListener onClick(View). [[ ].xml Ο Depuis le code. .) Ο .notify(NUMBER.R. trackball) Bizarrerie : un seul listener par widget :-/ ● Classes Ο Ο d'adaptateurs OnClickListener.R. (CursorAdapter.. ainsi qu'un texte blanc sur fond transparent. onLongClick(View) Héritent de android.univpau.

.IO classe implémente l'interface Serializable (+champs serialVersionUID) Idem que pour java SE Format de stockage binaire ● Sauvegarde Ο et chargement Flux de sortie : FileOutputStream fos = openFileOutput("CAC40.exe produit des fichiers *.readObject(). Ο ● Cas Ο Ο d'un fichier statique (lecture uniquement) Ο Désérialisation ● ● Déposez-le dans le répertoire res/raw/ de votre projet Accès avec openRawResource(R.xml Draw9patch.strings.raw. "Olivier Le Goaer").hello) Images divisées en neuf zones (dont certaines étirables) Outil Draw 9-patch du répertoire /tool du SDK Android ● /res/values-fr/strings. ed.png ● Le choix sera fait automatiquement en fonction de la configuration du terminal (ex: LOCALE=FR_fr) également aux images car elles peuvent afficher du texte ! Ο Ο ● S'applique /res/drawable-fr/splashscreen. Ο ● Retrouvez Ο des préférences String t = pref.MODE_PRIVATE) ● Sauvegarder Ο Ο des préférences Récupère un éditeur de préférences : Editor ed = pref.putString("teacher".commit().putBoolean("isBrilliant".writeObject(myObject).dat".xml /res/values-it/strings.png /res/drawable-en/splashscreen. Valide les modifications : ed.9. true). Gestion de fichiers plats ● Mécanisme Ο Ο Sérialisation d'objets ● Chaque Ο Ο de lecture/écriture de fichiers Exploite l'espace de stockage interne ou externe API habituelle java. myObject = (myClass) ois.xml /res/values-en/strings.getString("teacher". sans se soucier de la langue (R."unknown"). Context. oos.dat") ● Basé Ο ● ● sur la gestion de fichiers ci-avant Sérialisation ObjectOutputStream oos = new ObjectOutputStream(fos).MODE_PRIVATE) Flux d'entrée : FileInputStream fis = openFileInput("CAC40.edit() Stocke les paires : ed.png Shared Preferences Persistance et threading ● Mécanisme Ο Ο simple et léger Sauvegarde de paires clé/valeur simple SharedPreferences pref = getPreferences(Activity.cac40) ObjectInputStream ois = new ObjectInputStream(fis).Images redimensionnables ● Utiliser Ο Ο Application Multi-langues ● Prévoir Ο Ο Ο les images 9 patchs différentes variantes d'une même chaîne On manipule une seule ressource.

getString(3). "58421"}) Ο Ο ● L'instance Ο Ο Ο de la BDD est ensuite obtenue à l'aide du helper. REAL.rawQuery("SELECT * FROM Customer WHERE id>? AND id<?". new String[]{"47645". db = myHelper. //3e champ } while(res. Ο Support partiel des déclencheurs (triggers) Bonnes pratiques ● Créer Ο Ο Interrogation de la base ● Approche Ο un helper par SQL brut Étendre android. tri..json ● Implémentation Ο Les types Booléens. String table. suppression.sqlite. "bankster.query (boolean distinct. String selection.SQLiteOpenHelper Classe abstraite qui gère la création. ContentValues values) ● Supression Ο db. String[] selectionArgs. String limit) Ο Résultats ● L'ensemble Ο Ajout. Dates.. TEXT.database. String orderBy. selon deux modes SQLiteDatabase db. String[] columns. String[] whereArgs) .dom Approche évènementielle (SAX) : org.parsers ● ● Léger et puissant Typage dynamique des colonnes Ne gère pas les contraintes d'intégrité référentielle Approche hiérarchique (DOM) : org.sax Ο ● JSON Ο Ο ● Types Ο de données NONE. … sont ''émulés'' avec ces types primitifs Support du standard SQL-92 ● Mais manque RIGHT OUTER JOIN et FULL OUTER JOIN. String whereClause. groupement.getReadableDatabase() //lecture seule ● Approche Ο par composante Une requête est fournie via ses composantes relationnelles (projection.query(.moveToFirst()) { //itère sur chaque tuple do { String customerName = res. l'ouverture et la montée de version d'une base de données myHelper = new BanksterHelper(context. String having.) d'un tuple Un n-uplet est une instance de android.. String whereClause. BLOB Parsing de ressources au format JSON Voir API org. String groupBy. String nullColumnHack.update(String table. ContentValues values.xml. m-a-j ● Représentation Ο Ο des tuples (ou n-uplets) retournés par une requête est un curseur Cursor res = db. String[] whereArgs) ● Mise Ο à jour de tuples db.xml.delete(String table.content.insert(String table.getWritableDatabase() //lecture et écriture db = myHelper.moveToNext()) } Fermeture d'un curseur : manuellement ou en mode ''managé'' db.w3c.db". 1) La requête est fournie sous forme de chaîne de caractères du dialecte SQL db.ContentValues n paires nom-de-champ/valeur-de-champ ● On Ο Ο peut ensuite parcourir cet ensemble ● Ajout Ο de tuples de tuples Même principe que les itérateurs de collection Java Utiliser les méthodes de la forme get<Type>(int columnIndex) pour récupérer la valeur d'un champ //vérifie qu'il y a au moins un tuple if (res..) db.XML et JSON ● XML Ο Ο Base de données embarquée ● Android Ο Ο Note SAX plus performant que DOM ! embarque le SGBD-R SQLite Parsing de ressources au format XML Voir API javax. sélection... null. INTEGER.

.LoaderManager ● Et Ο pensez à faire patienter votre utilisateur Barre de progression..Runnable new Thread(new Runnable() { public void run(.. Ο doInBackground : placez le code à exécuter à cet endroit.. . TYPE_GRAVITY.) }).. Ο Ο Directement depuis une activité Dans les autres cas ● ● ● Exécution Ο de la tâche Ο Instancier un handler nécessairement dans le UiThread : h = new Handler().}). Y enfiler des runnables depuis le thread enfant : h. TYPE_LIGHT.app. TYPE_GYROSCOPE.. data2.Threading : éviter les ANR ● Gérer Ο Ο Thread principal : UIThread ● Tous Ο Ο les traitements qui ralentissent l'UI et donc qui dégradent l'expérience utilisateur Éviter une "Application Not Responding" (ANR) Fermeture forçée de l'application au bout de n secondes les composants d'une application démarrent dans le thread principal UIThread Gère l'affichage graphique et les interactions utilisateur Vos traitements "consommateurs" et lents bloqueront tous les autres composants (dont affichage + interactions) :-( ● Deux ● exemples récurrents : 1) Communications réseaux Une NetworkOnMainThreadException est levée depuis Android 3.Thread qui encapsulera une instance implémentant la méthode run() de l'interface java.start().....})..e.. processus légers) A l'aide de tâches asynchrones A l'aide de vos propres Threads enfants 2) Manipulations SQLite ● Voir du coté de android.?> fonctionnement que JAVA SE des gestionnaires d'évènements déjà synchronisés avec le UIThread pour mettre à jour les vues Ο Créer une instance de la classe java.os. ● Puis Ο les synchroniser avec l'interface graphique Car le UIThread est le seul habilité à modifier les vues ! Tâche asynchrone ● Classe ● Fournit Thread enfant ● Même Ο qui étend android.lang.execute(data1.x ● Nécessité Ο Ο de déplacer ces traitements en tâches de fond (i.. m-a-j de l'UI ● Pour Ο ● synchroniser un thread enfant avec l'UI runOnUiThread(new Runnable() {.Sensor TYPE_AMBIENT_TEMPERATURE.hardware. Les capteurs Exploiter les dispositifs matériel ● Un Ο Ο Ο Ο Ο périphérique Android peut possèder aucun ou plusieurs capteurs (sensors en anglais) Cinémomètre (ou accéléromètre) Gyroscope (ou boussole) Luminomètre Magnétomètre . new MyAsyncTask().).lang.AsyncTask<?.. Pas d'interaction avec l'UI ! onProgressUpdate : mettez à jour l'UI au fil du traitement onPostExecute : une fois le traitement terminé. ● Constantes Ο supportées par la classe android..post(new Runnable(){. SplashScreen au démarrage.?.

SensorEvent Multi-touch ● Supporte Ο Ο Ο Ο Évènements gestuels plusieurs pointeurs simultanés Doigt. est modélisé par : la précision de l'acquisition le capteur qui l'a généré son horodatage les valeurs brutes ● ● Une Ο seule valeur Luminomètre..MotionEvent peut ainsi modéliser de multiples évènements Autant qu'il y a de pointeurs actifs à la surface Technique du masque binaire pour extraire les informations ● event. a).. SENSOR_DELAY_FASTEST..SensorEventListener commune à tous les capteurs onAccuracyChanged() : la précision a changée (+/-) onSensorChanged() : une nouvelle valeur brute est disponible Ο Ο Ο Accèléromètre. a = sm.getActionMasked() ● Différencie Ο ● le premier pointeurs des suivants Cycle de vie (ou d'actions) du premier pointeur ACTION_DOWN → (ACTION_MOVE)* → ACTION_UP ● Trois a) Tap gestes de base Ο Cycle de vie (ou d'actions) des suivants ● b) Drag c) Pinch-Zoom Ο ACTION_POINTER_DOWN → (ACTION_MOVE)* → ACTION_POINTER_UP L'ID d'un pointeur reste inchangé lors de son cycle de vie . ● Trois Ο valeurs (X-Y-Z) ● Interface Ο Ο android. gravité. import android.Principes des capteurs ● Système Ο Capteurs : code source package fr.TYPE_ACCELEROMETER).Service.. } @Override protected void onDestroy() { super.app. dans les méthodes onPause() et onDestroy() Acquisition des données ● Choisir Ο Evènement de capteur ● L'évènement Ο son taux d'acquisition (toutes les n microsecondes) Exemple de contantes de la classe Sensor : SENSOR_DELAY_NORMAL.view.getDefaultSensor(Sensor..*.hardware..hardware.}.univpau. sm...registerListener(new SensorEventListener() {. Ο bien penser à se désabonner Car les données continuent d'être acquises (même si elles ne sont pas traitées) et cela consomme de l'énergie ! Se gère au niveau du cycle de vie des composants concernés ● Ο Typiquement.hardware. gyroscope. pression.SensorManager) permet de gèrer facilement les abonnements en cours ● Ο Méthodes registerListener() et unregisterListener() ● Surtout. public class FallingDown extends Service { @Override public void onCreate() { // Mise en place de l'écoute de l'accèléromètre sm = (SensorManager)getSystemService(SENSOR_SERVICE).. stylet. sm.).getPointerCount() À chaque pointeur actif est attribué un ID ● Une Ο Ο même instance de android..bankster. } } d'abonnement à un capteur Votre programme est à l'écoute des évènements qui surviennent au niveau d'un capteur Le SensorManager (android...unregisterListener(. Vecteur de flottants dont la taille et l'interprétation dépendent du capteur ► ● Chaque évènement est un objet instance de la classe android. proximité.hardware. Limite théorique : 256 event.onDestroy(). import android.

maps.bankster.android. import android. 6.android.. et horodatage Parfois.Projection ● Méthodes toPixels() et fromPixels() . LocationManager.LocationListener pour écouter les changements de position onLocationChanged() : une nouvelle position est disponible onProviderDisabled()/Enabled() : fournisseur désactivé/activé onStatusChanged() : le statut du fournisseur a changé ● ● Requière Ο Ο Instance de android. .GeoPoint Moins riche qu'une instance de android.NETWORK_PROVIDER.google. vous permettant de centrer et de régler le niveau de zoom.univpau.requestLocationUpdates(gps_prov. affichées au dessus de la carte Ο Interface com.graphics.Géolocalisation ● Exploiter Ο Évènements de position ● Interface Ο Ο Ο le gestionnaire de position le choix d'un fournisseur de position Instance de android.y) ● com..Point Instance de com..location.maps..android.app. Chaque fournisseur offre diverses caractéristiques ● ● ● ● OUT_OF_SERVICE..android.google.Activity. Nokia Here Maps. altitude.GPS_PROVIDER.location. AVAILABLE ● Chaque Ο Ο position est un objet instance de la classe android. } } Cartographie ● La Ο géolocalisation est un tremplin naturel vers la cartographie Service d’images tuilées pour permettre une visualisation fluide et performante Géocodage (avant/inverse) : coordonnées ↔ adresses + services ad-hoc : itinéraires. street view.*.Location Modélisé par : latitude. // Mise en place de l'écoute des changements de position loc_list = new LocationListener() {…} // Laps (5sec) et distance (6m) minimums entre 2 updates lm.GeoPoint ↔ android. lieux d'intérêts. import android.location.GPS_PROVIDER. TEMPORARILY_UNAVAILABLE. vitesse..Coordonnées ● Chaque Ο Instance de com. list).maps.MapController Utilisé pour contrôller la carte. longitude) en coordonnées écran (x. cadastre.location. 5000.removeUpdates(loc_list).google.MapView coordonnée est un objet instance de la classe com. public class FindNearestAgency extends Activity { @Override public void onCreate() { // Choix du fournisseur de position GPS lm = (LocationManager)getSystemService(LOCATION_SERVICE). trafic.location.location. Ο Ο ● Choisir Ο une tierce API de cartographie // Ne pas oublier ! Fournie par des entreprises qui se sont spécialisées dans la cartographie ● Google. Ο L'API Google Maps est logiquement favorisée sous Android Google Maps – Élements clés ● MapView Ο Ο Voir aussi l'activité dédiée MapActivity Google Maps .maps. Mappy.. Il est possible de choisir le ''meilleur'' fournisseur par rapport à des critères Ο Géolocalisation : code source package fr..google.google. IGN (Territoire Français). longitude.Location ● ● Vue composite (ViewGroup) destinée à afficher une carte ● MapController Ο Ο Latitude et Longitude uniquement Exprimées en microdegrés et non plus en degrés (donc x 106) Instance de com..Overlay Permet d'utiliser un canvas pour dessiner autant de couches que nécessaires. détails additionnels dans les extras (Bundle) Consommation d'énergie Précision Capacité à déterminer l'altitude . cap. String gps_prov = LocationManager. ● Projection Ο des coordonnées ● Overlay Ο Ο Traduire des coordonnées géographique (latitude.. . } @Override public void onDestroy() { lm.android.LocationManager android.maps.google.android.maps.LocationProvider Exemple de constantes de la classe LocationManager : LocationManager.

. onLowMemory()..Application Gère des évènements propres à la vie de l'application ● onCreate()..shedule(new TimerTask() {.app.TextWatcher Gère des évènements : avant.XXXXX) Retour : LocationManager. pendingIntent) Ο Context. générateurs d'intents) Classe utilitaire android.text.ALARM_SERVICE) am.TELEPHONY_SERVICE Context.. après.WIFI_SERVICE Ο ● Les timers eux.Bluetooth : vue d'ensemble BluetoothDevice #1 Bluetooth Server Socket Bluetooth Socket Divers BluetoothDevice #2 BluetoothAdapter BluetoothDevice #3 Services système ● Il Alarmes et Timers ● Les Ο Ο est fréquent de récupérer des Managers à partir de services systèmes préconfigurés Ο Ο alarmes sont un moyen de déclencher des intents (et donc des composants) à des heures déterminées à des intervalles déterminés Appel de la méthode getSystemService(Context.. gèrent l'exécution de tâches new Timer(). pendant la saisie ● Principe Ο Ο du singleton Une seule instance de la classe pour toute l'application Les variables d'instances sont les données à partager . email. URL.}. Linkify. ● Exemples Ο Ο Ο Ο Ο de services (constantes) ● Prise Ο en charge par le gestionnaire d'alarmes Context. map.util..STORAGE_SERVICE Context.LOCATION_SERVICE Context. WifiManager. TIME. partager des données à travers tous les composants d'une application ? Créer une sous classe de android. onTerminate().set(TYPE.text. LayoutInflater. TextWatcher ● Transformer Ο Ο Application : variable globale ● Comment Ο Ο des textes (TextView) en liens cliquables (i.LAYOUT_INFLATER_SERVICE AlarmManager am = (AlarmManager)getSystemService(Context. onConfigurationChanged() Ο ● Contrôler Ο Ο la saisie d'un texte (EditText) Se déclare au niveau du nœud <application> du manifeste Classe utilitaire android.Linkify Reconnaissance de motifs : n° tel.e. new Date()).

com/androidmockup/ http://mokk. tels que des clics... Test de la couche métier ● Tests Ο Test de l'UI ● Le Ο unitaires de trois types de composants applicatifs Android Activités.0 :SendKey (ACTION_DOWN): 90 // KEYCODE_FORWARD= .56. des pressions de touches..Assert android.. MySQL.0 y=183.TestCase junit. Services.AndroidTestCase étend junit. PHP. . etc. ORMLite ActiveAndroid NeoDatis Ο Ο Ο DB4O Orman DataFramework Ο Androrm Requête Serveur Serveur HTTP HTTP Astuce : masquez le tout avec un ContentProvider Réponse (Oracle. et Providers test du singe sur votre IHM Idée : "si elle résiste au comportement anarchique d'un singe.me ..45 Mockups pour MobileApps ● Prototypage Ο de l'UI de votre MobileApp Dessiner les écrans avant de démarrer le développement Tests et déploiement ● Outils Ο Ο Ο Ο Ο Ο de mockups Balsamiq (web demo) MobiOne Studio (free) OmniGraffle (Mac. 192.test. JSON.test... ● Extension Ο Ο Ο JUnit pour Android Ο android. JSP/Servlets.) PosgreSQL. $99) http://yeblon.. des gestes. XML/SOAP.JSP/Servlets...framework.. (Oracle.. PHP.7.... PosgreSQL.. MySQL.InstrumentationTestRunner ● Le Ο programme s'exécute dans votre émulateur ● Se lance en ligne de commande adb shell monkey [options] <event-count> ● Mise Ο Ο en place d'un projet de test Ο Vous suivez les évènements générés dans le log ● ● ● Sous-répertoire tests/ de votre projet android Code source de vos tests + manifeste :Sending Pointer ACTION_DOWN x=437.framework.) BDD BDD + + ..Mapping objet-relationnel ● Le Ο Base de données distante ● La Ο vas-et-viens entre la BDD embarquée et les objets métiers est fastidieuse Appliquer le fameux pattern DAO connexion d'un périphérique Android à une BDD distante n'est pas prévue (ni souhaitable) Pas de pont "JDBC" en quelque sorte ● Il ● Il existe toutefois des solutions ORM adaptées à Android (car légères) Ο Ο Ο est nécessaire de mettre en place une approche par "WebService" Ο Ο SOAP REST . elle résistera à l'utilisateur" Génère des évènements pseudoaléatoires.

com/analytics Ο .....com/) AndroLib (http://fr.com/) Utilitaire zipalign. ● Principes Ο Ο de fonctionnement Affection d'un UA number de la forme UA-xxxxx-yy Insertion d'instructions de tracking (évènements.fr/~olegoaer/bankster.google.exe du JDK Procédure entièrement automatisée avec ADT Autopublier sur votre propre site Web ● ● Exemple : http://www.apk Type MIME pour le téléchargement : application/vnd.package-archive 2 Signer l'APK avec la clé privée ● Utilitaire jarsigner.univ-pau.exe du SDK Android Analyse d'audience ● Google Analytics Ο Ο Ο Ο SDK pour Android Nombre d'utilisateurs actifs de votre application Leur localisation à travers le monde Impact de votre campagne de pub (réalisation d'objectifs) Et plein d'autres métriques.android.bazaarandroid.Exporter et signer ● Toute Ο Distribution des MobileApps ●3 Ο application doit être signée solutions s'offrent à vous Choisir Google Play Store (Android Market) ● ● ● ● Signature digitale avec un certificat dont la clé privée est conservée par le(s) développeur(s) Signature avec la clé de débugage par défaut Site officiel : https://play.mobi/) Bazaar (http://www.com 25$ de frais de dossier pour l'accès au store 70% du prix de vente va aux développeurs (30% à Google) Les autres revenus générés sont reversés via Google Checkout Ο ● Trois 1 ● étapes : Ο Obtenir une clé privée (stockée dans un "keystore") Utilitaire keytool. affichages.google.androlib.) dans le code Tableau de bord disponible sur www.exe du JDK Ο Choisir un magasin alternatif ● ● ● 3 Optimiser l'APK qui vient d'être signé ● YAAM (http://yaam.