Docstoc

ANDROID

Document Sample
ANDROID Powered By Docstoc
					                                                                   Organisation du module
                    Programmation des                ● CM/TD/TP
                    systèmes mobiles &                 Ο   Cours magistraux : 5 heures
                                                       Ο   Travaux pratiques : 37,5 heures
                    sans fil
                                                     ● Évaluation
                                                       Ο   Contrôle continu : 1 séance (1h30)             [70%]
                                                       Ο   Note de TP : projet MobileApp (~6h)            [30%]
                                                     ● Ressources        pédagogiques
                           Olivier Le Goaer            Ο   Tout au format électronique (PDF) sur WebCampus
                           M2 TI – Année 2012-2013




              Prérequis du module                                  Plan du module

● Langages      de développement                     ● Avant-propos
  Ο   HTML, CSS, JavaScript, Java SE, PHP              Ο   Comprendre les tendances et les enjeux du développement
                                                           d'applications pour terminaux mobiles
● Formats     d'échange
                                                     ● Développer        une WebApp
  Ο   XML, JSON
                                                       Ο   Apprendre à développer une application Web compatible
● Outils    de développement                               mobile à l'aide du framework jQuery Mobile
  Ο   IDE Eclipse                                    ● Développer        une MobileApp
  Ο   phpMyAdmin
                                                       Ο   Apprendre à développer une application native sur la
● Base      de données                                     plateforme mobile Android
  Ο   SQL




                                                                   Un marché en explosion

                                                     ● Vente    de "terminaux mobiles" évolués
                    Avant-propos                       Ο   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                                                             SmartPhone

● Demande             croissante des entreprises                                                                                              ●     Écrans
  Ο    Définition et mise en œuvre de leur stratégie Web et/ou                                                                                      Ο    QVGA, WVGA...
       mobile                                                                                                                                       Ο    Mono/multi-touch
  Ο    Postes de « Développeur Applications Mobiles H/F »
                                                                                                                                              ● Capteurs
  Ο    Niveau Bac+5 (école d'ingénieur ou universitaire) exigé
                                                                                                                                                    Ο    GPS, boussoles,
                                                                                                                                                         accéléromètres...
● Une      offre de formation qui s'adapte                                                                                                    ● Connectivité
  Ο    Les écoles et universités intègrent peu à peu la                                                                                             Ο    GSM (voix + données),
       programmation mobile dans leurs plaquettes de formation
                                                                                                                                                         WiFi, Bluetooth, NFC
  Ο    L'université de Pau a lancé ce module dès 2008, en ciblant
       alors J2ME (Java 2 Micro Edition)




                 Réseaux sans fil                                                                      OS Mobile : l'offre actuelle

● Les      quatre catégories de réseaux sans fil



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




                                   Zone de couverture

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




                 OS mobile : développements                                                            Modèles de développement
 Plateforme              Programmation                     IDE conseillé
 Windows Phone           VB.Net, C#                        Visual studio .Net        ● MobileApp             versus WebApp
 iOS                     Objective-C                       X-CODE                                              Application mobile (native)                           Application web

 Blackberry OS           Java                              MDS Studio                Portabilité       Développement spécifique à chaque plateforme         Navigateur Web

                                                                                     Développement     Nécessite un SDK + connaissance d’un langage         Langage du Web (HTML / JS / CSS /
 Java ME                 Java                              EclipseME (CLDC, MIDP)                      spécifique                                           PHP...)
                                                                                     /coût
 Android                 Java, code natif C++              Eclipse + plug-in ADT     Mises à jour      Soumission à un magasin d’applications et            Mise à jour rapide en mettant à jour
                                                                                                       éventuelle validation + retéléchargement par le      tout simplement les fichiers sur le
                                                                                                       client                                               serveur Web
 Palm WebOS              JavaScript, C/C++                 Eclipse + webOS plug-in
                                                                                     Disponibilité     Mode online et offline                               Nécessite obligatoirement une
 Symbian OS              C++                               Performance                                                                                      connexion internet

                                                                                     Fonctionnalités   Utilise toutes les fonctionnalités du mobile (GPS,   Limitées aux possibilités du navigateur
 Brew MP                 C++                               Visual Studio + plug-in                     voix, notifications, contacts...)

 Bada                    C++                               badaIDE
                                                                                     ● HybridApp             : le modèle hybride
 MeeGo                   Qt C++                            QtCreator
 Firefox OS (B2G)        HTML5/CSS3/JavaScript             Xemacs ? ;-)                 Ο   Encapsulation d'une WebApp dans une MobileApp
 Ubuntu Mobile           C/C++, JavaScript                 Qt Creator                   Ο   Ce modèle de développement reste un compromis...
                  Arbre de décision                                                                                               Le défi du cross-plateforme

                                                                                                                ● Un       slogan : "Write once, 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, HTML, CSS...
                                                                                                                  Ο   Les langages mainstream
                                                                                                © Ekito.fr
                                                                                                                       ●    C++, Java...
                                                                                                                  Ο   Les langages dédiés (DSL)




                  Solutions cross-platform *
Nom
commercial
                  Programmation              Technique                    Commentaires                                                     Développer une
Titanium Mobile
Apache Cordova
                  JavaScript
                  HTML, CSS, JavaScript
                                             Interprétation
                                             Interprétation
                                                                                                                                           WebApp [avec
(PhoneGap)
NeoMAD            Java
                  Java
                                             Transcompilation
                                             Transcompilation
                                                                          API android-like
                                                                          API générique
                                                                                                                                           jQuery Mobile]
Codename One
MoSync            HTML5, JavaScript, C/C++   Transcompilation
appMobi           HTML5, JavaScript                                       IDE online
Canappi           DSL                        Transcompilation
Applause          DSL                        Transcompilation
IBM Worklight     HTML5, CSS3, JavaScript    Interprétation               - Basé sur PhoneGap
                                                                          - Middleware IBM fournit
Rhodes            Ruby, HTML, CSS,           Interpretation
                  JavaScript
...               ...                        ...                          ...

                                                   * Diapositive expérimentale – Merci de votre compréhension




                  Le browsing sur mobile                                                                                          WebApp mobile-friendly

● Le       browsing sur mobile est déjà une réalité                                                             ● Customisation                pour terminal mobile
      Ο   Il est aujourd'hui possible de reproduire une expérience                                                Ο   Renvoyer au terminal mobile une page adaptée à ses
          utilisateur similaire à celle d'une application native                                                      spécificités (mobile-friendly)
      Ο   Un site mobile sera toujours moins cher qu'une application                                              Ο   Taille écran limitée, débit limité, pointage tactile...
          développée dans un environnement propriétaire.
                                                                                                                ● Deux        solutions sont envisageables                                               Voir
                                                                                                                                                                                                    ''Media Query''
● Les    browsers et leur support des standards                                                                                                                                                         du W3C
                                                                                                                  1) Handheld stylesheets
      W3C sont donc au cœur des enjeux                                                                                 •    Fournir une feuille de style CSS spécifique aux périphériques mobiles
                                                                                                                            (media="handheld")
      Ο   Apple Safari, Google Chrome : moteur WebKit
                                                                                                                  2) Mobile-optimized site
      Ο   Microsoft IE : moteur Trident
                                                                                                                       •    En plus d'une feuille de style spécifique, fournir à l'utilisateur un niveau
      Ο   Mozilla Firefox : moteur Gecko                                                                                    global d'interactivité imitant les applications natives auxquelles il est habitué
      Ο   Opera : moteur Presto
                       Frameworks actuels

                       Sencha
                       Sencha
                       Touch
                        Touch

                                                                                      iUI
                                                                                       iUI


                                                  jQuery
                                                  jQuery
                                                  Mobile
                                                  Mobile

           jqTouch
            jqTouch




                                      Dojo
                                      Dojo                                     ...
                                                                                ...
                                     mobile
                                     mobile




                       Principes de base                                                                                         jQuery Mobile en images...

● Vous           allez créer des documents
     Ο    Conformes au doctype HTML 5
● Puis, 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                                                                                     Étape 2 : structure

● Des          bibliothèques sont requises                                                                                  l'attribut data-* dans votre
                                                                                                                   ● Exploitez
     Ο    Soit stockées en local sur votre serveur                                                                  document, où * est la fonctionnalité désirée
     Ο    Soit directement sur le serveur public à haute disponibilité                                               Ο   data-role – précise la nature du bloc (page|header|content|
          de jQuery.com                                                                                                  footer)
● Importation                  dans le document courant                                                              Ο   data-position – spécifie où l'élément doit être positionné (top|
                                                                                                                         bottom|right|left)
     Ο    Une feuille de style spécifique mobile (.css)                                                              Ο   data-inset – spécifie si l'élément doit être contenu dans les
     Ο    La bibliothèque JavaScript jQuery (.js)                                                                        marges ou à l'extérieur de celles-ci (true|false)
     Ο    La bibliothèque JavaScript jQuery Mobile (.js)                                                             Ο   data-transition – spécifie quelle transition utiliser lors du
                                                                                                       Versions
                                                                                                      compactées
                                                                                                                         chargement de nouvelles pages (slide|slideup|slidedown|
                                                                                                                         pop|flip|fade)
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" />
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script>
                                                                                                                     Ο   data-theme – spécifie le thème graphique à utiliser pour les
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script>
                                                                                                                         éléments d'un conteneur (a|b|c|d|e)
                        Template d'un document                                                                                            Deux approches possibles

<!DOCTYPE html>
<!DOCTYPE html>                                                                                                       ● Monopage                                              ● Multipages
<html>
<html>
<head>
<head>
     <title>Page Title</title>
      <title>Page Title</title>                                                                                         Ο    1 document = 1 page                                    Ο   1 document = n pages
     <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" />
      <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" />
     <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
      <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
     <script type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script>
      <script type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script>
</head>
</head>                                                                                                                                                                                                        Permet le
<body>
<body>                                                                                                                            HTML                                                                 HTML
                                                                                                                                                                                                       HTML   préfetching
                                                                                                                                  HTML                                                                         des pages
<div data-role="page" id=''foo''>
<div data-role="page" id=''foo''>

      <div data-role="header">
      <div data-role="header">
            <h1>Page Title</h1>                                                                                                   Page
                                                                                                                                  Page                                                                 Page
                                                                                                                                                                                                       Page
            <h1>Page Title</h1>
      </div><!-- /header -->
      </div><!-- /header -->                                                                                                                          lien interdocument

      <div data-role="content">
      <div data-role="content">
            <p>Page content goes here.</p>
            <p>Page content goes here.</p>
      </div><!-- /content -->
      </div><!-- /content -->                                                                                                                                                                          Page
                                                                                                                                                                                                       Page
      <div data-role="footer">
      <div data-role="footer">                                                                                                    HTML
                                                                                                                                  HTML
             <h4>Page Footer</h4>
              <h4>Page Footer</h4>
      </div><!-- /footer -->
      </div><!-- /footer -->
</div><!-- /page -->
</div><!-- /page -->                                                                                                                                                   lien intradocument
                                                                                                                                  Page
                                                                                                                                  Page                                                                 Page
                                                                                                                                                                                                       Page
</body>
</body>
</html>
</html>




                        Modèle de navigation                                                                                              Quelques composants

● Lien          intradocument                                                                                         ● Barre         d'outils
     Ο    Utilisez l'id de la page cible : <a href="#foo">next</a>                                                      Ο    header, footer, navbar...
     Ο    Le contenu de la page est déjà dans le DOM courant et une                                                   ● Formatage
          transition opère (cf. attribut data-transition)
                                                                                                                        Ο    Layout, blocs rétractables & effet accordéon...
● Lien          interdocument
                                                                                                                      ● Boutons
     Ο    Utilisez l'URL du document cible: <a
          href="./bar.html">next</a>                                                                                    Ο     simples, icônes, inline, groupes...
     Ο    Une requête Ajax est forgée, le contenu de la page est                                                      ● Listes
          ajouté au DOM courant et une transition opère
                                                                                                                        Ο    Simples, numérotés, imbriquées, séparateurs...
     Ο    Si le document cible est multipages, ajoutez
          rel="external" au lien, ou bien data-ajax="false"                                                           ● Formulaires                 (voir diapo suivante)




                        Formulaires                                                                                                       Dialogues

● Balise             classique                                                                                        ● Une page peut être stylisée en tant que boite
     Ο    <form action="form.php" method="POST">...</form>                                                             de dialogue modale
● Puis,           inclusion des éléments de HTML 5                                                                      Ο    Accapare l'écran jusqu'à ce qu'elle soit fermée
                                                                                                                        Ο    Utile pour : confirmation, message informatif, etc.
     Ο    Slider, case à cocher, bouton radio, menu déroulant...
                                                                                                                            <div data-role="page" id="foo">
● Pour           une mise en forme soignée                                                                                  <div data-role="page" id="foo">
                                                                                                                                        <div data-role="header" data-position="inline">
                                                                                                                                        <div data-role="header" data-position="inline">
                                                                                                                                              <h1>Attention</h1>
                                                                                                                                               <h1>Attention</h1>
                                                                                                                                        </div>
                                                                                                                                        </div>
     Ο    Utilisez des blocs dont le rôle est "fieldcontain"                                                                            <div data-role="content">
                                                                                                                                        <div data-role="content">
                                                                                                                                              <h1>Connectivité limitée</h1>
                                                                                                                                               <h1>Connectivité limitée</h1>
                                                                                                                                              <p>Vérifiez vos branchements...</p>
                                                                                                                                               <p>Vérifiez vos branchements...</p>
                                                                                                                                              <a href="#" data-role="button" data-rel="back">Ok</a>
                                                                                                                                               <a href="#" data-role="button" data-rel="back">Ok</a>
          <div data-role="fieldcontain">
          <div data-role="fieldcontain">
            <label for="name">Numéro client :</label>                                                                                   </div>
                                                                                                                                        </div>
             <label for="name">Numéro client :</label>                                                                      </div>
            <input type="text" name="name" id="name" value="" required />
             <input type="text" name="name" id="name" value="" required />                                                  </div>
          </div>
          </div>
                                                                                                                      ● Tout       se joue ensuite sur le lien vers la page
                                                                                                                        Ο    <a href="./foo.html" data-rel="dialog">Voir</a>
                 Catégories d'événements                                                                                     Gestion des événements

● Liés     au pointage/touché                                                                          ● Méthodes                  live() ou bien bind()                Pour fonctionner,
                                                                                                                                                                          doivent être
                                                                                                                                                                          positionnées
  Ο   tap, taphold, swipe, swipeleft/swiperight                                                           Ο    $('elem').live('eventName', callback);                       dans le
                                                                                                                                                                        document maître !
● Liés     au changement d'orientation de l'écran                                                      ● Exemples                  en vrac :
  Ο   orientationchange
                                                                                                        //s'applique à tout le document (non testé)
                                                                                                         //s'applique à tout le document (non testé)
● Liés     au défilement de l'écran                                                                     $(document).live('tap',function(event, ui){
                                                                                                         $(document).live('tap',function(event, ui){
                                                                                                            alert('Tapotage');
                                                                                                             alert('Tapotage');
                                                                                                        });
                                                                                                         });
  Ο   scrollstart, scrollstop
                                                                                                        //S'applique à toutes les pages
                                                                                                         //S'applique à toutes les pages
● Liés     à l'affichage des pages                                                                      $('div').live('pageshow',function(event, ui){
                                                                                                         $('div').live('pageshow',function(event, ui){
                                                                                                            alert('Affichage de la page active');
                                                                                                                                                                      Cf. fonctionnement des
                                                                                                             alert('Affichage de la page active');                        sélecteurs CSS :
                                                                                                        });
                                                                                                         });
  Ο   pagebeforeshow, pagebeforehide, pageshow, pagehide                                                                                                              $('div')
                                                                                                        //Ne s'applique qu'à une page donnée
                                                                                                         //Ne s'applique qu'à une page donnée                         $('div.foo')
                                                                                                        $('#aboutPage').live('pagecreate',function(event){
● Liés     à l'initialisation des pages                                                                  $('#aboutPage').live('pagecreate',function(event){
                                                                                                            alert('Cette page vient d'être améliorée par Jquery');
                                                                                                             alert('Cette page vient d'être améliorée par Jquery');
                                                                                                                                                                      $('div > p')
                                                                                                                                                                      $('#bar')
                                                                                                        });
                                                                                                         });
  Ο   pagebeforecreate, pagecreate




                 Et la "touche finale"                                                                                       Tester votre WebApp

● Immiter        une icône de lancement native                                                         ● Test       en visuel, via un terminal mobile
  Ο   Créer une favicon de 57x57 pixels, au format PNG                                                    Ο    Consulter le niveau de support (le grade) du navigateur
  Ο   <link rel="apple-touch-icon" href="myIcon.png" />                                                        http://jquerymobile.com/gbs/

● Solution                                                                                             ● Tester          en visuel, sans terminal mobile
                  sous iPhone et sous Android
                                                                                                          Ο    jQuery Mobile fonctionne sur un navigateur standard !
                                                                                                          Ο    Ripple Emulator (Extension pour Chrome)
                                                                                                               http://ripple.tinyhippos.com/
                                                                                                          Ο    Opera Mobile Emulator
                                                                                                               http://www.opera.com/developer/tools/mobile/
                                                                                                       ● Framework                    de test pour jQuery
                                                                                                          Ο    Qunit : http://docs.jquery.com/Qunit




                 Démo : Bankster

● Bankster
                                                                                Flashez pour accéder
                                                                                     à la démo                                          Développer une
                   : La banque des gangsters
  Ο   Plagie une WebApp mobile-friendly d'un organisme bancaire                                                                         MobileApp [sous
● Fonctionnalités              de l'application Bankster                                                                                Android]
  Ο   Partie publique
       ●   Formulaire d'identification, infos bourse (récupérés au format JSON), liste
           des agences (image google maps), annuaire
  Ο   Partie privée
       ●   Le client s'est authentifié, il a accès à son solde et aux opérations de
           virements
       ●   Exemples login/password : demo/demo, dsk/dsk
                        Bref historique                                                                             Open Handset Alliance (OHA)

                                                                                                  ● Regroupement                   de + de 50 entreprises
         2003                                       2007                        Voir annonce
                                                                               par Sergey Brin
                                                                                sur YouTube :
                                                                                                    Ο   Fabricants de matériels
Naissance de la startup
Naissance de la startup                  Annonce d'Android +SDK
                                         Annonce d'Android +SDK
     Android inc.
     Android inc.                         Open Handset Alliance
                                          Open Handset Alliance
                                                                            http://goo.gl/LejV9     Ο   Opérateurs mobile
                                                                                                    Ο   Développeurs d'applications
                                                                                                    Ο   ...


                                                                                                  ● Objectif         :
                                                                                                    Ο   Développer des normes ouvertes pour les appareils de
         2005                                           2008
                                                                                                        téléphonie mobile
 Rachat de la startup
 Rachat de la startup                      Premier mobile sous
                                           Premier mobile sous
   par Google inc.
   par Google inc.                        Android :: le T-Mobile G1
                                          Android le T-Mobile G1




                        Matériels Android                                                                           Points forts d'Android

                                          APN
                                          APN
                                                                                                        Point de vue constructeur              Point de vue utilisateur
                 Tablette
                 Tablette
                                                                                                               Système Linux
                                                                                                               Système Linux                    Système fonctionnel,
                                                                                                                                                Système fonctionnel,
                                                                                                                     ++                           intuitif, évolutif
                                                                                                                                                   intuitif, évolutif
                                                                                                                    Java
                                                                                                                    Java
                                                               Embarqué
                                                               Embarqué


   Smartphone
   Smartphone

                                                                                                         Point de vue bidouilleur             Point de vue développeur


                                                                                                                                              Applications développées
                                                                                                                                              Applications développées
                                                                                                              Projet Open Source
                                                                                                              Projet Open Source                   en syntaxe Java
                                                                                                                                                   en syntaxe Java
                                                                                                                  C++ // Java
                                                                                                                   C++ Java
                    Netbook
                    Netbook                                                                                                                     SDK complet fourni
                                                                                                                                                 SDK complet fourni
                                         Télévision
                                         Télévision




                        Versions d'Android                                                                          Android en images...
                                               CodeName             Platform         API Level
                                               Cupcake              Android 1.5      3
                                               Donut                Android 1.6      4
                                               Eclair               Android 2.1      7
                                               Froyo                Android 2.2      8
                                               Gingerbread          Android 2.3      9
                                               Honeycomb            Android 3.0      11
                                               Ice Cream Sandwich   Android 4.0      14
                                               Jelly Bean           Android 4.1      16
                                               Key Lime Pie         ?                ?
         November 1, 2012 – Google Inc         Kouign-Amann




                                                                                                                                                                   Version Ice Cream Sandwich (ICS)
                 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.6


                                                                                                                                *couche outrepassée dans le cas du NDK




                 Machine virtuelle "Dalvik"                                               Priorités des processus

● Offre     l'avantage de toute machine virtuelle                                         Processus actif
                                                                                          Processus actif                ● Android    gère ses
  Ο   Couche d'abstraction entre le développeur d'applications et                                                             ressources de
      des implémentations matérielles particulières
                                                                                         Processus visible
                                                                                                                              manière agressive
                                                                                         Processus visible
● La   VM Dalvik n'est pas une VM Java                                                                                          Ο   Pour garantir une haute
                                                                                                                                    réactivité
  Ο   Tient compte des contraintes de CPU et mémoire                                   Processus de service
                                                                                       Processus de service
                                                                                       en cours d'exécution
                                                                                        en cours d'exécution                    Ο   Élimination de processus
      Exécute des fichiers .dex (Dalvik Executable) optimisés
                                                                     Priorité




  Ο
                                                                                                                                    sans avertissement !
● LaVM créé une instance Dalvik pour chaque                                                                                     Ο   Politique de priorité basée
                                                                                      Processus d'arrière-plan
                                                                                      Processus d'arrière-plan
 application (i.e. processus lourds)                                                                                                sur une hiérarchisation
                                                                                                                                    des processus
  Ο   Les applications sont totalement indépendantes ("sandbox")
                                                                                          Processus vide
                                                                                          Processus vide
       ●   Espaces protégés (mémoire, disque)
       ●   Évite un plantage généralisé !




                 Le petit univers Java                                                    Outils du développeur

● Concepts          de la POO Java                                  ● Plugin           Eclipse ADT (Android Development Tools)
  Ο   Paquetage, classe, annotation, héritage, interface...             Ο       Assistant à la création de projets
● Idiomes                                                               Ο       Créateur d'interface graphique (WYSIWYG)
  Ο   Classes anonymes, classes internes, POJO...                       Ο       Vues et perspectives dédiées
● Bibliothèques            (API)                                    ● Android             SDK
                                                        Apache
  Ο   J2SE (subset) : java.io.*, java.lang.*...         Harmony         Ο       API
  Ο   Android : android.view.*, android.telephony.*...                  Ο       Émulateurs
  Ο   Google : com.google.android.maps.*...                             Ο       Débogeur, compilateur, empaqueteur, signature
● Design        patterns                                                Ο       Exemples (démos)
  Ο   Singleton, Builder, Observer (Listener), DAO...
                                                                        Ο       ...
                       Plugin ADT Eclipse                                                                                           Émulateur : aperçu
                                                                                                                                                                            Bouton         Bouton
                                                                                                                                                           Bouton           'MENU'         'BACK'
                                                                                                     Numéro du
                                                                                                                                                           'HOME'
● Perspectives                           ● Vues                                                       terminal




                                                                                                    Écran
                                                                                                  ''Tactile''




                                                                                                                                                                                                  Thème (skin)
                                                                                                                                                                                                   par défaut




                       Émulateur : limitations                                                                                      Arborescence système
                                                                                 Alternative :
                                                                                  AndroVM
                                                                                      sur
● Lent       au démarrage et à l'usage                                            VirtualBox

                                                                                                   Applications
  Ο   Emulation (i.e. niveau d'indirection) versus simulation                                    utilisateur (.apk)
                                                                                                 (AngryBirds, Météo...)

  Ο   Noyau Linux + extensions android                                                                                                                                                 Données des
                                                                                                                                                                                       applications
                                                                                                                                                                                      (database SQLite,

● Fonctionnalités                 non-disponibles                                                                                                                                    SharedPreferences...)




  Ο   Appareil photo (Camera↔Webcam supporté)
  Ο   Vibreur                                                                                       Applications
                                                                                                   système (.apk)
  Ο   Appels téléphoniques réels                                                                  (Horloge, Browser,
                                                                                                    Calculatrice...)


  Ο   Capteurs en général                                                                                                                                                                  Commandes
                                                                                                                                                                                            système
                                                                                                                                                                                         (mkdir, chmod, ls...)
  Ο   Connexions USB
  Ο   Évolution de la charge de la batterie




                       Arborescence projet                                                                                          Externaliser les ressources

                                                      Le plugin ADT                                   ● Android      prévoit de facto
                                                      gère et facilite
                     Dossier du
                       projet
                                                    cette structuration                                     l'externalisation des
                                                                                                            ressources
                 Vos fichiers
                                                                                                                Ο   Facilité de maintenance, de mise à
               sources (*.java)
                                                                                                                    jour et de gestion
                                                     Fichier source automatiquement généré
                                                      (à partir du contenu du répertoire res)
                                                                                                      ● Créer                   des ressources
          API Android
        (ici version 2.2)
                                                       Ressources non-organisées                                Ο   Simples valeurs, chaînes de
                                                           (zip, PDF, HTML...)
  Ressources organisées                                                                                             caractères, couleurs, menu, layout,
     (icônes, layout,
         textes...)                                                                                                 styles, images, etc.
                                                     Fichier Manifest
                                                                                                                Ο   Stockées dans les sous-
                                                                                                                    répertoires de /res/ du projet
                                                                                                                          ●   un seul niveau de profondeur est autorisé !
                         Compilation et déploiement                                                                           Environnement contraint
                                                                                      Entièrement
                                                                                       automatisé      ● Pour vos développements, gardez à l'esprit que
                                                                                        avec le
Sources Java      Bytecode Java         Bytecode Dalvik
                                        (optimisé)
                                                                                      plugin ADT
                                                                                     sous Eclipse !!
                                                                                                        les appareils mobiles ont :
                                               .dex
                                                .dex
                                                                                                         Ο   Une puissance processeur plus faible
   .java
    .java                .class
                          .class
                                                                                                         Ο   Une RAM limitée
                                                                                                         Ο   Des capacités de stockage permanent limitées
                                                               .apk
                                                                .apk
                                                                                                         Ο   De petits écrans avec de faibles résolutions
                                                                                                         Ο   Des coûts élevés de transfert de données
               Ressources + Manifest                        Application                    /data/app     Ο   Des taux de transfert plus lents avec une latence élevée
                                                            empaquetée
                             .png
                              .png                                                                       Ο   Des connexions réseau moins fiables
                             .xml
                              .xml
                                                                                                         Ο   Des batteries à autonomie limitée




                                                                                                                              Types d'applications Android

                                     Construction d'une                                                                                                   Application
                                                                                                                                                          Application
                                                                                                                                                         d'arrière plan
                                                                                                                                                         d'arrière plan
                                     application Android                                                        Application
                                                                                                                Application
                                                                                                                                                           (ex: répondeur
                                                                                                                                                            (ex: répondeur
                                                                                                                                                        automatique aux SMS)
                                                                                                                                                        automatique aux SMS)
                                                                                                              de premier plan
                                                                                                              de premier plan
                                                                                                                   (ex: jeu de Poker)
                                                                                                                    (ex: jeu de Poker)




                                                                                                                                                                               Widget
                                                                                                                                                                               Widget
                                                                                                                                                                           (ex: météo du jour)
                                                                                                                                                                            (ex: météo du jour)

                                                                                                                                Intermittente
                                                                                                                                 Intermittente
                                                                                                                              (ex: lecteur de média)
                                                                                                                               (ex: lecteur de média)




                         Les différents composants                                                                            Le manifeste

                                                                                                       ● Chaque projet contient à sa racine un fichier
            Activities                           Services                            Intents
                                                                                                        AndroidManifest.xml qui :
                                                                          Activations & messages
                                                                          Activations & messages
    Écrans de présentation
    Écrans de présentation                Tâches d'arrière-plan
                                          Tâches d'arrière-plan            inter/intra-applications
                                                                            inter/intra-applications
                                                                                                         Ο   Nomme le paquetage Java de l'application. Ce dernier sert
                                                                                                             d'identificateur unique de l'application.
                                                                                                         Ο   Déclare les composants applicatifs (activities, services,
                           Content Providers                Broadcast Receivers                              broadcast receivers, content providers) de l'application et
                                                                                                             leurs filtres si nécessaire (à quels intents ils réagissent)
                          Sources de données
                          Sources de données                   Réactions à des
                                                               Réactions à des
                             partageables
                             partageables
                                                            Ecrans de présentation
                                                            Ecrans de présentation
                                                            annonces/évènements
                                                            annonces/évènements
                                                                                                         Ο   Déclare les permissions que l'application doit avoir pour
                                                                                                             fonctionner (droit de passer des appels, droit d'accéder à
                                                                                                             Internet, droit d'accéder au GPS...)
                                                Manifeste
                                                                                                         Ο   Déclare le niveau minimum de compatibilité du SDK pour
                                            Métadonnées,
                                            Métadonnées,
                                                                                                             que l'application fonctionne
                                         composants, prérequis
                                         composants, prérequis                                           Ο   ...
                             AndroidManifest.xml                                                                                          Notion de contexte
                                                                                                        Pensez à bien
                                                <?xml version="1.0" encoding="utf-8"?>                  déclarer tous
                                                                                                       les composants
                                                <manifest package="fr.univpau.bankster">
                                                                                                         applicatifs de     ● Lecontexte modélise les informations globales
Permissions requises                                <uses-permission />                               votre application !
                                                    <uses-sdk />
                                                    <supports-screens />                                                     sur l'environnement de l'application
Nœud de l'application                               <application>

Nœud d'une activité de l'application                    <activity>
                                                                                                                            ● Possède       les méthodes importantes
                                                            <intent-filter>
                                                                <action />
                                                                <category />
                                                                <data />
                                                                                                                              Ο   getRessources, getPackageName, getSystemService...
                                                            </intent-filter>
                                                        </activity>                                                           Ο   startActivity, startService, sendBroadcast, getContentResolver...
Nœud d'un service de l'application                      <service>
                                                            <intent-filter> . . . </intent-filter>
                                                                                                                              Ο   openFileInput, openOrCreateDatabase, getSharedPreferences...
                                                        </service>

Nœud d'un broadcast receiver de l'application           <receiver>                                                          ● Accès     au contexte
                                                            <intent-filter> . . . </intent-filter>
                                                        </receiver>

Nœud d'un content provider de l'application             <provider>
                                                                                                                              Ο   Depuis une Activity ou un Service : this (car héritage)
                                                            <grant-uri-permission />
                                                        </provider>                                                           Ο   Depuis un BroadcastReceiver : en argument de onReceive()
                                                    </application>

                                                </manifest>
                                                                                                                              Ο   Depuis un ContentProvider : this.getContext()




                             Activité                                                                                                     Cycle de vie d'une activité

     ● Une           activité ≈ un écran graphique                                                                          ●7    méthodes de callback
           Ο    Incarne souvent un cas d'utilisation (use case UML)                                                           Ο   void onCreate(...)
     ● Une           application est formée de n activités                                                                    Ο   void onStart()

     ● Exemple                                                                                                                Ο   void onRestart()
                                 : application de téléphonie
                                                                                                                              Ο   void onResume()
           1) Numéroteur
                                                                                                                              Ο   void onPause()
           2) Annuaire des contacts
           3) Fiche d'un contact
                                                                                                                              Ο   void onStop()

           4) Ajout d'un contact                                                                                              Ο   void onDestroy()

     ● Étend             android.app.Activity
                                                                                Diagramme de cas d'utilisation (UML)




                             Activité : code source                                                                                       Lancer une activité

            package fr.univpau.bankster;                                                                                    ● Pourpouvoir être lancée, toute activité doit être
                                                                                                    Le bundle sert à
            import android.app.Activity;
                                                                                                    mémoriser l'état
                                                                                                        de l'UI de           préalablement déclarée dans le manifeste
                                                                                                  l'activité lorsqu'elle
            public class Home extends Activity {                                                        passe en
                                                                                                      arrière plan          ● Une  activité est désignée comme activité initiale
                   @Override
                   public void onCreate(Bundle savedInstanceState) {                                                         de l'application
                       super.onCreate(savedInstanceState);

                   }
                      /* Allocation des ressources ici */                                                                     Ο   Ceci est indiqué dans le fichier manifeste
                  @Override                                                                                                 ● Lancer     une activité
                  protected void onDestroy() {
                      super.onDestroy();
                      /* Désallocation des ressources ici */
                                                                                                                              Ο   Méthode startActivity(...)
                  }
            }                                                                                                               ● Lancerune activité en vue d'obtenir un résultat
                                                                                                                             en retour
                                                                                                                              Ο   Méthode startActivityForResult(...)
              La pile des activités                                                 Multitâches

    activités sont
● Les                                                                          piles d'activités peuvent coexister
                                                                     ● Plusieurs
 empilées/dépilées                                                    avec Android
  Ο   Empilée quand une activité                                       Ο   L'utilisateur passe de l'une à l'autre
      démarre
  Ο   Dépilée (i.e. détruite) quand
      on presse le bouton 'BACK'
● Une pression sur le
 bouton 'HOME' ne
 dépile pas l'activité.
  Ο   Elle passe simplement en                                                                                                            Reprend l'activité
                                                                                                                                             située au
      arrière plan                                                                                                                          sommet de
                                                                                                                                               la pile




              Service                                                               Cycle de vie d'un service

     à effectuer des opérations ou des calculs
● Sert                                                               ●5    méthodes de callback
 en dehors de l’interaction utilisateur                                Ο   onCreate()
  Ο   Ne nécessite pas une interface graphique                         Ο   onStart()    SDK<2.0
● Deux      types de services :                                        Ο   onStartCommand()
  Ο   Local : service qui s’exécute dans le même processus que         Ο   onDestroy()
      votre application                                                Ο   onBind()
  Ο   Distant (IPC) : service qui s’exécute dans des processus
      indépendants de votre application (nécessite une description
                                                                       Ο   onUnbind()
      AIDL)
● Un   service est une classe qui étend                                        dans le
                                                                     ● S'exécute
  Ο   android.app.Service                                             processus courant




              Service : code source                                                 Appel d'un service

        package fr.univpau.bankster;                                 ● Mode      Unbounded                       ● Mode      Bounded
        import android.app.Service;                                    Ο   Un composant démarre et                 Ο   Des composants (appelés
        public class AccountCleaner extends Service {                      arrête un traitement en                     "clients") établissent une
            @Override                                                      tâche de fond comme il le                   connexion permanente
            public void onCreate() {                                       souhaite                                    afin d'interagir avec un
                /* Allocation des ressources ici */
            }                                                                                                          service par le biais d'une
            @Override                                                ● Opérations                                      interface
            void onStartCommand(Intent intent,
                               int flags, int startId) {               Ο   startService(...)                     ● Opérations
                /* Votre code du service ici */
            }
                                                                       Ο   stopService(...)
            @Override                                                                                              Ο   bindService(...)
            protected void onDestroy() {
                super.onDestroy();
                /* Désallocation des ressources ici */                                         Un même service
                                                                                                                   Ο   unbindService(...)
            }                                                                                   peut supporter
                                                                                                 les 2 modes       Ο   + toutes les méthodes de
        }                                                                                       simultanément
                                                                                                                       l'interface java définie
                      Intents : principes                                                                                          Intents : vue d'ensemble

● Troistypes de composants applicatifs sont                                                                                                   startActivity(Intent)
                                                                                                                      Main Activity           startActivityForResult(Intent)                            Activity
 activés via des intentions (Intents)                                                                                                         finishActivity(int)


                                                                                                                 onActivityResult(Intent)
                                                                                                                 onActivityResult(Intent)                               setResult(Intent)           Intent getIntent()
                                                                                                                                                                                                     Intent getIntent()
  Ο   Activity, Service et BroadcastReceveir
● Principe              d'un bus à messages asynchrones                                                      sendBroadcast(Intent)
                                                                                                      sendOrderedBroadcast(Intent)
                                                                                                        sendStickyBroadcast(Intent)
                                                                                                                                              startService(Intent)
                A                       S                               B                                                                     stopService(Intent)
                                                                                                                                              bindService(Intent)


                       Filtre                  Filtre                          Filtre                                                                                                                   Service
                    d'intentions            d'intentions                    d'intentions                          BroadcastReceiver
                        de A                    de S                            de B

                                                                                                                                                                                               onStartCommand(Intent)
                                                                                                                                                                                               onStartCommand(Intent)
                                                                                                                     onReceive(Intent)
                                                                                                                     onReceive(Intent)                                                          IBinder onBind(Intent)
                                                                                                                                                                                                 IBinder onBind(Intent)
                              Intent
                               Intent

                                                                                       Bus




                      Natures des intents                                                                                          Intents : les extras

● Types                                         ● Désignations                                            ● Il   est possible d'utiliser l'intent pour convoyer
  1. Direct                                           1. Explicite                                              des données supplémentaires
       ●   Instance de                                     ●   Le composant cible est nommé                      Ο   Une à une, ou regroupées dans un bundle
           android.content.Intent                          ●   « Activer tel composant »                             (android.os.Bundle)
       ●   Le composant cible est activé
                                                      2. Implicite                                        ● Stockage
           par le composant source                                                                                                    sur le principe d'une table de hash
  2. Par procuration                                       ●   Le composant cible n'est pas
                                                               nommé                                             Ο   Méthode putExtra surchargée
       ●   Instance de                                     ●   « Activer un composant capable de
           android.content.PendingIntent
                                                               prendre en charge cette action, sur
                                                                                                                 Ο   Les types de base (+array) sont gérés
       ●   Le composant cible est activé                       cette donnée »
           par un élément tiers, de la part
                                                                                                                 Ο   Les types complexes (c-a-d les classes) doivent
           du composant source (toutes
                                                           ●   Les filtres d'intention indiquent au                  implémenter Parcelable,ou Serializable
           ses permissions lui sont                            bus si le message d'activation
                                                               doit être délivré au composant
           cédées pour l'occasion)                                                                        ● Récupération
                                                                                                                 Ο   Méthode propre à chaque type, de la forme getXXXExtra()




                      Intent : code source                                                                                         Actions et URI courantes

      package fr.univpau.bankster;                                                                              Action                         URI                                              Signification
                                                                                                          ACTION_EDIT        content://contacts/people/125                     Éditer la fiche du contact 125
      import android.app.Activity;
      import android.content.Intent;                                                                      ACTION_VIEW        geo:49.5000,123.5000                              Ouvrir l’application de géolocalisation à
                                                                                                                                                                               la position donnée (latitude, longitude).
      public class Home extends Activity {                                                                ACTION_CALL        tel:0156601234                                    Appeller le numéro

            void goToNextScreen() {                                                                       ACTION_VIEW        google.streetview: cbll=49.5000,123.5000          Ouvrir google street view à la localisation donnée
                                                                                                          ...                ...                                               ...
                      Intent i = new Intent();    /* Intent de type direct */
                      i.putExtra("happy", false); /* Donnée additionnelle */

                      if(je_connais_la_cible) {                                                           ● Actions                natives android
                          /* Désignation explicite (implémentation) */
                          i.setClass(Home.this, NextActivity.class);
                      } else {
                                                                                                                 Ο   Constantes de la classe android.content.Intent
                          /* Désignation implicite (action + data) */
                          i.setAction(Intent.ACTION_DIAL);                                                ● Format                 d'une URI
                          i.setData(Uri.parse("tel:01-56-60-12-34"));
                      }
                      this.startActivity(i); /* Poussé sur le bus */                                             Ο   scheme://host:port/path
            }
      }                                                                                                          Ο   schemes usuels : http, mailto, tel, mms, geo, file...
                 Filtres d'intention                                                                       Résolution des intentions

● Chaque   composant peut définir ses filtres                                 ● Repose                      sur le mode de désignation choisi
 d'intention au niveau du manifeste                                                   Ο   Explicite : le composant cible est exécuté
  Ο   ACTION : Quelles actions sont supportées ?                                      Ο   Implicite : 0, 1 ou plusieurs composants sont éligibles
  Ο   DATA : Pour des données de quelle nature ?                                           ●       Dans le cas spécifiques des activités, comme une seule d'entre elles peut
                                                                                                   être exécutée, l'utilisateur sera invité à faire un choix
  Ο   CATEGORY : Dans quelles circonstances ?
                                                                                                         A1                               A2                                A3
● Permettra au bus de savoir si le message
 d'activation (i.e. l'intent) doit être délivré au                        ACTION_VIEW
                                                                                                         <activity android:name="A1">     <activity android:name="A2">
                                                                            tel:112
 composant ou non                                                                                           <intent-filter>                <activity android:name="A2">
                                                                                                                                             <intent-filter>                     <activity android:name="A3">
                                                                                                               <action name="...VIEW"/>       <intent-filter>
                                                                                                                                                <action name="...VIEW"/>         </activity>
                                                                                                               <data scheme="http"/>             <action name="...VIEW"/>
                                                                                                                                                <data scheme="tel"/>
                                                                                                            </intent-filter>                     <data scheme="tel"/>
                                                                                                                                             </intent-filter>
                                                                                                         </activity>                          </intent-filter>
                                                                                                                                          </activity>
                                                                                                                                           </activity>

● L'absence  de filtres implique une désignation
 explicite du composant
                                                                                                                                                                                      Bus




                 Mécanisme de résolution                                                                   Actions personnalisées

● Principe        d'un chargeur de classes                                    ● Définir                  ses propres verbes d'action
                                                                                               package fr.univpau.bankster;
  Ο   Liaison statique dans le cas d'une désignation explicite                                 public class Home extends Activity {
       ●   la classe à charger est connue au moment de la compilation                                public static final string DEBITER = "fr.univpau.bankster.DEBITER";

  Ο   Liaison dynamique dans le cas d'une désignation implicite                                      @Override
                                                                                                     public void onCreate(Bundle savedInstanceState) {
                                                                                                           startService(new Intent(Home.DEBITER));
       ●   la classe à charger sera découverte au moment de l'éxécution                              }
                                                                                               }
● Mécanisme  implémenté par                                                   ● Déclarer                      des filtres en conséquence
 com.android.server.IntentResolver
                                                                                               <manifest>
  Ο   Mise en correspondance des intentions (« la demande ») et                                    <application>
                                                                                                       <service android:name="AccountManager">
      des filtres d'intentions disponibles (« l'offre »)                                                   <intent-filter>
                                                                                                               <action android:name="fr.univpau.bankster.DEBITER"/>
                                                                                                               <category android:name="android.intent.category.DEFAULT"/>
  Ο   Calcul de correspondance basé, dans l'ordre, sur                                                     </intent-filter>
                                                                                                       </service>
                                                                                                   </application>
       ●   Les Actions, puis les Catégories, et enfin les Data                                 </manifest>




                 Applications et Tâches                                                                    Broadcast receiver

      une application peut faire appel à des
● Ainsi,                                                                      ● Réagit       à aux annonces diffusées à l'aide
 "morceaux" d'autres applications                                                     sendBroadcast(...)
  Ο   Réutilisation/partage de composants voulu par Android                           Ο   System-defined : la batterie est faible, un SMS vient
                                                                                          d'arriver, etc.
● Unesuccession d'activités pour atteindre un
                                                                                      Ο   User-defined : solde bancaire négatif, etc.
 objectif donné est appelée "Tâche"
                                                                              ● Ne         nécessite pas une interface graphique
  Ο   Les activités empilées proviennent de diverses applications
  Ο   Complètement transparent du point de vue de l'utilisateur               ● Un         broadcast receiver est une classe qui étend
● Une application peut possèder plusieurs points                                      Ο   android.content.BroadcastReceiver
 d'entrée (pas de "main" unique donc)                                         ● Un      receiver s'abonne/désabonne via le fichier
  Ο   Il est possible de lancer n'importe quelle partie exposée                       manifest ou programmatiquement
      d'une application via le manifest, sans en lancer la totalité
                     Receiver : code source                                                           Content Provider

           package fr.univpau.bankster;                                                ● Uncontent provider sert à rendre une partie
           import android.content.BroadcastReceiver;
                                                                                        des données d'une application accessibles aux
           public class Sleep extends BroadcastReceiver {
                                                                                        autres applications
                  @Override
                  public void onReceive(Context arg0, Intent arg1) {                     Ο   Seul moyen pour un partage de données interapplications
                      //si besoin, accéder aux extras de l'intent arg1
                      Intent i = new Intent(arg0, AccountCleaner.class);
                      arg0.startService(i);
                                                                                       ● Un     content provider est une classe qui étend
                  }
           }
                                                                                         Ο   android.content.ContentProvider
                                                                                              les données via une URI dont le
                                                                                       ● Expose
           <manifest>
               <application>
                                                                                        schème dédié est 'content'
                   <receiver class="fr.univpau.bankster.Sleep">
                       <intent-filter>
                           <action android:name="android.intent.action.SCREEN_OFF"/>     Ο   System-defined : content://sms/inbox/125
                       </intent-filter>
                   </receiver>
               </application>                                                            Ο   User-defined : content://fr.univpau.bankster/account/28854165
           </manifest>




                     Résolution de contenu                                                            Content Resolver : exemples

● Différentes              techniques de persistance
                                                                                                      content://call_log/calls
  Ο   Fichier binaire (sérialisation d'objets)                                         SpyApp                                          Content Providers Natifs

  Ο   Fichier XML/JSON                                                                                                                         Settings
  Ο   Base de données embarquée ou distante
                                                                                                                + delete()
                                                                                                                + delete()                     CallLog
  Ο   Etc.                                                                                                      + insert()
                                                                                                                + insert()
                                                                                                                + notifyChange()
                                                                                                                + notifyChange()
                                                                                                                + query()
                                                                                                                + query()
● Lafaçon dont sont réellement stockées les                                                                     + update()
                                                                                                                + update()
                                                                                                                                           MediaStore.Images

 données doit rester transparente                                                                                           Content        MediaStore.Audios
                                                                                                                            Resolver
  Ο   Interface commune pour manipuler les données offerte par
      un content provider
  Ο   Elle s'obtient via un contentResolver
       ●       ContentResolver cr = getContentResolver();




                     URI et type MIME                                                                 Provider : code source
                                                                                                package fr.univpau.bankster;
● Publier            l'URI de votre provider                                                    import android.content.ContentProvider;
  Ο   Elle sera utilisée pour y accéder via le ContentResolver                                  public class AccountProvider extends ContentProvider {
  Ο   public static final URI CONTENT_URI =                                                         public static final URI CONTENT_URI =
                                                                                                         Uri.parse("content://fr.univpau.bankster/account");
      Uri.parse("content://fr.univpau.bankster/account");
                                                                                                    public boolean onCreate() {
● Deux          cas de figure :                                                                         /* Initialiser la source de données ici */
                                                                                                        return true;
                                                                                                    }
  1) Un seul enregistrement
                                                                                                    public Cursor query(Uri uri, String[] projection, …) {
       ●       URI          : content://fr.univpau.bankster/account/[id]                                /* En fonction du format de l'URI */
       ●       Type MIME : vnd.android.cursor.item/fr.univpau.bankster                                  if (uri_termine_par_un_ID) {
                                                                                                            /* Renvoyer un seul compte client */
  2) Plusieurs enregistrements                                                                          } else {
                                                                                                            /* Renvoyer tous les comptes */
       ●       URI          : content://fr.univpau.bankster/account/                                    }
                                                                                                    }
       ●       Type MIME : vnd.android.cursor.dir/fr.univpau.bankster
                                                                                                }
                                                                                              Principe de R.java

                   Interface graphique                                          ● Chaque  élément défini dans le répertoire /res
                                                                                  impacte le fichier R.java (à ne pas toucher)
                   utilisateur (GUI)                                              Ο   Génération automatique de classes internes à la classe R,
                                                                                      ainsi que des constantes de type entier sur 32bits
                                                                                ● Chemin       d'accès aux ressources via R.java
                                                                                  Ο   user-defined : fr.univpau.foo.R.color.rose_bonbon
                                                                                  Ο   system-defined : android.R.color.darker_gray
                                                                                ● Objet    java représentant les ressources
                                                                                  Ο   Instance de la classe android.content.res.Resources
                                                                                  Ο   Ressources du projet en cours : context.getResources()




             R.java                                                                           Exploiter les ressources

public final class R {                                                          ● Utiliser   des ressources depuis le code
    public static final class attr {                    Le fichier R permet
    }
    public static final class drawable {
                                                         de tirer parti d'une     Ο   La plupart des éléments de l'API sont prévus pour accepter
                                                             vérification
        public static final int icon=0x7f020000;          syntaxique par              des ressources Android en paramètre (int ressource)
    }                                                     le compilateur
    public static final class id {                                                Ο   obj.setColor(R.color.rose_bonbon);
        public static final int editText1=0x7f050000;
        public static final int listView1=0x7f050001;
    }
                                                                                  Ο   obj.setColor(android.R.color.darker_gray);
    public static final class layout {
        public static final int main=0x7f030000;        Le fichier R permet     ● Référencer           des ressources depuis d'autres
    }                                                    de tirer parti d'une
    public static final class string {
        public static final int app_name=0x7f040001;
                                                              complétion
                                                             automatique          ressources
                                                            de code dans
        public static final int hello=0x7f040000;
    }
                                                          l'éditeur Eclipse       Ο   attribute="@[packageName]:resourcetype/resourseIdent"
}
                                                                                  Ο   <EditText android:textColor="@color/rose_bonbon"/>
                                                                                  Ο   <EditText android:textColor="@android:color/darker_gray"/>




             UI : User Interface                                                              Les Vues Android
                                                                                                                                            View
                                                                                                                             0..*
● Une API     Java riche                                                        ● Principedu                                         +onDraw(Canvas canvas)
                                                                                                                                     +invalidate()

  Ο   Des layouts et des widgets (appelés « Vues »)                               design pattern
● Programmation          déclarative à la XML                  Mais peut se
                                                                                  Composite                         ViewGroup                                 ViewSimple
                                                               faire de façon
                                                                   100%
  Ο   Sépare la vue du code métier                           programmatique
                                                                                                                 +addView(View child)


● Fonctionnalité      de personnalisation
                                                                                ● ViewGroup                            ● ViewSimple (widget)
  Ο   Hériter et redéfinir un widget de base
                                                                                  Ο   LinearLayout                           Ο      Button
  Ο   Combiner des widgets existants
                                                                                  Ο   TableLayout                            Ο      EditText
  Ο   Dessin 100% personnalisé - View::onDraw(Canvas canvas)
                                                                                  Ο   RelativeLayout                         Ο      TextView
● Rendu     2D/3D (non abordé dans ce cours)                                      Ο   FrameLayout                            Ο      Spinner
  Ο   OpenGL, Renderscript                                                        Ο   ScrollView                             Ο      CheckBox
                 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 | ...




                 Propriétés de placement                                                                Widgets : aperçu

● Poids
  Ο   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
                                                                                                        Fragments
                 des vues
● Lorsqu'une           activité passe en arrière-plan                                     ● Nouveauté        depuis Android 3.0
  Ο   L'état de tous les widgets (munis d'un id) sont                                       Ο   Prévus pour les écrans plus larges, comme les tablettes
      automatiquement sauvegardé/restauré via un bundle
                                                                                          ● Principe     de base
● Lorsqu'une           activité doit être recréée                                           Ο   Fragmentation de l'espace d'affichage en différentes zones,
  Ο   Deux cas de recréation complète suite à une destruction                                   chargeables indépendamment
       1. L'activité change de configuration (orientation, langage...)                      Ο   Même idée que les "Frames" en HTML
       2. L'activité passe en arrière plan mais est tuée par le système (réquisition !)
                                                                                          ● Un   fragment est une classe qui étend
  Ο   Sauvegarde/restauration manuelle via un bundle
       ●   onSaveInstanceState() et onRestoreInstanceState()                                Ο   android.app.Fragment
  Ο   Pour qu'un objet survive à un changement de configuration                           ● Les fragments sont ensuite attachés/détachés à
           onRetainNonConfigurationInstance() et getLastNonConfigurationInstance()
       ●
                                                                                            une activité hôte
               Activités dédiées                                                        Dialogues et Toasts

     de simplifier les choses, il existe des
● Afin                                                                   ● Dialogues                           ● Toasts
 classes prédéfinies à étendre directement                                  Ο   Confirmation                       Ο   Message compact et
  Ο   ListActivity : si votre activité présente une liste d'items                                                      rapide à l'intention de
                                                                                                                       l'utilisateur
  Ο   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         Ο   Progession
      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)




               Menus                                                                    Barres

● Menu      principal                   ● Menu          contextuel       ● Barre     d'action rapide           ● Barre      d'action




               Thèmes et styles                                                         Instanciation des vues

● Un   thème correspond à une "feuille de styles"                           est nécessaire d'instancier les vues (i.e.
                                                                         ● Il
  Ο   Ensemble de styles à appliquer à une activité                        obtenir des objets) pour pouvoir les manipuler
  Ο   Thèmes par défaut : Theme.Holo.Dark, ...                           ● Récupérer         les widgets depuis le code
● Un   style est une ressource Android                                      Ο   Grâce aux identifiants affectés à chaque vue
  Ο   System-defined : android.R.style.Widget_Button, ...                   Ο   Button myButton = (Button) findViewById(R.id.my_button);
  Ο   User-defined : R.style.Joli, R.style.Joli2, ...                    ● Récupérer         toute une vue depuis le code
  Ο   Héritage de style possible en xml (parent="@style/Joli")              Ο   Désérialiser (inflate) un fichier XML décrivant un layout ou
                                                                                un menu
● Chaque       vue est stylisable
                                                                            Ο   View my_view = LayoutInflater.inflate(R.layout.main, null);
  Ο   Propriétés : taille, padding, background, textColor, ...
                                                                            Ο   MenuInflater.inflate(R.menu.control, my_menu);
  Ο   Un seul style applicable à la fois (android:style="@style/Joli")
                   Gestion des évènements                                                                                 Les adaptateurs

● Principe           des écouteurs de Java SE                                                               adaptateurs sont des classes qui lient des
                                                                                                        ● Les
  Ο   Fournir une implémentation respectant un contrat (interface)                                       données aux vues de l'UI
      afin de réagir à des types d'évènements particuliers                                                Ο   Les vues concernées étendent android.widget.AdapterView
● Gestion          du KeyPad (tap, trackball)                                                           ● Classes          d'adaptateurs
  Ο   OnClickListener, OnLongClickListener                                              Bizarrerie :
                                                                                         un seul          Ο   Héritent de android.widget.BaseAdapter
                                                                                          listener
       ●   onClick(View), onLongClick(View)                                            par widget :-/
                                                                                                          Ο   SimpleAdapter, ArrayAdapter<?> : sert à récupérer des
  Ο   OnKeyListener
                                                                                                              données stockées dans une collection
       ●   onKeyUp(KeyEvent), onKeyDown(KeyEvent)
                                                                                                               ●    Exploite par défaut la valeur de la méthode toString() des objets de la liste
● Gestion          du TouchScreen (pression, gesture)                                                     Ο   CursorAdapter : sert à récupérer des données stockées
  Ο   OnTouchListener                                                                                         dans une base de données relationelle (SQLite)
       ●   onTouchEvent(MotionEvent)                                                                      Ο   Vous pouvez étendre ces classes de base pour gérer
                                                                                                              finement vos items (conseillé)




                   Model-View-Presenter (MVP)                                                                             Apparences des items
                                                                     Register/Unregister
                                                                         Observers
                                                                                                        ● L'apparence des items sont définies par défaut
                                           PRESENTER
                                           PRESENTER                                                     par des layouts système
      Notify data changed                  BaseAdapter
                                           BaseAdapter
                                           (CursorAdapter,
                                                                                                          Ο   android.R.layout.simple_spinner_item
                                            (CursorAdapter,
                                           ArrayAdapter, ...)
                                           ArrayAdapter, ...)                                                  ●    spécifie un texte aligné à gauche et un bouton radio à droite, ainsi qu'un
                                                                              adapted-by                            texte noir sur fond blanc.
                              query data
                                                                                                          Ο   android.R.layout.simple_list_item_1
                                                           refresh
                                                                                                               ●    Spécifie un texte aligné à gauche, ainsi qu'un texte blanc sur fond
                                                                                                                    transparent.
              MODEL
              MODEL                                                             VIEW                      Ο   ...
                                                                                VIEW
              Cursor ou
              Cursor ou
              Collection
              Collection
                                                                            AdapterView
                                                                            AdapterView
                                                                          (Spinner, ListView...)
                                                                                                        ● Vouspouvez évidemment définir vos propres
             (ArrayList, [[ ]...)                                          (Spinner, ListView...)
              (ArrayList, ]...)
                                                                                                         layouts pour créer des items plus complexes
                                                                                                          Ο   fr.univpau.bankster.R.layout.mon_bel_item




                   Notifications                                                                                          Application Multi-écrans

● Différentes                formes                                                                     ● Prévoir        différentes variantes d'une même image
  Ο   LED                                                                                                 Ο   /res/drawable-hdip/icon.png
  Ο   Son                                                                                                 Ο   /res/drawable-mdip/icon.png
  Ο   Vibreur                                                                                             Ο   /res/drawable-ldip/icon.png
  Ο   Barre de notification (icône)

                                                                                                                les deux orientations possibles (portrait
                                                                                                        ● Prévoir
● Utilisation             facilitée par le notification manager                                          ou landscape)
                                                                                                                                                                             Depuis le code,
  Ο   NotificationManager nm = (NotificationManager)                                                      Ο   /res/layout-port/main.xml                                      on manipule une
                                                                                                                                                                             seule ressource,
      getSystemService(Context.NOTIFICATION_SERVICE);                                                     Ο   /res/layout-land/main.xml                                       sans se soucier
                                                                                                                                                                              de la résolution
                                                                                                                                                                             (R.drawable.icon)
  Ο   nm.notify(NUMBER, new Notification(...))
                 Images redimensionnables                                                 Application Multi-langues

● Utiliser     les images 9 patchs                                       ● Prévoir       différentes variantes d'une même chaîne
  Ο   Images divisées en neuf zones (dont certaines étirables)             Ο   /res/values-fr/strings.xml                                   On manipule une
                                                                                                                                            seule ressource,
                                                                                                                                             sans se soucier
  Ο   Outil Draw 9-patch du répertoire /tool du SDK Android                Ο   /res/values-en/strings.xml                                       de la langue
                                                                                                                                              (R.strings.hello)
       ●   Draw9patch.exe produit des fichiers *.9.png                     Ο   /res/values-it/strings.xml
                                                                         ● Lechoix sera fait automatiquement en fonction
                                                                          de la configuration du terminal (ex: LOCALE=FR_fr)
                                                                         ● S'appliqueégalement aux images car elles
                                                                          peuvent afficher du texte !
                                                                           Ο   /res/drawable-fr/splashscreen.png
                                                                           Ο   /res/drawable-en/splashscreen.png




                                                                                          Shared Preferences

                         Persistance et                                  ● Mécanisme              simple et léger
                                                                           Ο   Sauvegarde de paires clé/valeur simple
                         threading                                         Ο   SharedPreferences pref = getPreferences(Activity.MODE_PRIVATE)
                                                                         ● Sauvegarder              des préférences
                                                                           Ο   Récupère un éditeur de préférences : Editor ed = pref.edit()
                                                                           Ο   Stocke les paires : ed.putString("teacher", "Olivier Le Goaer");
                                                                               ed.putBoolean("isBrilliant", true);
                                                                           Ο   Valide les modifications : ed.commit();
                                                                         ● Retrouvez           des préférences
                                                                           Ο   String t = pref.getString("teacher","unknown");




                 Gestion de fichiers plats                                                Sérialisation d'objets

● Mécanisme             de lecture/écriture de fichiers                  ● Chaque   classe implémente l'interface
  Ο   Exploite l'espace de stockage interne ou externe                    Serializable (+champs serialVersionUID)
  Ο   API habituelle java.IO                                               Ο   Idem que pour java SE
● Sauvegarde             et chargement                                     Ο   Format de stockage binaire

  Ο   Flux de sortie : FileOutputStream fos =                            ● Basé      sur la gestion de fichiers ci-avant
      openFileOutput("CAC40.dat", Context.MODE_PRIVATE)                    Ο   Sérialisation
  Ο   Flux d'entrée : FileInputStream fis = openFileInput("CAC40.dat")          ●   ObjectOutputStream oos = new ObjectOutputStream(fos);
                                                                                ●   oos.writeObject(myObject);
● Cas      d'un fichier statique (lecture uniquement)                      Ο   Désérialisation
  Ο   Déposez-le dans le répertoire res/raw/ de votre projet                    ●   ObjectInputStream ois = new ObjectInputStream(fis);
  Ο   Accès avec openRawResource(R.raw.cac40)                                   ●   myObject = (myClass) ois.readObject();
                XML et JSON                                                                                Base de données embarquée

● XML                                                                                      ● Android        embarque le SGBD-R SQLite
  Ο   Parsing de ressources au format XML                                                    Ο   Léger et puissant
  Ο   Voir API javax.xml.parsers                                                             Ο   Typage dynamique des colonnes
                                                            Note
       ●   Approche hiérarchique (DOM) : org.w3c.dom      SAX plus
                                                         performant
                                                                                             Ο   Ne gère pas les contraintes d'intégrité référentielle
       ●   Approche évènementielle (SAX) : org.xml.sax   que DOM !
                                                                                           ● Types       de données
● JSON                                                                                                                                          Les types Booléens,
                                                                                                                                                    Dates, … sont
                                                                                             Ο   NONE, INTEGER, REAL, TEXT, BLOB                  ''émulés'' avec
  Ο   Parsing de ressources au format JSON                                                                                                           ces types
                                                                                           ● Implémentation                                            primitifs
  Ο   Voir API org.json
                                                                                             Ο   Support du standard SQL-92
                                                                                                  ●   Mais manque RIGHT OUTER JOIN et FULL OUTER JOIN...
                                                                                             Ο   Support partiel des déclencheurs (triggers)




                Bonnes pratiques                                                                           Interrogation de la base

● Créer      un helper                                                                     ● Approche          par SQL brut
  Ο   Étendre android.database.sqlite.SQLiteOpenHelper                                       Ο   La requête est fournie sous forme de chaîne de caractères
                                                                                                 du dialecte SQL
  Ο   Classe abstraite qui gère la création, l'ouverture et la montée
      de version d'une base de données                                                       Ο   db.rawQuery("SELECT * FROM Customer WHERE id>? AND id<?",
  Ο   myHelper = new BanksterHelper(context, "bankster.db", null, 1)                             new String[]{"47645", "58421"})

● L'instance                                                                               ● Approche          par composante
            de la BDD est ensuite obtenue à
 l'aide du helper, selon deux modes                                                          Ο   Une requête est fournie via ses composantes relationnelles
                                                                                                 (projection, sélection, groupement, tri...)
  Ο   SQLiteDatabase db;
                                                                                             Ο   db.query (boolean distinct, String table, String[] columns, String
  Ο   db = myHelper.getWritableDatabase() //lecture et écriture                                  selection, String[] selectionArgs, String groupBy, String having,
  Ο   db = myHelper.getReadableDatabase() //lecture seule                                        String orderBy, String limit)




                Résultats                                                                                  Ajout, suppression, m-a-j

● L'ensembledes tuples (ou n-uplets) retournés                                             ● Représentation             d'un tuple
 par une requête est un curseur                                                              Ο   Un n-uplet est une instance de android.content.ContentValues
  Ο   Cursor res = db.query(...)                                                             Ο   n paires nom-de-champ/valeur-de-champ
● On   peut ensuite parcourir cet ensemble                                                 ● Ajout     de tuples
  Ο   Même principe que les itérateurs de collection Java                                    Ο   db.insert(String table, String nullColumnHack, ContentValues values)
  Ο   Utiliser les méthodes de la forme get<Type>(int columnIndex)                         ● Supression           de tuples
      pour récupérer la valeur d'un champ
                                                                                             Ο   db.delete(String table, String whereClause, String[] whereArgs)
      //vérifie qu'il y a au moins un tuple
      if (res.moveToFirst()) {
          //itère sur chaque tuple
                                                                          Fermeture        ● Mise      à jour de tuples
                                                                         d'un curseur :
          do {                                                         manuellement ou
               String customerName = res.getString(3); //3e champ
          } while(res.moveToNext())
                                                                      en mode ''managé''     Ο   db.update(String table, ContentValues values, String whereClause,
      }                                                                                          String[] whereArgs)
                 Threading : éviter les ANR                                                   Thread principal : UIThread

● Gérerles traitements qui ralentissent l'UI et                                  les composants d'une application
                                                                            ● Tous
 donc qui dégradent l'expérience utilisateur                                 démarrent dans le thread principal UIThread
  Ο    Éviter une "Application Not Responding" (ANR)                          Ο   Gère l'affichage graphique et les interactions utilisateur
  Ο    Fermeture forçée de l'application au bout de n secondes                Ο   Vos traitements "consommateurs" et lents bloqueront tous
                                                                                  les autres composants (dont affichage + interactions) :-(
● Deux       exemples récurrents :
                                                                            ● Nécessitéde déplacer ces traitements en
  1) Communications réseaux
        ●   Une NetworkOnMainThreadException est levée depuis Android 3.x
                                                                             tâches de fond (i.e. processus légers)
  2) Manipulations SQLite                                                     Ο   A l'aide de tâches asynchrones
        ●   Voir du coté de android.app.LoaderManager                         Ο   A l'aide de vos propres Threads enfants
● Et   pensez à faire patienter votre utilisateur                           ● Puis      les synchroniser avec l'interface graphique
  Ο    Barre de progression, SplashScreen au démarrage...                     Ο   Car le UIThread est le seul habilité à modifier les vues !




                 Tâche asynchrone                                                             Thread enfant

● Classe        qui étend android.os.AsyncTask<?,?,?>                       ● Même         fonctionnement que JAVA SE
● Fournit des gestionnaires d'évènements déjà                                 Ο   Créer une instance de la classe java.lang.Thread qui
                                                                                  encapsulera une instance implémentant la méthode run() de
 synchronisés avec le UIThread pour mettre à                                      l'interface java.lang.Runnable
 jour les vues                                                                Ο   new Thread(new Runnable() { public void run(...) }).start();
  Ο    doInBackground : placez le code à exécuter à cet endroit. Pas
       d'interaction avec l'UI !                                            ● Pour       synchroniser un thread enfant avec l'UI
  Ο    onProgressUpdate : mettez à jour l'UI au fil du traitement             Ο   Directement depuis une activité
                                                                                   ●    runOnUiThread(new Runnable() {...});
  Ο    onPostExecute : une fois le traitement terminé, m-a-j de l'UI
                                                                              Ο   Dans les autres cas
● Exécution          de la tâche                                                   ●    Instancier un handler nécessairement dans le UiThread : h = new Handler();
  Ο    new MyAsyncTask().execute(data1, data2, ...);                               ●    Y enfiler des runnables depuis le thread enfant : h.post(new Runnable(){...});




                                                                                              Les capteurs

                         Exploiter les                                      ● Unpériphérique Android peut possèder aucun
                                                                             ou plusieurs capteurs (sensors en anglais)
                         dispositifs matériel                                 Ο   Cinémomètre (ou accéléromètre)
                                                                              Ο   Gyroscope (ou boussole)
                                                                              Ο   Luminomètre
                                                                              Ο   Magnétomètre
                                                                              Ο   ...
                                                                            ● Constantes supportées par la classe
                                                                             android.hardware.Sensor
                                                                              Ο   TYPE_AMBIENT_TEMPERATURE, TYPE_GRAVITY,
                                                                                  TYPE_GYROSCOPE, TYPE_LIGHT...
                 Principes des capteurs                                                             Capteurs : code source

● Système          d'abonnement à un capteur                                         package fr.univpau.bankster;

                                                                                     import android.app.Service;
  Ο   Votre programme est à l'écoute des évènements qui                              import android.hardware.*;
      surviennent au niveau d'un capteur
                                                                                     public class FallingDown extends Service {
  Ο   Le SensorManager (android.hardware.SensorManager) permet                            @Override
      de gèrer facilement les abonnements en cours                                        public void onCreate() {
                                                                                             // Mise en place de l'écoute de l'accèléromètre
       ●   Méthodes registerListener() et unregisterListener()                               sm = (SensorManager)getSystemService(SENSOR_SERVICE);
                                                                                             a = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
● Surtout,        bien penser à se désabonner                                                sm.registerListener(new SensorEventListener() {...}, a);
                                                                                          }
  Ο   Car les données continuent d'être acquises (même si elles                           @Override
      ne sont pas traitées) et cela consomme de l'énergie !                               protected void onDestroy() {
                                                                                              super.onDestroy();
  Ο   Se gère au niveau du cycle de vie des composants                                    }
                                                                                              sm.unregisterListener(...);

      concernés
                                                                                     }
       ●   Typiquement, dans les méthodes onPause() et onDestroy()




                 Acquisition des données                                                            Evènement de capteur

        son taux d'acquisition (toutes les n
● Choisir                                                                         ● L'évènement est                          ● Une    seule valeur
 microsecondes)                                                                    modélisé par :                              Ο   Luminomètre, pression,
  Ο   Exemple de contantes de la classe Sensor :                                    Ο    la précision de                           proximité...
      SENSOR_DELAY_NORMAL, SENSOR_DELAY_FASTEST...                                       l'acquisition                       ● Trois   valeurs (X-Y-Z)
● Interface
        android.hardware.SensorEventListener                                        Ο    le capteur qui l'a généré             Ο   Accèléromètre, gravité,
 commune à tous les capteurs                                                        Ο    son horodatage                            gyroscope...
                                                                                    Ο    les valeurs brutes
  Ο   onAccuracyChanged() : la précision a changée (+/-)
                                                                                          ●   Vecteur de flottants dont la
  Ο   onSensorChanged() : une nouvelle valeur brute est disponible                            taille et l'interprétation
                                                                                              dépendent du capteur ►
● Chaque évènement est un objet instance de la
 classe android.hardware.SensorEvent




                 Multi-touch                                                                        Évènements gestuels

                                               ● Supporte    plusieurs            ● Une même instance de android.view.MotionEvent
                                                   pointeurs simultanés            peut ainsi modéliser de multiples évènements
                                                    Ο   Doigt, stylet...            Ο    Autant qu'il y a de pointeurs actifs à la surface
                                                    Ο   Limite théorique : 256      Ο    Technique du masque binaire pour extraire les informations
                                                    Ο   event.getPointerCount()           ●   event.getActionMasked()

                                                    Ο   À chaque pointeur actif   ● Différencie           le premier pointeurs des suivants
                                                        est attribué un ID
                                                                                    Ο    Cycle de vie (ou d'actions) du premier pointeur
                                               ● Trois           gestes de base           ●   ACTION_DOWN → (ACTION_MOVE)* → ACTION_UP

                                                    a) Tap                          Ο    Cycle de vie (ou d'actions) des suivants
                                                    b) Drag                               ●   ACTION_POINTER_DOWN → (ACTION_MOVE)* → ACTION_POINTER_UP

                                                    c) Pinch-Zoom
                                                                                    Ο    L'ID d'un pointeur reste inchangé lors de son cycle de vie
                  Géolocalisation                                                                              Évènements de position

● Exploiter         le gestionnaire de position                                               ● Interfaceandroid.location.LocationListener pour
  Ο    Instance de android.location.LocationManager                                            écouter les changements de position
● Requière           le choix d'un fournisseur de position                                      Ο   onLocationChanged() : une nouvelle position est disponible

  Ο    Instance de android.location.LocationProvider
                                                                                                Ο   onProviderDisabled()/Enabled() : fournisseur désactivé/activé
  Ο    Exemple de constantes de la classe LocationManager :
                                                                                                Ο   onStatusChanged() : le statut du fournisseur a changé
       LocationManager.GPS_PROVIDER,                                                                 ●   OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE, AVAILABLE
       LocationManager.NETWORK_PROVIDER, ...                                                  ● Chaque position est un objet instance de la
  Ο    Chaque fournisseur offre diverses caractéristiques                                      classe android.location.Location
        ●   Consommation d'énergie                Il est possible
        ●   Précision                               de choisir le                               Ο   Modélisé par : latitude, longitude, cap, altitude, vitesse, et
                                               ''meilleur'' fournisseur
        ●   Capacité à déterminer l'altitude       par rapport à
                                                                                                    horodatage
                                                    des critères
        ●   ...                                                                                 Ο   Parfois, détails additionnels dans les extras (Bundle)




                  Géolocalisation : code
                                                                                                               Cartographie
                  source
   package fr.univpau.bankster;
                                                                                              ● La géolocalisation est un tremplin naturel vers
   import android.app.Activity;
   import android.location.*;                                                                  la cartographie
   public class FindNearestAgency extends Activity {                                            Ο   Service d’images tuilées pour permettre une visualisation
        @Override                                                                                   fluide et performante
        public void onCreate() {
           // Choix du fournisseur de position GPS                                              Ο   Géocodage (avant/inverse) : coordonnées ↔ adresses
           lm = (LocationManager)getSystemService(LOCATION_SERVICE);
           String gps_prov = LocationManager.GPS_PROVIDER;                                      Ο   + services ad-hoc : itinéraires, cadastre, lieux d'intérêts,
           // Mise en place de l'écoute des changements de position
           loc_list = new LocationListener() {…}                                                    trafic, street view, ...
           // Laps (5sec) et distance (6m) minimums entre 2 updates

        }
           lm.requestLocationUpdates(gps_prov, 5000, 6, list);                                ● Choisir       une tierce API de cartographie
        @Override                                                                               Ο   Fournie par des entreprises qui se sont spécialisées dans la
        public void onDestroy() {
           lm.removeUpdates(loc_list);          // Ne pas oublier !
                                                                                                    cartographie
        }                                                                                            ●   Google, Mappy, IGN (Territoire Français), Nokia Here Maps...
   }
                                                                                                Ο   L'API Google Maps est logiquement favorisée sous Android




                  Google Maps – Élements clés                                                                  Google Maps - Coordonnées

● MapView                                                                     Voir aussi      ● Chaque coordonnée est un objet instance de la
                                                                          l'activité dédiée
  Ο    Instance de com.google.android.maps.MapView
                                                                             MapActivity
                                                                                               classe com.google.android.maps.GeoPoint
  Ο    Vue composite (ViewGroup) destinée à afficher une carte                                  Ο   Moins riche qu'une instance de android.location.Location
● MapController                                                                                      ●   Latitude et Longitude uniquement
                                                                                                     ●   Exprimées en microdegrés et non plus en degrés (donc x 106)
  Ο    Instance de com.google.android.maps.MapController
                                                                                              ● Projection          des coordonnées
  Ο    Utilisé pour contrôller la carte, vous permettant de centrer et
       de régler le niveau de zoom...                                                           Ο   Traduire des coordonnées géographique (latitude, longitude)
                                                                                                    en coordonnées écran (x,y)
● Overlay                                                                                            ●   com.google.android.maps.GeoPoint ↔ android.graphics.Point
  Ο    Instance de com.google.android.maps.Overlay                                              Ο   Interface com.google.android.maps.Projection
  Ο    Permet d'utiliser un canvas pour dessiner autant de couches                                   ●   Méthodes toPixels() et fromPixels()
       que nécessaires, affichées au dessus de la carte
                Bluetooth : vue d'ensemble

                                                      BluetoothDevice #1

                  Bluetooth
                                         Bluetooth
                                         Socket
                                                                                                      Divers
                  Server
                  Socket




                                                          BluetoothDevice #2



          BluetoothAdapter


                                                     BluetoothDevice #3




                Services système                                                               Alarmes et Timers

   est fréquent de récupérer des Managers à
● Il                                                                           ● Les alarmes sont un moyen de déclencher des
  partir de services systèmes préconfigurés                                     intents (et donc des composants)
   Ο   Appel de la méthode getSystemService(Context.XXXXX)                       Ο   à des heures déterminées
   Ο   Retour : LocationManager, LayoutInflater, WifiManager...                  Ο   à des intervalles déterminés
● Exemples          de services (constantes)                                   ● Prise     en charge par le gestionnaire d'alarmes
   Ο   Context.LOCATION_SERVICE                                                  Ο   AlarmManager am =
                                                                                     (AlarmManager)getSystemService(Context.ALARM_SERVICE)
   Ο   Context.LAYOUT_INFLATER_SERVICE
                                                                                 Ο   am.set(TYPE, TIME, pendingIntent)
   Ο   Context.STORAGE_SERVICE
                                                                               ● Les      timers eux, gèrent l'exécution de tâches
   Ο   Context.TELEPHONY_SERVICE
   Ο   Context.WIFI_SERVICE                                                      Ο   new Timer().shedule(new TimerTask() {...}, new Date());




                Linkify, TextWatcher                                                           Application : variable globale

● Transformer   des textes (TextView) en liens                                 ● Comment partager des données à travers tous
  cliquables (i.e. générateurs d'intents)                                       les composants d'une application ?
   Ο   Classe utilitaire android.text.util.Linkify                               Ο   Créer une sous classe de android.app.Application
   Ο   Reconnaissance de motifs : n° tel, email, URL, map...                     Ο   Gère des évènements propres à la vie de l'application
                                                                                      ●   onCreate(), onTerminate(), onLowMemory(), onConfigurationChanged()
                                                                                 Ο   Se déclare au niveau du nœud <application> du manifeste
● Contrôler        la saisie d'un texte (EditText)
   Ο   Classe utilitaire android.text.TextWatcher
                                                                               ● Principe       du singleton
   Ο   Gère des évènements : avant, après, pendant la saisie
                                                                                 Ο   Une seule instance de la classe pour toute l'application
                                                                                 Ο   Les variables d'instances sont les données à partager
               Mapping objet-relationnel                                                    Base de données distante

● Le vas-et-viens entre la BDD embarquée et les                         ● La connexion d'un périphérique Android à une
  objets métiers est fastidieuse                                           BDD distante n'est pas prévue (ni souhaitable)
   Ο   Appliquer le fameux pattern DAO                                       Ο   Pas de pont "JDBC" en quelque sorte
                                                                        ● Ilest nécessaire de mettre en place une
● Ilexiste toutefois des solutions ORM adaptées                            approche par "WebService"
  à Android (car légères)                                                    Ο   SOAP
                                                                                 REST




                                                                                                                                     PHP, JSP/Servlets, ...
                                                                             Ο                                    Requête




                                                                                                                                     PHP, JSP/Servlets, ...
   Ο   ORMLite            Ο   DB4O                   Ο   Androrm




                                                                                                                                                              Serveur
                                                                                                                                                              Serveur
                                                                                                                                                               HTTP
                                                                                                                                                                          BDD




                                                                                                                                                               HTTP
                                                                                                                                                                          BDD




                                                                                                                                                          +
                                                                                                                                                                          (Oracle,
       ActiveAndroid




                                                                                                                                                          +
   Ο                      Ο   Orman                                                                                                                                        (Oracle,
                                                                                                                                                                          MySQL,
                                                                                                                                                                           MySQL,
                                                                          Astuce :                                Réponse                                               PosgreSQL...)
                                                                                                                                                                        PosgreSQL...)

   Ο   NeoDatis           Ο   DataFramework                            masquez le tout
                                                                          avec un                                    ...
                                                                       ContentProvider
                                                                                                                   XML/SOAP,
                                                                                                                   JSON...           192.56.7.45




               Mockups pour MobileApps

                              ● Prototypage de l'UI de
                                votre MobileApp                                                      Tests et déploiement
                                Ο   Dessiner les écrans avant de
                                    démarrer le développement
                              ● Outils    de mockups
                                Ο   Balsamiq (web demo)
                                Ο   MobiOne Studio (free)
                                Ο   OmniGraffle (Mac, $99)
                                Ο   http://yeblon.com/androidmockup/
                                Ο   http://mokk.me
                                Ο   ...




               Test de la couche métier                                                     Test de l'UI

● Tests unitaires de trois types de composants                          ● Le      test du singe sur votre IHM
  applicatifs Android                                                        Ο   Idée : "si elle résiste au comportement anarchique d'un
   Ο   Activités, Services, et Providers                                         singe, elle résistera à l'utilisateur"
                                                                             Ο   Génère des évènements pseudoaléatoires, tels que des
● Extension       JUnit pour Android                                             clics, des pressions de touches, des gestes, etc.
   Ο   android.test.AndroidTestCase étend junit.framework.TestCase      ● Le      programme s'exécute dans votre émulateur
   Ο   junit.framework.Assert                                                Ο   Se lance en ligne de commande
   Ο   android.test.InstrumentationTestRunner                                     ●   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
                                                                                  ●   :Sending Pointer ACTION_DOWN x=437.0 y=183.0
   Ο   Sous-répertoire tests/ de votre projet android                             ●   :SendKey (ACTION_DOWN): 90 // KEYCODE_FORWARD=
   Ο   Code source de vos tests + manifeste                                       ●   ...
                 Exporter et signer                                                  Distribution des MobileApps

● Toute      application doit être signée                            ●3   solutions s'offrent à vous
  Ο   Signature digitale avec un certificat dont la clé privée est    Ο   Choisir Google Play Store (Android Market)
      conservée par le(s) développeur(s)                                   ●   Site officiel : https://play.google.com
  Ο   Signature avec la clé de débugage par défaut                         ●   25$ de frais de dossier pour l'accès au store
                                                                           ●   70% du prix de vente va aux développeurs (30% à Google)
● Trois     étapes :                                                       ●   Les autres revenus générés sont reversés via Google Checkout
  1   Obtenir une clé privée (stockée dans un "keystore")             Ο   Autopublier sur votre propre site Web
       ●   Utilitaire keytool.exe du JDK                                   ●   Exemple : http://www.univ-pau.fr/~olegoaer/bankster.apk

  2   Signer l'APK avec la clé privée                                      ●   Type MIME pour le téléchargement : application/vnd.android.package-archive
                                                        Procédure
       ●   Utilitaire jarsigner.exe du JDK             entièrement    Ο   Choisir un magasin alternatif
                                                       automatisée
  3   Optimiser l'APK qui vient d'être signé            avec ADT           ●   YAAM (http://yaam.mobi/)
                                                                           ●   Bazaar (http://www.bazaarandroid.com/)
       ●   Utilitaire zipalign.exe du SDK Android
                                                                           ●   AndroLib (http://fr.androlib.com/)




                 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...
● Principes         de fonctionnement
  Ο   Affection d'un UA number de la forme UA-xxxxx-yy
  Ο   Insertion d'instructions de tracking (évènements,
      affichages...) dans le code
  Ο   Tableau de bord disponible sur www.google.com/analytics

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:4
posted:10/11/2013
language:French
pages:27