Beruflich Dokumente
Kultur Dokumente
CM/TD/TP
Evaluation
[70%] [30%]
Ressources
pdagogiques
Olivier Le Goaer
M2 TI Anne 2012-2013
Pr-requis du module
Langages
Plan du module
Avant-propos
de dveloppement
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
Dvelopper
une MobileApp
Base
de donnes
SQL
Un march en explosion
Avant-propos
Vente
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
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
Capteurs
Une
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)
Tlphonie mobile
2me
1990 : GSM (Global System for Mobile Communication) Frquences 900 et 1800 MHz, dbit 9,6 Kb/s
2,5
gnration
2001 : GPRS (General Packet Radio Service) Dbit 250 Kb/s mais la voix continue de transiter sur le rseau GSM
3me
Zone de couverture
Rseaux personnels sans fil (WPAN) Rseaux locaux sans fil (WLAN) Rseaux mtropolitains sans fil (WMAN) Rseaux tendus sans fil (WWAN)
gnration
2004 : UMTS (Universal Mobile Telecommunications System) Frquences 1900-2200 MHz, dbit 2 Mb/s
OS mobile : dveloppements
Plateforme Windows Phone iOS/Iphone Blackberry OS Java ME Android Symbian OS Bada Mozilla OS Programmation VB.Net, C# Objective-C Java Java Java, code natif C++ C++ C++ HTML/CSS/Javascript Outillage conseill Visual studio .Net X-CODE MDS Studio EclipseME (CLDC, MIDP) Eclipse + ADT Performance badaIDE Xemacs ? ;-)
Modles de dveloppement
MobileApp
Portabilit Dveloppement/cot Mises jour Disponibilit Fonctionnalits
Le dfi du cross-plateforme
Il
versus WebApp
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
PhoneGap : installation d'un socle web pour chaque plateforme cible, puis developpement HTML/CSS/Javascript Canappi : DSL (Domain Specific Langage) de haut-niveau traduit en code natif pour chaque plateforme cible Titanium Mobile : codage (javascript-like) interprt par un composant pr-install sur chaque plateforme cible. Neomades : codage (android-like, donc java) bas sur une API propritaire. Puis transformation vers chaque plateforme cible Codename One : codage bas sur une API Java gnrique. Puis gnration vers chaque plateforme cible ...
Modle
hybride
Encapsulation d'une WebApp dans une MobileApp Ce modle, qui est un compromis, est amen se dvelopper de plus en plus
Le
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.
Les
browsers mobile et le support des standards W3C sont au coeur des enjeux
Apple Safari : moteur WebKit Google Chrome : moteur WebKit Microsoft IE : moteur Trident Mozilla Firefox : moteur Gecko
WebApp mobile-friendly
Customisation
Frameworks actuels
Sencha Sencha Touch Touch iUI iUI
Renvoyer au terminal mobile une page adapte ses spcificits (mobile-friendly) Taille cran limite, dbit limit, pointage tactile...
Deux
1) Handheld stylesheets
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 auquel il est habitu
... ...
Principes de bases
Vous
Puis,
Au
Une apparence graphique trs "iOS-like" Des effets de transitions entre les pages
Etape 1 : importation
librairies sont requises
Soit stockes en local sur votre serveur Soit directement sur le serveur publique haute disponibilit de jQuery.com
Importation
Une feuille de style spcifique mobile (.css) La librairie javascript jQuery (.js) La librairie 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>
Etape 2 : structure
Exploitez
Modle de navigation
Lien
Multi-pages
intra-document
1 document = 1 page
1 document = n page
HTML HTML Permet le pr-fetch des pages
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)
HTML HTML
Lien
Page Page Page Page lien inter-document
inter-document
Utilisez l'URL du document cible: <a href="./bar.html">next</a> Une requte Ajax est forge, le contenu de la page est ajoute au DOM courant et une transition opre Si le document cible est multi-pages, ajoutez rel="external" au lien, ou bien data-ajax="false"
Quelques composants
Barre
Formulaires
Balise
d'outils
classique
Formatage
Puis,
Boutons
Pour
Listes
Formulaires
Dialogues
Une
Catgories d'vnements
Lis
au pointage/touch au changement d'orientation de l'cran au dfilement de l'cran l'affichage des pages l'initialisation des pages
Lis
orientationchange
Lis
scrollstart, scrollstop
Lis
Tout
Lis
pagebeforecreate, pagecreate
Et la "touche finale"
Immiter
$('elem').live('eventName', callback);
Exemples
Solutions
//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')
Dmo : Bankster
Bankster
Tester
Fonctionnalits
Partie publique
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/
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
Framework
Qunit : http://docs.jquery.com/Qunit
Bref historique
2007 Annonce Annonce d'Android d'Android +SDK +SDK Open Open Handset Handset Alliance Alliance
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
Matriels Android
APN APN Tablette Tablette
de + de 50 entreprises
Objectif
:
Netbook Netbook Tlvision Tlvision
Versions d'Android
CodeName
Cupcake Donut Eclair Froyo
Platform
Android 1.5 Android 1.6 Android 2.1 Android 2.2 Android 2.3 Android 3.0 Android 4.0 ? ?
API Level
3 4 7 8 9 11 14 ? ?
Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Key Lime Pie Kouign-Amann
Projet Projet Open Open Source Source C++ C++ // Java Java
Application Application dveloppes dveloppes en en syntaxe syntaxe Java Java SDK SDK complet complet fourni fourni
Android en images...
Architecture logicielle
Android
La
Tient compte des contraintes de CPU et mmoire Excute des fichiers .dex (Dalvik Executable) optimiss
Pour garantir une haute ractivit Elimination de processus sans avertissement ! Politique de priorit base sur une hierarchisation des processus
La
Outils du dveloppeur
Plugin
de la POO Java
Assistant la cration de projet Createur d'interface graphique (WYSIWYG) Vues et perspectives ddies
Idimes
Bibliothques
(API)
Apache Harmony
Android
SDK
Design
patterns
Emulateur : aperu
Boutton 'HOME' Boutton 'MENU' Boutton 'BACK'
Ecran ''Tactile''
Emulateur : limitations
Lent
Arborescence systme
au dmarrage et l'usage
Applications utilisateur (.apk)
(AngryBirds, Mto...)
Emulation (i.e. couche d'indirection) versus simulation Noyau Linux + services + composants android
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
Dossier du projet
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
Crer
des ressources
Simples valeurs, chanes de caractres, couleurs, menu, layout, styles, images, etc. Stockes dans les sousrpertoires de /res/ d'un projet Android (un seul niveau autoris)
Compilation et dploiement
Sources Java Bytecode Java Bytecode Dalvik (optimis)
.dex .dex
Entirement automatis avec le plugin ADT sous Eclipse !!
Environnement contraint
Pour
.java .java
.class .class
.apk .apk
Ressources + Manifest
.png .png .xml .xml
Application empaquete
/data/app
(ex: (ex: rpondeur rpondeur automatique automatique aux aux SMS) SMS)
(ex: (ex: mto mto du du jour) jour) (ex: (ex: lecteur lecteur de de mdia) mdia)
Widget Widget
Intermittente Intermittente
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 ...
Broadcast Receivers Ractions Ractions des des Ecrans Ecrans de de prsentation prsentation annonces/vnements annonces/vnements
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 applicatif de votre application !
Le
contexte modlise les informations globales sur l'environnement de l'application les mthodes importantes
Possde
getRessources, getPackageName, getSystemService... startActivity, startService, sendBroadcast, getContentResolver... openFileInput, openOrCreateDatabase, getSharedPreferences...
<service> <intent-filter> . . . </intent-filter> </service> <receiver> <intent-filter> . . . </intent-filter> </receiver> <provider> <grant-uri-permission /> </provider> </application>
Accs
au contexte
Depuis une Activity ou un Service : this (car hritage) Depuis un BroadcastReceiver : en argument de onReceive() Depuis un ContentProvider : this.getContext()
</manifest>
Activit
Une
mthodes de callback
void onCreate(...) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy()
Une
Exemple
1) Numroteur 2) Annuaire des contacts 3) Fiche d'un contact 4) Ajout d'un contact
Etend
android.app.Activity
Diagramme de cas d'utilisation (UML)
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
Multi-tches
Plusieurs
Une
Service
Sert
mthodes de callback
onCreate() onStart() SDK<2.0 onStartCommand() onDestroy() onBind() onUnbind()
Deux
types de services :
Local : services qui sexcutent dans le mme processus que votre application Distant (IPC) : services qui sexcutent dans des processus indpendants de votre application (cf. description AIDL)
Un
android.app.Service
processus courant
Unbounded
Mode
Bounded
Oprations
Des composant (des "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
Intents : principes
Les
trois types de composants applicatifs sont activs via des intentions (Intents)
Activity, Service et BroadcastReceveir
Principe
A
Filtre d'intentions de A
Filtre d'intentions de S
Filtre d'intentions de B
d'intention
Modes
de dsignation
1. Directe
Instance de android.content.Intent Le composant cible est activ par le composant source
1. Explicite
Le composant cible est nomm Activer tel composant
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
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
URI
content://contacts/people/125 geo:49.5000,123.5000 tel:0156601234 google.streetview: cbll=49.5000,123.5000
Signification
Editer la fiche du contact 125 Ouvrir lapplication de go-localisation la position donne (latitude, longitude). Appeller le numro Ouvrir google street view la localisation donne
...
...
...
Actions
Format
Filtres d'intention
Chaque
du mode de dsignation
Explicite : le composant cible est xcut Implicite : 0, 1 ou plusieurs composants sont cibls, mais un seul sera xcut (choix de l'utilisateur si besoin)
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
Actions personnalises
Dfinir
Applications et Tches
Ainsi,
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)); } }
Une
Dclarer
<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>
Une
application android peut possder plusieurs points d'entre (pas de "main" unique)
Il est possible de lancer n'importe quelle partie expose d'une application via le manifest, sans en lancer la totalit
Broadcast receiver
Ragit
Ne Un
@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); }
android.content.BroadcastReceiver
Un
Content Provider
Un
Rsolution de contenu
Diffrentes
content provider sert rendre une partie des donnes d'une application accessibles aux autres applications
techniques de persistence
Fichier binaire (serialisation d'objets) Fichier XML/JSON Base de donne embarque ou distante Etc.
Un
android.content.ContentProvider
La
Expose
faon dont sont rellement stockes les donnes doit rester transparente
Interface commune pour manipuler les donnes offertes par un content provider Elle s'obtient via un contentResolver
ContentResolver cr = getContentResolver();
Elle sera utilise pour y accder via le ContentResolver public static final URI CONTENT_URI = Uri.parse("content://fr.univpau.bankster/account");
+ + delete() delete() + + insert() insert() + + notifyChange() notifyChange() + + query() query() + + update() update()
CallLog
Deux
cas de figures :
: content://fr.univpau.bankster/account/[id]
MediaStore.Images
Un seul enregistrement
URI
Content Resolver
MediaStore.Audios
Plusieurs enregistrements
URI
: content://fr.univpau.bankster/account/
Principe de R.java
Chaque
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; } }
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
Objet
Le fichier R permet de tirer parti d'une compltion automatique de code dans l'diteur Eclipse
UI : User Interface
Une API
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);
Programmation
Rfrencer
Fonctionnalit
de personnalisation
ressources
Hriter et redfinir un widget de base Combiner des widgets existants Dessin 100% personnalis - View::onDraw(Canvas canvas)
attribute="@[packageName]:resourcetype/resourseIdent"
Rendu
OpenGL, Renderscript
Layouts : aperu
Principe
0..*
+onDraw(Canvas canvas)
ViewGroup
+addView(View child)
ViewSimple
ViewGroup
(layout)
ViewSimple
(widget)
Proprits de placement
Orientation
Proprits de placement
Poids
Taille
Espacement
(intra)
Espacement entre un contenu et les bords de sa vue android:padding? = top | left | right | bottom
Gravit
Espacement
(inter)
Alignement d'une vue dans son conteneur android:layout_gravity = left | center_horizontal | top | bottom | right | ...
Widgets : aperu
Afin
Activits ddies
de simplifier les choses, il existe des classes pr-dfinies tendre directement
ListActivity : si votre activit prsente une liste d'items ExpandableListActivity : si votre activit prsente une liste d'items extensible MapActivity : si votre activit prsente une carte google TabActivity : si votre activit prsente des onglets WebViewClient : si votre activit prsente un rendu de pages web PreferenceActivity : si votre activit prsente un panneau de prfrences
Fragments
Nouveaut
Dialogues et Toasts
Dialogues
Toasts
Confirmation
Principe
de base
Fragmentation de l'espace d'affichage en diffrentes zones, chargeables indpendamment Mme ide que les "Frames" en HTML
Un
Progession
android.app.Fragment
Les
Menus
Menu
Barres
Menu
principal
contextuel
Barre
d'action rapide
Barre
d'action
est ncessaire d'instancier les vues (i.e. obtenir des objets) pour pouvoir les manipuler les widgets depuis le code
Rcuprer
Fournir une implmentation respectant un contrat (interface) afin de ragir des types d'vnements particuliers
Grce aux identifiants affects chaque vue Button myButton = (Button) findViewById(R.id.my_button);
Gestion
OnClickListener, OnLongClickListener
onClick(View), onLongClick(View)
Rcuprer
OnKeyListener
Grce au nom du fichier xml dcrivant un layout ou un menu View my_view = LayoutInflater.inflate(R.layout.main, null); MenuInflater.inflate(R.menu.control, my_menu);
onKeyUp(KeyEvent), onKeyDown(KeyEvent)
Gestion
OnTouchListener
onTouchEvent(MotionEvent)
Les adaptateurs
Les
Model-View-Presenter (MVP)
adaptateurs sont des classes qui lient des donnes aux vues de l'UI
Les vues concernes tendent android.widget.AdapterView
Notify data changed
PRESENTER PRESENTER
(CursorAdapter, (CursorAdapter, ArrayAdapter, ArrayAdapter, ...) ...)
Classes
d'adaptateurs
query data
Hritent de android.widget.BaseAdapter SimpleAdapter, ArrayAdapter<?> : sert rcuprer des donnes stockes dans une collection
refresh
MODEL MODEL
Cursor Cursor ou ou Collection Collection
VIEW VIEW
(Spinner, (Spinner, ListView...) ListView...)
CursorAdapter : sert rcuprer des donnes stockes dans une base de donne relationelle (SQLite) Vous pouvez tendre ces classes de base pour grer finement vos items (conseill)
AdapterView AdapterView
Notifications
Diffrentes
des items sont dfinies par dfaut par des layouts systme
android.R.layout.simple_spinner_item
formes de notifications :
spcifie un texte align gauche et un boutton radio droite, ainsi qu'un texte noir sur fond blanc.
android.R.layout.simple_list_item_1
Spcifie un texte align gauche, ainsi qu'un texte blanc sur fond transparent.
...
Utilisation
Vous
pouvez videmment dfinir vos propre layouts pour crer des items plus complexes
fr.univpau.bankster.R.layout.mon_bel_item
Application Multi-crans
Prvoir
Images redimensionnables
Utiliser
Images divises en 9 zones (dont certaines sont tirables) Outil Draw 9-patch du rpertoire /tool du SDK Android
Prvoir
Application Multi-langues
Prvoir
Persistance et threading
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
Mcanisme
simple et lger
de lecture/criture de fichiers
Sauvegarder
des prfrences
Sauvegarde
et chargement
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();
Flux de sortie : FileOutputStream fos = openFileOutput("CAC40.dat", Context.MODE_PRIVATE) Flux d'entre : FileInputStream fis = openFileInput("CAC40.dat")
Accs
Retrouvez
des prfrences
String t = pref.getString("teacher","unknown");
Serialisation d'objets
Chaque
XML et JSON
XML
Bas
Serialisation
ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(myObject);
JSON
D-srialisation
Bonnes pratiques
Crer
Lger et puissant Typage dynamique des colonnes Ne gre pas les contraintes d'intgrit rfrentielle
Etendre 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)
Types
de donnes
Les types Boolens, Dates, sont ''muls'' avec ces types primitifs
L'instance
Implmentation
Interrogation de la base
Approche
Rsultats
L'ensemble
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"})
On
Approche
par composante
Mme principe que les itrateurs de collection Java Utiliser les mthode get<Type> pour rcuprer la valeur d'un champ
//vrifie qu'il y a au moins un tuple if (res.moveToFirst()) { //itre sur chaque tuple (i.e. chaque ligne) do { String customerName = res.getString(3); //3e champ } while(res.moveToNext()) }
Une requte est fournie via ses composantes relationnelles (projection, selection, groupement, tri...) db.query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
Thread principal
Tous
d'un t-uple
Ajout
de t-uples de t-uples
Supression
Ncessit
Mise
jour de t-uples
Puis
Tche asynchrone
Classe
Thread enfant
Mme
Fournie
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
Execution
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(){...});
Les capteurs
Un
Constantes
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
Surtout,
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
Evnement de capteur
L'vnement
Une
seule valeur
Trois
valeurs (X-Y-Z)
Interface
onAccuracyChanged() : la prcision a change (+/-) onSensorChanged() : une nouvelle valeur brute est disponible
Chaque
Multi-touch
Trois
a) Tap b) Drag c) Pinch-Zoom
gestes de base
En vrac
Un
ou deux doigts
Le dominant Le secondaire
Services systme
Il
Alarmes et Timers
Les
alarmes sont un moyen de dclencher des intents (et donc des composants)
des heures dtermines des intervalles dtermins
Exemples
de services (constantes)
Prise
Context.LOCATION_SERVICE Context.LAYOUT_INFLATER_SERVICE
Les
Linkify, TextWatcher
Transformer
Controler
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
BDD distante
La
connexion d'un priphrique Android une BDD distante n'est pas prvue (ni souhaitable)
Pas de pont "JDBC" en quelque sorte
Il Il
SOAP REST
... JSP/Servlets,... PHP,JSP/Servlets, PHP,
Androrm
Requte
Rponse
BDD BDD
+ +
...
XML/SOAP, JSON...
192.56.7.45
Tests et dploiement
Outils
de mockups
Balsamiq (web demo) MobiOne Studio (free) OmniGraffle (Mac, $99) http://yeblon.com/androidmockup/ http://mokk.me ...
Test de l'UI
Le
Paquetage
Test de rsistance : "Si elle resiste au comportement anarchique d'un singe, elle resistera l'utilisateur" Gnre des vnements pseudos-alatoire, tels que des clics, des pressions de touches, des gestes, etc.
Le
TODO
Exporter et signer
Toute
Signature digitale avec un certificat dont la cl prive est conserve par le(s) dveloppeur(s) Signature avec debug.keystore 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 :
Procdure entirement automatise avec ADT
Analyse d'audience
Google Analytics
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