Vous êtes sur la page 1sur 27

Organisation du module

Programmation des systmes mobiles & sans fil

CM/TD/TP

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

valuation

Contrle continu : 1 sance (1h30) Note de TP : projet MobileApp (~6h)

[70%] [30%]

Ressources

pdagogiques

Olivier Le Goaer
M2 TI Anne 2012-2013

Tout au format lectronique (PDF) sur WebCampus

Prrequis du module
Langages

Plan du module
Avant-propos

de dveloppement

HTML, CSS, JavaScript, Java SE, PHP

Formats

d'change

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

XML, JSON

Dvelopper

une WebApp

Outils

de dveloppement

Apprendre dvelopper une application Web compatible mobile l'aide du framework jQuery Mobile

IDE Eclipse phpMyAdmin

Dvelopper

une MobileApp

Base

de donnes

Apprendre dvelopper une application native sur la plateforme mobile Android

SQL

Un march en explosion

Avant-propos

Vente

de "terminaux mobiles" volus

Un tlphone mobile sur trois vendu dans le monde est un smartphone L'explosion des ventes doit beaucoup l'norme succs de l'iPhone d'Apple. L'arrive en force des tablettes (ardoises numriques) Des utilisateurs de plus en plus accros (les "nomophobes")

Vente

d'applications associes

On prvoit 20 milliards dapplications tlcharges par an en 2014 contre 2,3 en 2009 C'est la nouvelle rue vers l'or !

De nouvelles opportunits
Demande

SmartPhone

croissante des entreprises

crans

Dfinition et mise en uvre de leur stratgie Web et/ou mobile Postes de Dveloppeur Applications Mobiles H/F Niveau Bac+5 (cole d'ingnieur ou universitaire) exig

QVGA, WVGA... Mono/multi-touch

Capteurs

GPS, boussoles, acclromtres...

Une

offre de formation qui s'adapte

Connectivit

Les coles et universits intgrent peu peu la programmation mobile dans leurs plaquettes de formation L'universit de Pau a lanc ce module ds 2008, en ciblant alors J2ME (Java 2 Micro Edition)

GSM (voix + donnes), WiFi, Bluetooth, NFC

Rseaux sans fil


Les

OS Mobile : l'offre actuelle

quatre catgories de rseaux sans fil

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

Zone de couverture
Rseaux personnels sans fil (WPAN) Rseaux locaux sans fil (WLAN) Rseaux mtropolitains sans fil (WMAN) Rseaux tendus sans fil (WWAN)

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

Modles de dveloppement
MobileApp
Portabilit Dveloppement /cot Mises jour Disponibilit Fonctionnalits

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

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

versus WebApp
Application mobile (native) Application web
Navigateur Web Langage du Web (HTML / JS / CSS / PHP...) Mise jour rapide en mettant jour tout simplement les fichiers sur le serveur Web Ncessite obligatoirement une connexion internet Limites aux possibilits du navigateur

Dveloppement spcifique chaque plateforme Ncessite un SDK + connaissance dun langage spcifique Soumission un magasin dapplications et ventuelle validation + retlchargement par le client Mode online et offline Utilise toutes les fonctionnalits du mobile (GPS, voix, notifications, contacts...)

HybridApp

: le modle hybride

Encapsulation d'une WebApp dans une MobileApp Ce modle de dveloppement reste un compromis...

Arbre de dcision
Un

Le dfi du cross-plateforme
slogan : "Write once, run everywhere"

Les WebApp (et les HybridApp) sont un faux problme


N'exploitent pas la plateforme (mme si les standards W3C voluent vite)

Les MobApp sont au cur du problme


Redvelopper une application native pour chaque plateforme Ncessite des comptences et du temps ($$)

Quelle

lingua franca pour programmer ?

Les langages du web


JavaScript, HTML, CSS...

Les langages mainstream

Ekito.fr

C++, Java...

Les langages ddis (DSL)

Solutions cross-platform *
Nom commercial Titanium Mobile Apache Cordova (PhoneGap) NeoMAD Codename One MoSync appMobi Canappi Applause IBM Worklight Rhodes ... Programmation JavaScript HTML, CSS, JavaScript Java Java HTML5, JavaScript, C/C++ HTML5, JavaScript DSL DSL HTML5, CSS3, JavaScript Ruby, HTML, CSS, JavaScript ... Transcompilation Transcompilation Interprtation Interpretation ... ...
* Diapositive exprimentale Merci de votre comprhension

Technique Interprtation Interprtation Transcompilation Transcompilation Transcompilation

Commentaires

API android-like API gnrique

Dvelopper une WebApp [avec jQuery Mobile]

IDE online

- Bas sur PhoneGap - Middleware IBM fournit

Le browsing sur mobile


Le

WebApp mobile-friendly
Customisation

browsing sur mobile est dj une ralit

pour terminal mobile

Il est aujourd'hui possible de reproduire une exprience utilisateur similaire celle d'une application native Un site mobile sera toujours moins cher qu'une application dveloppe dans un environnement propritaire.

Renvoyer au terminal mobile une page adapte ses spcificits (mobile-friendly) Taille cran limite, dbit limit, pointage tactile...

Les

browsers et leur support des standards W3C sont donc au cur des enjeux
Apple Safari, Google Chrome : moteur WebKit Microsoft IE : moteur Trident Mozilla Firefox : moteur Gecko Opera : moteur Presto

Deux

solutions sont envisageables

1) Handheld stylesheets

Voir ''Media Query'' du W3C

Fournir une feuille de style CSS spcifique aux priphriques mobiles (media="handheld")

2) Mobile-optimized site

En plus d'une feuille de style spcifique, fournir l'utilisateur un niveau global d'interactivit imitant les applications natives auxquelles il est habitu

Frameworks actuels
Sencha Sencha Touch Touch iUI iUI

jQuery jQuery Mobile Mobile


jqTouch jqTouch

Dojo Dojo mobile mobile

... ...

Principes de base
Vous

jQuery Mobile en images...

allez crer des documents

Conformes au doctype HTML 5

Puis,

jQuery Mobile modifie le DOM des documents au chargement


En ajoutant des lments et des attributs de style En exploitant de faon transparente la technologie Ajax

Au

final on obtient automatiquement

Une apparence graphique trs "iOS-like" Des effets de transition entre les pages

tape 1 : importation
Des

tape 2 : structure
Exploitez

bibliothques sont requises

Soit stockes en local sur votre serveur Soit directement sur le serveur public haute disponibilit de jQuery.com

l'attribut data-* dans votre document, o * est la fonctionnalit dsire


data-role prcise la nature du bloc (page|header|content| footer) data-position spcifie o l'lment doit tre positionn (top| bottom|right|left) data-inset spcifie si l'lment doit tre contenu dans les marges ou l'extrieur de celles-ci (true|false) data-transition spcifie quelle transition utiliser lors du chargement de nouvelles pages (slide|slideup|slidedown| pop|flip|fade) data-theme spcifie le thme graphique utiliser pour les lments d'un conteneur (a|b|c|d|e)

Importation

dans le document courant

Une feuille de style spcifique mobile (.css) La bibliothque JavaScript jQuery (.js) La bibliothque JavaScript jQuery Mobile (.js)

Versions compactes

<link <link rel="stylesheet" rel="stylesheet" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" /> /> <script <script type="text/javascript" type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script> src="http://code.jquery.com/jquery-1.6.1.min.js"></script> <script <script type="text/javascript" type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script> src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script>

Template d'un document


<!DOCTYPE <!DOCTYPE html> html> <html> <html> <head> <head> <title>Page <title>Page Title</title> Title</title> <link <link rel="stylesheet" rel="stylesheet" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" href="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css" /> /> <script <script type="text/javascript" type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script> src="http://code.jquery.com/jquery-1.6.1.min.js"></script> <script <script type="text/javascript" type="text/javascript" src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script> src="http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js"></script> </head> </head> <body> <body> <div ="page" <div data-role data-role ="page" id=''foo''> id=''foo''> <div ="header"> <div data-role data-role ="header"> <h1>Page <h1>PageTitle</h1> Title</h1> </div><!-</div><!-- /header /header --> --> ="content"> <div <div data-role data-role ="content"> <p>Page <p>Page content content goes goes here.</p> here.</p> </div><!-</div><!-- /content /content --> --> <div ="footer"> <div data-role data-role ="footer"> <h4>Page <h4>Page Footer</h4> Footer</h4> </div><!-</div><!-- /footer /footer --> --> </div><!-/page --> </div><!-- /page --> </body> </body> </html> </html>

Deux approches possibles


Monopage

Multipages

1 document = 1 page

1 document = n pages
HTML HTML Permet le prfetching des pages

HTML HTML

Page Page

Page Page lien interdocument

Page Page HTML HTML lien intradocument Page Page

Page Page

Modle de navigation
Lien

Quelques composants
Barre

intradocument

d'outils

Utilisez l'id de la page cible : <a href="#foo">next</a> Le contenu de la page est dj dans le DOM courant et une transition opre (cf. attribut data-transition)

header, footer, navbar...

Formatage

Lien

interdocument

Layout, blocs rtractables & effet accordon...

Utilisez l'URL du document cible: <a href="./bar.html">next</a> Une requte Ajax est forge, le contenu de la page est ajout au DOM courant et une transition opre Si le document cible est multipages, ajoutez rel="external" au lien, ou bien data-ajax="false"

Boutons

simples, icnes, inline, groupes...

Listes

Simples, numrots, imbriques, sparateurs...

Formulaires

(voir diapo suivante)

Formulaires
Balise

Dialogues
Une

classique

<form action="form.php" method="POST">...</form>

page peut tre stylise en tant que boite de dialogue modale


Accapare l'cran jusqu' ce qu'elle soit ferme Utile pour : confirmation, message informatif, etc.
<div <div data-role="page" data-role="page" id="foo"> id="foo"> <div <div data-role="header" data-role="header" data-position="inline"> data-position="inline"> <h1>Attention</h1> <h1>Attention</h1> </div> </div> <div data-role="content"> <div data-role="content"> <h1>Connectivit <h1>Connectivit limite</h1> limite</h1> <p>Vrifiez <p>Vrifiez vos vos branchements...</p> branchements...</p> <a <a href="#" href="#" data-role="button" data-role="button" data-rel="back">Ok</a> data-rel="back">Ok</a> </div> </div> </div> </div>

Puis,

inclusion des lments de HTML 5 une mise en forme soigne

Slider, case cocher, bouton radio, menu droulant...

Pour

Utilisez des blocs dont le rle est "fieldcontain"


<div <div data-role="fieldcontain"> data-role="fieldcontain"> <label <label for="name">Numro for="name">Numro client client :</label> :</label> <input <input type="text" type="text" name="name" name="name" id="name" id="name" value="" value="" required required /> /> </div> </div>

Tout

se joue ensuite sur le lien vers la page

<a href="./foo.html" data-rel="dialog">Voir</a>

Catgories d'vnements
Lis

Gestion des vnements


Mthodes

au pointage/touch au changement d'orientation de l'cran au dfilement de l'cran l'affichage des pages l'initialisation des pages

live() ou bien bind() en vrac :

tap, taphold, swipe, swipeleft/swiperight

$('elem').live('eventName', callback);

Lis

Pour fonctionner, doivent tre positionnes dans le document matre !

Exemples

orientationchange
//s'applique //s'applique tout tout le le document document (non (non test) test) $(document).live(' tap ',function(event, $(document).live(' tap ',function(event, ui){ ui){ alert('Tapotage'); alert('Tapotage'); }); }); //S'applique //S'applique toutes toutes les les pages pages $('div').live(' $('div').live('pageshow pageshow',function(event, ',function(event, ui){ ui){ alert('Affichage alert('Affichage de de la la page page active'); active'); }); }); //Ne //Ne s'applique s'applique qu' qu' une une page page donne donne $('#aboutPage').live(' ',function(event){ $('#aboutPage').live('pagecreate pagecreate ',function(event){ alert('Cette alert('Cette page page vient vient d'tre d'tre amliore amliore par par Jquery'); Jquery'); }); }); Cf. fonctionnement des slecteurs CSS : $('div') $('div.foo') $('div > p') $('#bar')

Lis

scrollstart, scrollstop

Lis

pagebeforeshow, pagebeforehide, pageshow, pagehide

Lis

pagebeforecreate, pagecreate

Et la "touche finale"
Immiter

Tester votre WebApp


Test

une icne de lancement native

en visuel, via un terminal mobile

Crer une favicon de 57x57 pixels, au format PNG


<link rel="apple-touch-icon" href="myIcon.png" />

Consulter le niveau de support (le grade) du navigateur http://jquerymobile.com/gbs/

Solution

sous iPhone et sous Android

Tester

en visuel, sans terminal mobile

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

Dmo : Bankster
Bankster

: La banque des gangsters de l'application Bankster

Flashez pour accder la dmo

Plagie une WebApp mobile-friendly d'un organisme bancaire

Fonctionnalits

Dvelopper une MobileApp [sous Android]

Partie publique

Formulaire d'identification, infos bourse (rcuprs au format JSON), liste des agences (image google maps), annuaire

Partie prive

Le client s'est authentifi, il a accs son solde et aux oprations de virements Exemples login/password : demo/demo, dsk/dsk

Bref historique
2003 Naissance Naissance de de la la startup startup Android Android inc. inc. 2007 Annonce Annonce d'Android d'Android +SDK +SDK Open Open Handset Handset Alliance Alliance
Voir annonce par Sergey Brin sur YouTube : http://goo.gl/LejV9

Open Handset Alliance (OHA)


Regroupement

de + de 50 entreprises

Fabricants de matriels Oprateurs mobile Dveloppeurs d'applications ...

Objectif

2005 Rachat Rachat de de la la startup startup par par Google Google inc. inc.

2008 Premier Premier mobile mobile sous sous Android Android :: le le T-Mobile T-Mobile G1 G1

Dvelopper des normes ouvertes pour les appareils de tlphonie mobile

Matriels Android
APN APN Tablette Tablette

Points forts d'Android


Point de vue constructeur Point de vue utilisateur

Systme Systme Linux Linux + + Java Java Embarqu Embarqu Smartphone Smartphone Point de vue bidouilleur

Systme Systme fonctionnel, fonctionnel, intuitif, intuitif, volutif volutif

Point de vue dveloppeur

Netbook Netbook Tlvision Tlvision

Projet Projet Open Open Source Source C++ C++ // Java Java

Applications Applications dveloppes dveloppes en en syntaxe syntaxe Java Java SDK SDK complet complet fourni fourni

Versions d'Android
CodeName
Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean
November 1, 2012 Google Inc

Android en images...
Platform
Android 1.5 Android 1.6 Android 2.1 Android 2.2 Android 2.3 Android 3.0 Android 4.0 Android 4.1 ?

API Level
3 4 7 8 9 11 14 16 ?

Key Lime Pie Kouign-Amann

Version Ice Cream Sandwich (ICS)

Architecture logicielle

Couches logicielles
APPLICATIONS

Applications prinstalles sur un priphrique

APPLICATION FRAMEWORK

API offertes aux dvelopeurs

ANDROID RUNTIME* LIBRARIES

Machine virtuelle

Bibliothques C/C++

LINUX KERNEL

Linux version 2.6

*couche outrepasse dans le cas du NDK

Machine virtuelle "Dalvik"


Offre

Priorits des processus


Processus Processus actif actif

l'avantage de toute machine virtuelle

Android

Couche d'abstraction entre le dveloppeur d'applications et des implmentations matrielles particulires

La

VM Dalvik n'est pas une VM Java


Priorit

Processus Processus visible visible

gre ses ressources de manire agressive

Tient compte des contraintes de CPU et mmoire Excute des fichiers .dex (Dalvik Executable) optimiss

Pour garantir une haute ractivit limination de processus sans avertissement ! Politique de priorit base sur une hirarchisation des processus

Processus Processus de de service service en en cours cours d'excution d'excution

La

VM cr une instance Dalvik pour chaque application (i.e. processus lourds)


Les applications sont totalement indpendantes ("sandbox")

Processus Processus d'arrire-plan d'arrire-plan

Espaces protgs (mmoire, disque) vite un plantage gnralis !

Processus Processus vide vide

Le petit univers Java


Concepts

Outils du dveloppeur
Plugin

de la POO Java

Eclipse ADT (Android Development Tools)

Paquetage, classe, annotation, hritage, interface...

Assistant la cration de projets Crateur d'interface graphique (WYSIWYG) Vues et perspectives ddies

Idiomes

Classes anonymes, classes internes, POJO...

Bibliothques

(API)
Apache Harmony

Android

SDK

J2SE (subset) : java.io.*, java.lang.*... Google : com.google.android.maps.*...

API mulateurs Dbogeur, compilateur, empaqueteur, signature Exemples (dmos) ...

Android : android.view.*, android.telephony.*...

Design

patterns

Singleton, Builder, Observer (Listener), DAO...

Plugin ADT Eclipse


Perspectives Vues
Numro du terminal

mulateur : aperu
Bouton 'HOME' Bouton 'MENU' Bouton 'BACK'

cran ''Tactile''

Thme (skin) par dfaut

mulateur : limitations
Lent

Arborescence systme
Alternative : AndroVM sur VirtualBox
Applications utilisateur (.apk)
(AngryBirds, Mto...)

au dmarrage et l'usage

Emulation (i.e. niveau d'indirection) versus simulation Noyau Linux + extensions android

Donnes des applications


(database SQLite, SharedPreferences...)

Fonctionnalits

non-disponibles
Applications systme (.apk)
(Horloge, Browser, Calculatrice...)

Appareil photo (CameraWebcam support) Vibreur Appels tlphoniques rels Capteurs en gnral Connexions USB volution de la charge de la batterie

Commandes systme
(mkdir, chmod, ls...)

Arborescence projet
Le plugin ADT gre et facilite cette structuration

Externaliser les ressources


Android

Dossier du projet

prvoit de facto l'externalisation des ressources

Vos fichiers sources (*.java) Fichier source automatiquement gnr ( partir du contenu du rpertoire res) API Android (ici version 2.2) Ressources non-organises (zip, PDF, HTML...) Ressources organises (icnes, layout, textes...) Fichier Manifest

Facilit de maintenance, de mise jour et de gestion

Crer

des ressources

Simples valeurs, chanes de caractres, couleurs, menu, layout, styles, images, etc. Stockes dans les sousrpertoires de /res/ du projet

un seul niveau de profondeur est autoris !

Compilation et dploiement
Bytecode Dalvik (optimis)
.dex .dex
Entirement automatis avec le plugin ADT sous Eclipse !!

Environnement contraint
Pour

Sources Java

Bytecode Java

vos dveloppements, gardez l'esprit que les appareils mobiles ont :


Une puissance processeur plus faible Une RAM limite Des capacits de stockage permanent limites De petits crans avec de faibles rsolutions Des cots levs de transfert de donnes Des taux de transfert plus lents avec une latence leve Des connexions rseau moins fiables Des batteries autonomie limite

.java .java

.class .class

.apk .apk

Ressources + Manifest
.png .png .xml .xml

Application empaquete

/data/app

Types d'applications Android

Construction d'une application Android

Application Application de de premier premier plan plan


(ex: (ex: jeu jeu de de Poker) Poker)

(ex: (ex: rpondeur rpondeur automatique automatique aux aux SMS) SMS)

Application Application d'arrire d'arrire plan plan

(ex: (ex: mto mto du du jour) jour) (ex: (ex: lecteur lecteur de de mdia) mdia)

Widget Widget

Intermittente Intermittente

Les diffrents composants


Chaque
Activities crans crans de de prsentation prsentation Services Tches Tches d'arrire-plan d'arrire-plan Intents Activations Activations & & messages messages inter/intra-applications inter/intra-applications

Le manifeste
projet contient sa racine un fichier AndroidManifest.xml qui :
Nomme le paquetage Java de l'application. Ce dernier sert d'identificateur unique de l'application. Dclare les composants applicatifs (activities, services, broadcast receivers, content providers) de l'application et leurs filtres si ncessaire ( quels intents ils ragissent) Dclare les permissions que l'application doit avoir pour fonctionner (droit de passer des appels, droit d'accder Internet, droit d'accder au GPS...) Dclare le niveau minimum de compatibilit du SDK pour que l'application fonctionne ...

Content Providers Sources Sources de de donnes donnes partageables partageables

Broadcast Receivers Ractions Ractions des des Ecrans Ecrans de de prsentation prsentation annonces/vnements annonces/vnements

Manifeste Mtadonnes, Mtadonnes, composants, composants, prrequis prrequis

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest package="fr.univpau.bankster"> Permissions requises <uses-permission /> <uses-sdk /> <supports-screens /> <application> <activity> <intent-filter> <action /> <category /> <data /> </intent-filter> </activity>

Notion de contexte
Pensez bien dclarer tous les composants applicatifs de votre application !

Le

contexte modlise les informations globales sur l'environnement de l'application les mthodes importantes

Nud de l'application Nud d'une activit de l'application

Possde

getRessources, getPackageName, getSystemService... startActivity, startService, sendBroadcast, getContentResolver... openFileInput, openOrCreateDatabase, getSharedPreferences...

Nud d'un service de l'application

<service> <intent-filter> . . . </intent-filter> </service> <receiver> <intent-filter> . . . </intent-filter> </receiver> <provider> <grant-uri-permission /> </provider> </application>

Nud d'un broadcast receiver de l'application

Accs

au contexte

Nud d'un content provider de l'application

Depuis une Activity ou un Service : this (car hritage) Depuis un BroadcastReceiver : en argument de onReceive() Depuis un ContentProvider : this.getContext()

</manifest>

Activit
Une

Cycle de vie d'une activit


7

activit un cran graphique application est forme de n activits : application de tlphonie

mthodes de callback
void onCreate(...) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy()

Incarne souvent un cas d'utilisation (use case UML)

Une

Exemple

1) Numroteur 2) Annuaire des contacts 3) Fiche d'un contact 4) Ajout d'un contact

tend

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

Activit : code source


package fr.univpau.bankster; import android.app.Activity; public class Home extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Allocation des ressources ici */ } @Override protected void onDestroy() { super.onDestroy(); /* Dsallocation des ressources ici */ } }
Le bundle sert mmoriser l'tat de l'UI de l'activit lorsqu'elle passe en arrire plan

Lancer une activit


Pour Une

pouvoir tre lance, toute activit doit tre pralablement dclare dans le manifeste activit est dsigne comme activit initiale de l'application
Ceci est indiqu dans le fichier manifeste

Lancer

une activit

Mthode startActivity(...)

Lancer

une activit en vue d'obtenir un rsultat en retour


Mthode startActivityForResult(...)

La pile des activits


Les

Multitches
Plusieurs

activits sont empiles/dpiles


Empile quand une activit dmarre Dpile (i.e. dtruite) quand on presse le bouton 'BACK'

piles d'activits peuvent coexister avec Android


L'utilisateur passe de l'une l'autre

Une

pression sur le bouton 'HOME' ne dpile pas l'activit.

Elle passe simplement en arrire plan

Reprend l'activit situe au sommet de la pile

Service
Sert

Cycle de vie d'un service


5

effectuer des oprations ou des calculs en dehors de linteraction utilisateur


Ne ncessite pas une interface graphique

mthodes de callback
onCreate() onStart() SDK<2.0 onStartCommand() onDestroy() onBind() onUnbind()

Deux

types de services :

Local : service qui sexcute dans le mme processus que votre application Distant (IPC) : service qui sexcute dans des processus indpendants de votre application (ncessite une description AIDL)

Un

service est une classe qui tend

S'excute

android.app.Service

dans le processus courant

Service : code source


package fr.univpau.bankster; import android.app.Service; public class AccountCleaner extends Service { @Override public void onCreate() { /* Allocation des ressources ici */ } @Override void onStartCommand(Intent intent, int flags, int startId) { /* Votre code du service ici */ } @Override protected void onDestroy() { super.onDestroy(); /* Dsallocation des ressources ici */ } }

Appel d'un service


Mode

Unbounded

Mode

Bounded

Un composant dmarre et arrte un traitement en tche de fond comme il le souhaite

Oprations

Des composants (appels "clients") tablissent une connexion permanente afin d'interagir avec un service par le biais d'une interface

startService(...) stopService(...)
Un mme service peut supporter les 2 modes simultanment

Oprations

bindService(...) unbindService(...) + toutes les mthodes de l'interface java dfinie

Intents : principes
Trois

Intents : vue d'ensemble


Main Activity onActivityResult( onActivityResult(Intent Intent))
sendBroadcast(Intent) sendOrderedBroadcast(Intent) sendStickyBroadcast(Intent) startService(Intent) stopService(Intent) bindService(Intent) startActivity(Intent) startActivityForResult(Intent) finishActivity(int) setResult(Intent)

types de composants applicatifs sont activs via des intentions (Intents)


Activity, Service et BroadcastReceveir

Activity Intent Intent getIntent() getIntent()

Principe
A

d'un bus messages asynchrones


S B

Filtre d'intentions de A

Filtre d'intentions de S

Filtre d'intentions de B

BroadcastReceiver

Service onStartCommand( onStartCommand(Intent Intent)) IBinder IBinderonBind( onBind(Intent Intent))

Intent Intent Bus

onReceive( onReceive(Intent Intent))

Natures des intents


Types
1. Direct

Intents : les extras


Il

Dsignations
1. Explicite

est possible d'utiliser l'intent pour convoyer des donnes supplmentaires

Instance de android.content.Intent Le composant cible est activ par le composant source

Le composant cible est nomm Activer tel composant

Une une, ou regroupes dans un bundle (android.os.Bundle)

2. Implicite

2. Par procuration

Le composant cible n'est pas nomm Activer un composant capable de prendre en charge cette action, sur cette donne Les filtres d'intention indiquent au bus si le message d'activation doit tre dlivr au composant

Stockage

sur le principe d'une table de hash

Instance de android.content.PendingIntent Le composant cible est activ par un lment tiers, de la part du composant source (toutes ses permissions lui sont cdes pour l'occasion)

Mthode putExtra surcharge Les types de base (+array) sont grs Les types complexes (c-a-d les classes) doivent implmenter Parcelable,ou Serializable

Rcupration

Mthode propre chaque type, de la forme getXXXExtra()

Intent : code source


package fr.univpau.bankster; import android.app.Activity; import android.content.Intent; public class Home extends Activity { void goToNextScreen() { Intent i = new Intent(); /* Intent de type direct */ i.putExtra("happy", false); /* Donne additionnelle */ if(je_connais_la_cible) { /* Dsignation explicite (implmentation) */ i.setClass(Home.this, NextActivity.class); } else { /* Dsignation implicite (action + data) */ i.setAction(Intent.ACTION_DIAL); i.setData(Uri.parse("tel:01-56-60-12-34")); } this.startActivity(i); /* Pouss sur le bus */ } }

Actions et URI courantes


Action
ACTION_EDIT ACTION_VIEW ACTION_CALL ACTION_VIEW

URI
content://contacts/people/125 geo:49.5000,123.5000 tel:0156601234 google.streetview: cbll=49.5000,123.5000

Signification
diter la fiche du contact 125 Ouvrir lapplication de golocalisation la position donne (latitude, longitude). Appeller le numro Ouvrir google street view la localisation donne

...

...

...

Actions

natives android d'une URI

Constantes de la classe android.content.Intent

Format

scheme://host:port/path schemes usuels : http, mailto, tel, mms, geo, file...

Filtres d'intention
Chaque

Rsolution des intentions


Repose

composant peut dfinir ses filtres d'intention au niveau du manifeste


ACTION : Quelles actions sont supportes ? DATA : Pour des donnes de quelle nature ? CATEGORY : Dans quelles circonstances ?

sur le mode de dsignation choisi

Explicite : le composant cible est excut Implicite : 0, 1 ou plusieurs composants sont ligibles

Dans le cas spcifiques des activits, comme une seule d'entre elles peut tre excute, l'utilisateur sera invit faire un choix
A1 A2 A3

Permettra

au bus de savoir si le message d'activation (i.e. l'intent) doit tre dlivr au composant ou non de filtres implique une dsignation explicite du composant

ACTION_VIEW tel:112
<activity android:name="A1"> <intent-filter> <action name="...VIEW"/> <data scheme="http"/> </intent-filter> </activity> <activity android:name="A2"> <activity android:name="A2"> <intent-filter> <intent-filter> <action name="...VIEW"/> <action name="...VIEW"/> <data scheme="tel"/> <data scheme="tel"/> </intent-filter> </intent-filter> </activity> </activity> <activity android:name="A3"> </activity>

L'absence

Bus

Mcanisme de rsolution
Principe

Actions personnalises
Dfinir

d'un chargeur de classes

ses propres verbes d'action

Liaison statique dans le cas d'une dsignation explicite


la classe charger est connue au moment de la compilation

package fr.univpau.bankster; public class Home extends Activity { public static final string DEBITER = "fr.univpau.bankster.DEBITER"; @Override public void onCreate(Bundle savedInstanceState) { startService(new Intent(Home.DEBITER)); } }

Liaison dynamique dans le cas d'une dsignation implicite

la classe charger sera dcouverte au moment de l'xcution

Mcanisme

implment par com.android.server.IntentResolver


Mise en correspondance des intentions ( la demande ) et des filtres d'intentions disponibles ( l'offre ) Calcul de correspondance bas, dans l'ordre, sur

Dclarer

des filtres en consquence

Les Actions, puis les Catgories, et enfin les Data

<manifest> <application> <service android:name="AccountManager"> <intent-filter> <action android:name="fr.univpau.bankster.DEBITER"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </service> </application> </manifest>

Applications et Tches
Ainsi,

Broadcast receiver
Ragit

une application peut faire appel des "morceaux" d'autres applications


Rutilisation/partage de composants voulu par Android

aux annonces diffuses l'aide sendBroadcast(...)


System-defined : la batterie est faible, un SMS vient d'arriver, etc. User-defined : solde bancaire ngatif, etc.

Une

succession d'activits pour atteindre un objectif donn est appele "Tche"


Les activits empiles proviennent de diverses applications Compltement transparent du point de vue de l'utilisateur

Ne Un

ncessite pas une interface graphique broadcast receiver est une classe qui tend

Une

application peut possder plusieurs points d'entre (pas de "main" unique donc)
Il est possible de lancer n'importe quelle partie expose d'une application via le manifest, sans en lancer la totalit

android.content.BroadcastReceiver

Un

receiver s'abonne/dsabonne via le fichier manifest ou programmatiquement

Receiver : code source


package fr.univpau.bankster; import android.content.BroadcastReceiver; public class Sleep extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { //si besoin, accder aux extras de l'intent arg1 Intent i = new Intent(arg0, AccountCleaner.class); arg0.startService(i); } }

Content Provider
Un

content provider sert rendre une partie des donnes d'une application accessibles aux autres applications

Seul moyen pour un partage de donnes interapplications

Un

content provider est une classe qui tend

android.content.ContentProvider

Expose
<manifest> <application> <receiver class="fr.univpau.bankster.Sleep"> <intent-filter> <action android:name="android.intent.action.SCREEN_OFF"/> </intent-filter> </receiver> </application> </manifest>

les donnes via une URI dont le schme ddi est 'content'

System-defined : content://sms/inbox/125 User-defined : content://fr.univpau.bankster/account/28854165

Rsolution de contenu
Diffrentes

Content Resolver : exemples


content://call_log/calls
SpyApp

techniques de persistance
Content Providers Natifs
Settings + + delete() delete() + + insert() insert() + + notifyChange() notifyChange() + + query() query() + + update() update()

Fichier binaire (srialisation d'objets) Fichier XML/JSON Base de donnes embarque ou distante Etc.

CallLog

La

faon dont sont rellement stockes les donnes doit rester transparente
Interface commune pour manipuler les donnes offerte par un content provider Elle s'obtient via un contentResolver

MediaStore.Images

Content Resolver

MediaStore.Audios

ContentResolver cr = getContentResolver();

URI et type MIME


Publier

Provider : code source


package fr.univpau.bankster; import android.content.ContentProvider; public class AccountProvider extends ContentProvider { public static final URI CONTENT_URI = Uri.parse("content://fr.univpau.bankster/account"); public boolean onCreate() { /* Initialiser la source de donnes ici */ return true; } public Cursor query(Uri uri, String[] projection, ) { /* En fonction du format de l'URI */ if (uri_termine_par_un_ID) { /* Renvoyer un seul compte client */ } else { /* Renvoyer tous les comptes */ } } }

l'URI de votre provider

Elle sera utilise pour y accder via le ContentResolver public static final URI CONTENT_URI = Uri.parse("content://fr.univpau.bankster/account");

Deux

cas de figure :
: content://fr.univpau.bankster/account/[id]

1) Un seul enregistrement
URI Type MIME : vnd.android.cursor.item/fr.univpau.bankster

2) Plusieurs enregistrements

URI

: content://fr.univpau.bankster/account/

Type MIME : vnd.android.cursor.dir/fr.univpau.bankster

Principe de R.java

Interface graphique utilisateur (GUI)

Chaque

lment dfini dans le rpertoire /res impacte le fichier R.java ( ne pas toucher)
Gnration automatique de classes internes la classe R, ainsi que des constantes de type entier sur 32bits

Chemin

d'accs aux ressources via R.java

user-defined : fr.univpau.foo.R.color.rose_bonbon system-defined : android.R.color.darker_gray

Objet

java reprsentant les ressources

Instance de la classe android.content.res.Resources Ressources du projet en cours : context.getResources()

R.java
public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class id { public static final int editText1=0x7f050000; public static final int listView1=0x7f050001; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } }

Exploiter les ressources


Utiliser
Le fichier R permet de tirer parti d'une vrification syntaxique par le compilateur

des ressources depuis le code

La plupart des lments de l'API sont prvus pour accepter des ressources Android en paramtre (int ressource) obj.setColor(R.color.rose_bonbon); obj.setColor(android.R.color.darker_gray);


Le fichier R permet de tirer parti d'une compltion automatique de code dans l'diteur Eclipse

Rfrencer

des ressources depuis d'autres

ressources

attribute="@[packageName]:resourcetype/resourseIdent" <EditText android:textColor="@color/rose_bonbon"/> <EditText android:textColor="@android:color/darker_gray"/>

UI : User Interface
Une API

Les Vues Android


View

Java riche dclarative la XML


Mais peut se faire de faon 100% programmatique

Principe

Des layouts et des widgets (appels Vues )

Programmation

du design pattern Composite

0..*

+onDraw(Canvas canvas) +invalidate()

ViewGroup
+addView(View child)

ViewSimple

Spare la vue du code mtier

Fonctionnalit

de personnalisation

Hriter et redfinir un widget de base Combiner des widgets existants Dessin 100% personnalis - View::onDraw(Canvas canvas)

ViewGroup

ViewSimple (widget)

LinearLayout TableLayout RelativeLayout FrameLayout ScrollView

Button EditText TextView Spinner CheckBox

Rendu

2D/3D (non abord dans ce cours)

OpenGL, Renderscript

Layouts : aperu

Proprits 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 | ...

Proprits de placement
Poids

Widgets : aperu

Taux d'espace libre affects chaque widgets android:layout_weight = ? (0 par dfaut)

Espacement

(intra)

Espacement entre un contenu et les bords de sa vue android:padding? = top | left | right | bottom

Espacement

(inter)

Espacement entre les vues android:layout_margin? = ??px

Sauvegarder/restaurer l'tat des vues


Lorsqu'une

Fragments
Nouveaut

activit passe en arrire-plan

depuis Android 3.0

L'tat de tous les widgets (munis d'un id) sont automatiquement sauvegard/restaur via un bundle

Prvus pour les crans plus larges, comme les tablettes

Lorsqu'une

activit doit tre recre

Principe

de base

Deux cas de recration complte suite une destruction


1. L'activit change de configuration (orientation, langage...) 2. L'activit passe en arrire plan mais est tue par le systme (rquisition !)

Fragmentation de l'espace d'affichage en diffrentes zones, chargeables indpendamment Mme ide que les "Frames" en HTML

Sauvegarde/restauration manuelle via un bundle

Un

fragment est une classe qui tend

onSaveInstanceState() et onRestoreInstanceState()

android.app.Fragment

Pour qu'un objet survive un changement de configuration

Les

onRetainNonConfigurationInstance() et getLastNonConfigurationInstance()

fragments sont ensuite attachs/dtachs une activit hte

Activits ddies
Afin

Dialogues et Toasts
Dialogues

de simplifier les choses, il existe des classes prdfinies tendre directement


ListActivity : si votre activit prsente une liste d'items ExpandableListActivity : si votre activit prsente une liste d'items extensible TabActivity : si votre activit prsente des onglets PreferenceActivity : si votre activit prsente un panneau de prfrences FragmentActivity : si votre activit contient des fragments MapActivity : si votre activit prsente une carte google maps (introduite par l'API Google Maps)

Toasts

Confirmation

Message compact et rapide l'intention de l'utilisateur

Progession

Menus
Menu

Barres
Menu

principal

contextuel

Barre

d'action rapide

Barre

d'action

Thmes et styles
Un

Instanciation des vues


Il

thme correspond une "feuille de styles"

Ensemble de styles appliquer une activit Thmes par dfaut : Theme.Holo.Dark, ...

est ncessaire d'instancier les vues (i.e. obtenir des objets) pour pouvoir les manipuler les widgets depuis le code

Rcuprer

Un

style est une ressource Android

Grce aux identifiants affects chaque vue Button myButton = (Button) findViewById(R.id.my_button);

System-defined : android.R.style.Widget_Button, ... User-defined : R.style.Joli, R.style.Joli2, ... Hritage de style possible en xml (parent="@style/Joli")

Rcuprer

toute une vue depuis le code

Chaque

vue est stylisable


Dsrialiser (inflate) un fichier XML dcrivant un layout ou un menu View my_view = LayoutInflater.inflate(R.layout.main, null); MenuInflater.inflate(R.menu.control, my_menu);

Proprits : taille, padding, background, textColor, ... Un seul style applicable la fois (android:style="@style/Joli")

Gestion des vnements


Principe

Les adaptateurs
Les

des couteurs de Java SE

Fournir une implmentation respectant un contrat (interface) afin de ragir des types d'vnements particuliers

adaptateurs sont des classes qui lient des donnes aux vues de l'UI
Les vues concernes tendent android.widget.AdapterView

Gestion

du KeyPad (tap, trackball)


Bizarrerie : un seul listener par widget :-/

Classes

d'adaptateurs

OnClickListener, OnLongClickListener
onClick(View), onLongClick(View)

Hritent de android.widget.BaseAdapter SimpleAdapter, ArrayAdapter<?> : sert rcuprer des donnes stockes dans une collection

OnKeyListener

onKeyUp(KeyEvent), onKeyDown(KeyEvent)

Exploite par dfaut la valeur de la mthode toString() des objets de la liste

Gestion

du TouchScreen (pression, gesture)

OnTouchListener
onTouchEvent(MotionEvent)

CursorAdapter : sert rcuprer des donnes stockes dans une base de donnes relationelle (SQLite) Vous pouvez tendre ces classes de base pour grer finement vos items (conseill)

Model-View-Presenter (MVP)
Register/Unregister Observers

Apparences des items


L'apparence

PRESENTER PRESENTER
Notify data changed
(CursorAdapter, (CursorAdapter, ArrayAdapter, ArrayAdapter, ...) ...)

des items sont dfinies par dfaut par des layouts systme
android.R.layout.simple_spinner_item

BaseAdapter BaseAdapter adapted-by

spcifie un texte align gauche et un bouton radio droite, ainsi qu'un texte noir sur fond blanc.

query data refresh

android.R.layout.simple_list_item_1

Spcifie un texte align gauche, ainsi qu'un texte blanc sur fond transparent.

MODEL MODEL
Cursor Cursor ou ou Collection Collection

VIEW VIEW
(Spinner, (Spinner, ListView...) ListView...)

...

AdapterView AdapterView

(ArrayList, (ArrayList, [[ ]...) ]...)

Vous

pouvez videmment dfinir vos propres layouts pour crer des items plus complexes
fr.univpau.bankster.R.layout.mon_bel_item

Notifications
Diffrentes

Application Multi-crans
Prvoir

formes

diffrentes variantes d'une mme image

LED Son Vibreur Barre de notification (icne)

/res/drawable-hdip/icon.png /res/drawable-mdip/icon.png /res/drawable-ldip/icon.png

Prvoir Utilisation

facilite par le notification manager

les deux orientations possibles (portrait ou landscape)


NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(NUMBER, new Notification(...))

/res/layout-port/main.xml /res/layout-land/main.xml

Depuis le code, on manipule une seule ressource, sans se soucier de la rsolution (R.drawable.icon)

Images redimensionnables
Utiliser

Application Multi-langues
Prvoir

les images 9 patchs

diffrentes variantes d'une mme chane


On manipule une seule ressource, sans se soucier de la langue (R.strings.hello)

Images divises en neuf zones (dont certaines tirables) Outil Draw 9-patch du rpertoire /tool du SDK Android

/res/values-fr/strings.xml /res/values-en/strings.xml /res/values-it/strings.xml

Draw9patch.exe produit des fichiers *.9.png

Le

choix sera fait automatiquement en fonction de la configuration du terminal (ex: LOCALE=FR_fr) galement aux images car elles peuvent afficher du texte !

S'applique

/res/drawable-fr/splashscreen.png /res/drawable-en/splashscreen.png

Shared Preferences

Persistance et threading

Mcanisme

simple et lger

Sauvegarde de paires cl/valeur simple SharedPreferences pref = getPreferences(Activity.MODE_PRIVATE)

Sauvegarder

des prfrences

Rcupre un diteur de prfrences : Editor ed = pref.edit() Stocke les paires : ed.putString("teacher", "Olivier Le Goaer"); ed.putBoolean("isBrilliant", true); Valide les modifications : ed.commit();

Retrouvez

des prfrences

String t = pref.getString("teacher","unknown");

Gestion de fichiers plats


Mcanisme

Srialisation d'objets
Chaque

de lecture/criture de fichiers

Exploite l'espace de stockage interne ou externe API habituelle java.IO

classe implmente l'interface Serializable (+champs serialVersionUID)


Idem que pour java SE Format de stockage binaire

Sauvegarde

et chargement

Flux de sortie : FileOutputStream fos = openFileOutput("CAC40.dat", Context.MODE_PRIVATE) Flux d'entre : FileInputStream fis = openFileInput("CAC40.dat")

Bas

sur la gestion de fichiers ci-avant

Srialisation
ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(myObject);

Cas

d'un fichier statique (lecture uniquement)

Dsrialisation

Dposez-le dans le rpertoire res/raw/ de votre projet Accs avec openRawResource(R.raw.cac40)

ObjectInputStream ois = new ObjectInputStream(fis); myObject = (myClass) ois.readObject();

XML et JSON
XML

Base de donnes embarque


Android

Note SAX plus performant que DOM !

embarque le SGBD-R SQLite

Parsing de ressources au format XML Voir API javax.xml.parsers


Lger et puissant Typage dynamique des colonnes Ne gre pas les contraintes d'intgrit rfrentielle

Approche hirarchique (DOM) : org.w3c.dom Approche vnementielle (SAX) : org.xml.sax

JSON

Types

de donnes

NONE, INTEGER, REAL, TEXT, BLOB

Parsing de ressources au format JSON Voir API org.json

Implmentation

Les types Boolens, Dates, sont ''muls'' avec ces types primitifs

Support du standard SQL-92

Mais manque RIGHT OUTER JOIN et FULL OUTER JOIN...

Support partiel des dclencheurs (triggers)

Bonnes pratiques
Crer

Interrogation de la base
Approche

un helper

par SQL brut

tendre android.database.sqlite.SQLiteOpenHelper Classe abstraite qui gre la cration, l'ouverture et la monte de version d'une base de donnes myHelper = new BanksterHelper(context, "bankster.db", null, 1)

La requte est fournie sous forme de chane de caractres du dialecte SQL db.rawQuery("SELECT * FROM Customer WHERE id>? AND id<?", new String[]{"47645", "58421"})

L'instance

de la BDD est ensuite obtenue l'aide du helper, selon deux modes


SQLiteDatabase db; db = myHelper.getWritableDatabase() //lecture et criture db = myHelper.getReadableDatabase() //lecture seule

Approche

par composante

Une requte est fournie via ses composantes relationnelles (projection, slection, groupement, tri...) db.query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

Rsultats
L'ensemble

Ajout, suppression, m-a-j


Reprsentation

des tuples (ou n-uplets) retourns par une requte est un curseur
Cursor res = db.query(...)

d'un tuple

Un n-uplet est une instance de android.content.ContentValues n paires nom-de-champ/valeur-de-champ

On

peut ensuite parcourir cet ensemble

Ajout

de tuples de tuples

Mme principe que les itrateurs de collection Java Utiliser les mthodes de la forme get<Type>(int columnIndex) pour rcuprer la valeur d'un champ
//vrifie qu'il y a au moins un tuple if (res.moveToFirst()) { //itre sur chaque tuple do { String customerName = res.getString(3); //3e champ } while(res.moveToNext()) } Fermeture d'un curseur : manuellement ou en mode ''manag''

db.insert(String table, String nullColumnHack, ContentValues values)

Supression

db.delete(String table, String whereClause, String[] whereArgs)

Mise

jour de tuples

db.update(String table, ContentValues values, String whereClause, String[] whereArgs)

Threading : viter les ANR


Grer

Thread principal : UIThread


Tous

les traitements qui ralentissent l'UI et donc qui dgradent l'exprience utilisateur
viter une "Application Not Responding" (ANR) Fermeture fore de l'application au bout de n secondes

les composants d'une application dmarrent dans le thread principal UIThread


Gre l'affichage graphique et les interactions utilisateur Vos traitements "consommateurs" et lents bloqueront tous les autres composants (dont affichage + interactions) :-(

Deux

exemples rcurrents :

1) Communications rseaux
Une NetworkOnMainThreadException est leve depuis Android 3.x

Ncessit

de dplacer ces traitements en tches de fond (i.e. processus lgers)


A l'aide de tches asynchrones A l'aide de vos propres Threads enfants

2) Manipulations SQLite

Voir du cot de android.app.LoaderManager

Et

pensez faire patienter votre utilisateur


Barre de progression, SplashScreen au dmarrage...

Puis

les synchroniser avec l'interface graphique

Car le UIThread est le seul habilit modifier les vues !

Tche asynchrone
Classe Fournit

Thread enfant
Mme

qui tend android.os.AsyncTask<?,?,?>

fonctionnement que JAVA SE

des gestionnaires d'vnements dj synchroniss avec le UIThread pour mettre jour les vues

Crer une instance de la classe java.lang.Thread qui encapsulera une instance implmentant la mthode run() de l'interface java.lang.Runnable
new Thread(new Runnable() { public void run(...) }).start();

doInBackground : placez le code excuter cet endroit. Pas d'interaction avec l'UI ! onProgressUpdate : mettez jour l'UI au fil du traitement onPostExecute : une fois le traitement termin, m-a-j de l'UI

Pour

synchroniser un thread enfant avec l'UI


runOnUiThread(new Runnable() {...});

Directement depuis une activit Dans les autres cas


Excution

de la tche

Instancier un handler ncessairement dans le UiThread : h = new Handler(); Y enfiler des runnables depuis le thread enfant : h.post(new Runnable(){...});

new MyAsyncTask().execute(data1, data2, ...);

Les capteurs

Exploiter les dispositifs matriel

Un

priphrique Android peut possder aucun ou plusieurs capteurs (sensors en anglais)


Cinmomtre (ou acclromtre) Gyroscope (ou boussole) Luminomtre Magntomtre ...

Constantes

supportes par la classe android.hardware.Sensor


TYPE_AMBIENT_TEMPERATURE, TYPE_GRAVITY, TYPE_GYROSCOPE, TYPE_LIGHT...

Principes des capteurs


Systme

Capteurs : code source


package fr.univpau.bankster; import android.app.Service; import android.hardware.*; public class FallingDown extends Service { @Override public void onCreate() { // Mise en place de l'coute de l'acclromtre sm = (SensorManager)getSystemService(SENSOR_SERVICE); a = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sm.registerListener(new SensorEventListener() {...}, a); } @Override protected void onDestroy() { super.onDestroy(); sm.unregisterListener(...); } }

d'abonnement un capteur

Votre programme est l'coute des vnements qui surviennent au niveau d'un capteur Le SensorManager (android.hardware.SensorManager) permet de grer facilement les abonnements en cours

Mthodes registerListener() et unregisterListener()

Surtout,

bien penser se dsabonner

Car les donnes continuent d'tre acquises (mme si elles ne sont pas traites) et cela consomme de l'nergie ! Se gre au niveau du cycle de vie des composants concerns

Typiquement, dans les mthodes onPause() et onDestroy()

Acquisition des donnes


Choisir

Evnement de capteur
L'vnement

son taux d'acquisition (toutes les n microsecondes)


Exemple de contantes de la classe Sensor : SENSOR_DELAY_NORMAL, SENSOR_DELAY_FASTEST...

est modlis par :


la prcision de l'acquisition le capteur qui l'a gnr son horodatage les valeurs brutes

Une

seule valeur

Luminomtre, pression, proximit...

Trois

valeurs (X-Y-Z)

Interface

android.hardware.SensorEventListener commune tous les capteurs


onAccuracyChanged() : la prcision a change (+/-) onSensorChanged() : une nouvelle valeur brute est disponible

Acclromtre, gravit, gyroscope...

Vecteur de flottants dont la taille et l'interprtation dpendent du capteur

Chaque

vnement est un objet instance de la classe android.hardware.SensorEvent

Multi-touch
Supporte

vnements gestuels
plusieurs pointeurs simultans
Doigt, stylet... Limite thorique : 256 event.getPointerCount() chaque pointeur actif est attribu un ID

Une

mme instance de android.view.MotionEvent peut ainsi modliser de multiples vnements


Autant qu'il y a de pointeurs actifs la surface Technique du masque binaire pour extraire les informations

event.getActionMasked()

Diffrencie

le premier pointeurs des suivants

Cycle de vie (ou d'actions) du premier pointeur


ACTION_DOWN (ACTION_MOVE)* ACTION_UP

Trois
a) Tap

gestes de base

Cycle de vie (ou d'actions) des suivants

b) Drag c) Pinch-Zoom

ACTION_POINTER_DOWN (ACTION_MOVE)* ACTION_POINTER_UP

L'ID d'un pointeur reste inchang lors de son cycle de vie

Golocalisation
Exploiter

vnements de position
Interface

le gestionnaire de position le choix d'un fournisseur de position

Instance de android.location.LocationManager

android.location.LocationListener pour couter les changements de position


onLocationChanged() : une nouvelle position est disponible onProviderDisabled()/Enabled() : fournisseur dsactiv/activ onStatusChanged() : le statut du fournisseur a chang

Require

Instance de android.location.LocationProvider Exemple de constantes de la classe LocationManager : LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER, ... Chaque fournisseur offre diverses caractristiques

OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE, AVAILABLE

Chaque

position est un objet instance de la classe android.location.Location


Modlis par : latitude, longitude, cap, altitude, vitesse, et horodatage Parfois, dtails additionnels dans les extras (Bundle)

Consommation d'nergie Prcision Capacit dterminer l'altitude ...

Il est possible de choisir le ''meilleur'' fournisseur par rapport des critres

Golocalisation : code source


package fr.univpau.bankster; import android.app.Activity; import android.location.*; public class FindNearestAgency extends Activity { @Override public void onCreate() { // Choix du fournisseur de position GPS lm = (LocationManager)getSystemService(LOCATION_SERVICE); String gps_prov = LocationManager.GPS_PROVIDER; // Mise en place de l'coute des changements de position loc_list = new LocationListener() {} // Laps (5sec) et distance (6m) minimums entre 2 updates lm.requestLocationUpdates(gps_prov, 5000, 6, list); } @Override public void onDestroy() { lm.removeUpdates(loc_list); } }

Cartographie
La

golocalisation est un tremplin naturel vers la cartographie


Service dimages tuiles pour permettre une visualisation fluide et performante Gocodage (avant/inverse) : coordonnes adresses + services ad-hoc : itinraires, cadastre, lieux d'intrts, trafic, street view, ...

Choisir

une tierce API de cartographie

// Ne pas oublier !

Fournie par des entreprises qui se sont spcialises dans la cartographie

Google, Mappy, IGN (Territoire Franais), Nokia Here Maps...

L'API Google Maps est logiquement favorise sous Android

Google Maps lements cls


MapView

Voir aussi l'activit ddie MapActivity

Google Maps - Coordonnes


Chaque

Instance de com.google.android.maps.MapView

coordonne est un objet instance de la classe com.google.android.maps.GeoPoint


Moins riche qu'une instance de android.location.Location

Vue composite (ViewGroup) destine afficher une carte

MapController

Latitude et Longitude uniquement Exprimes en microdegrs et non plus en degrs (donc x 106)

Instance de com.google.android.maps.MapController Utilis pour contrller la carte, vous permettant de centrer et de rgler le niveau de zoom...

Projection

des coordonnes

Overlay

Traduire des coordonnes gographique (latitude, longitude) en coordonnes cran (x,y)

com.google.android.maps.GeoPoint android.graphics.Point

Instance de com.google.android.maps.Overlay Permet d'utiliser un canvas pour dessiner autant de couches que ncessaires, affiches au dessus de la carte

Interface com.google.android.maps.Projection

Mthodes toPixels() et fromPixels()

Bluetooth : vue d'ensemble


BluetoothDevice #1
Bluetooth Server Socket Bluetooth Socket

Divers

BluetoothDevice #2

BluetoothAdapter BluetoothDevice #3

Services systme
Il

Alarmes et Timers
Les

est frquent de rcuprer des Managers partir de services systmes prconfigurs


alarmes sont un moyen de dclencher des intents (et donc des composants)
des heures dtermines des intervalles dtermins

Appel de la mthode getSystemService(Context.XXXXX) Retour : LocationManager, LayoutInflater, WifiManager...

Exemples

de services (constantes)

Prise

en charge par le gestionnaire d'alarmes

Context.LOCATION_SERVICE Context.LAYOUT_INFLATER_SERVICE

AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE) am.set(TYPE, TIME, pendingIntent)

Context.STORAGE_SERVICE Context.TELEPHONY_SERVICE Context.WIFI_SERVICE

Les

timers eux, grent l'excution de tches

new Timer().shedule(new TimerTask() {...}, new Date());

Linkify, TextWatcher
Transformer

Application : variable globale


Comment

des textes (TextView) en liens cliquables (i.e. gnrateurs d'intents)


Classe utilitaire android.text.util.Linkify Reconnaissance de motifs : n tel, email, URL, map...

partager des donnes travers tous les composants d'une application ?


Crer une sous classe de android.app.Application Gre des vnements propres la vie de l'application

onCreate(), onTerminate(), onLowMemory(), onConfigurationChanged()

Contrler

la saisie d'un texte (EditText)

Se dclare au niveau du nud <application> du manifeste

Classe utilitaire android.text.TextWatcher Gre des vnements : avant, aprs, pendant la saisie

Principe

du singleton

Une seule instance de la classe pour toute l'application Les variables d'instances sont les donnes partager

Mapping objet-relationnel
Le

Base de donnes distante


La

vas-et-viens entre la BDD embarque et les objets mtiers est fastidieuse


Appliquer le fameux pattern DAO

connexion d'un priphrique Android une BDD distante n'est pas prvue (ni souhaitable)
Pas de pont "JDBC" en quelque sorte

Il Il

existe toutefois des solutions ORM adaptes Android (car lgres)


est ncessaire de mettre en place une approche par "WebService"


SOAP REST
... JSP/Servlets,... PHP,JSP/Servlets, PHP,

ORMLite ActiveAndroid NeoDatis

DB4O Orman DataFramework

Androrm

Requte

Serveur Serveur HTTP HTTP

Astuce : masquez le tout avec un ContentProvider

Rponse

(Oracle, (Oracle, MySQL, MySQL, PosgreSQL...) PosgreSQL...)

BDD BDD

+ +

...
XML/SOAP, JSON...

192.56.7.45

Mockups pour MobileApps


Prototypage

de l'UI de votre MobileApp


Dessiner les crans avant de dmarrer le dveloppement

Tests et dploiement

Outils

de mockups

Balsamiq (web demo) MobiOne Studio (free) OmniGraffle (Mac, $99) http://yeblon.com/androidmockup/ http://mokk.me ...

Test de la couche mtier


Tests

Test de l'UI
Le

unitaires de trois types de composants applicatifs Android


Activits, Services, et Providers

test du singe sur votre IHM

Ide : "si elle rsiste au comportement anarchique d'un singe, elle rsistera l'utilisateur" Gnre des vnements pseudoalatoires, tels que des clics, des pressions de touches, des gestes, etc.

Extension

JUnit pour Android

android.test.AndroidTestCase tend junit.framework.TestCase junit.framework.Assert android.test.InstrumentationTestRunner

Le

programme s'excute dans votre mulateur

Se lance en ligne de commande


adb shell monkey [options] <event-count>

Mise

en place d'un projet de test

Vous suivez les vnements gnrs dans le log


Sous-rpertoire tests/ de votre projet android Code source de vos tests + manifeste

:Sending Pointer ACTION_DOWN x=437.0 y=183.0 :SendKey (ACTION_DOWN): 90 // KEYCODE_FORWARD= ...

Exporter et signer
Toute

Distribution des MobileApps


3

application doit tre signe

solutions s'offrent vous


Choisir Google Play Store (Android Market)

Signature digitale avec un certificat dont la cl prive est conserve par le(s) dveloppeur(s) Signature avec la cl de dbugage par dfaut

Site officiel : https://play.google.com 25$ de frais de dossier pour l'accs au store 70% du prix de vente va aux dveloppeurs (30% Google) Les autres revenus gnrs sont reverss via Google Checkout

Trois
1

tapes :

Obtenir une cl prive (stocke dans un "keystore")


Utilitaire keytool.exe du JDK
Procdure entirement automatise avec ADT

Autopublier sur votre propre site Web


Exemple : http://www.univ-pau.fr/~olegoaer/bankster.apk Type MIME pour le tlchargement : application/vnd.android.package-archive

Signer l'APK avec la cl prive

Utilitaire jarsigner.exe du JDK

Choisir un magasin alternatif


Optimiser l'APK qui vient d'tre sign

YAAM (http://yaam.mobi/) Bazaar (http://www.bazaarandroid.com/) AndroLib (http://fr.androlib.com/)

Utilitaire zipalign.exe du SDK Android

Analyse d'audience
Google Analytics

SDK pour Android

Nombre d'utilisateurs actifs de votre application Leur localisation travers le monde Impact de votre campagne de pub (ralisation d'objectifs) Et plein d'autres mtriques...

Principes

de fonctionnement

Affection d'un UA number de la forme UA-xxxxx-yy Insertion d'instructions de tracking (vnements, affichages...) dans le code Tableau de bord disponible sur www.google.com/analytics