Android
Android
CM/TD/TP
valuation
[70%] [30%]
Ressources
pdagogiques
Olivier Le Goaer
M2 TI Anne 2012-2013
Prrequis 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)
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"
Redvelopper une application native pour chaque plateforme Ncessite des comptences et du temps ($$)
Quelle
Ekito.fr
C++, Java...
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
Commentaires
IDE online
WebApp mobile-friendly
Customisation
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
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 auxquelles il est habitu
Frameworks actuels
Sencha Sencha Touch Touch iUI iUI
... ...
Principes de base
Vous
Puis,
Au
Une apparence graphique trs "iOS-like" Des effets de transition entre les pages
tape 1 : importation
Des
tape 2 : structure
Exploitez
Soit stockes en local sur votre serveur Soit directement sur le serveur public haute disponibilit de jQuery.com
Importation
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>
Multipages
1 document = 1 page
1 document = n pages
HTML HTML Permet le prfetching des pages
HTML HTML
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)
Formatage
Lien
interdocument
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
Listes
Formulaires
Formulaires
Balise
Dialogues
Une
classique
Puis,
Pour
Tout
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
$('elem').live('eventName', callback);
Lis
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
Lis
pagebeforecreate, pagecreate
Et la "touche finale"
Immiter
Solution
Tester
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
Qunit : http://docs.jquery.com/Qunit
Dmo : Bankster
Bankster
Fonctionnalits
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
de + de 50 entreprises
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
Matriels Android
APN APN Tablette Tablette
Systme Systme Linux Linux + + Java Java Embarqu Embarqu Smartphone Smartphone Point de vue bidouilleur
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 ?
Architecture logicielle
Couches logicielles
APPLICATIONS
APPLICATION FRAMEWORK
Machine virtuelle
Bibliothques C/C++
LINUX KERNEL
Android
La
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
La
Outils du dveloppeur
Plugin
de la POO Java
Assistant la cration de projets Crateur d'interface graphique (WYSIWYG) Vues et perspectives ddies
Idiomes
Bibliothques
(API)
Apache Harmony
Android
SDK
Design
patterns
mulateur : aperu
Bouton 'HOME' Bouton 'MENU' Bouton 'BACK'
cran ''Tactile''
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
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/ du projet
Compilation et dploiement
Bytecode Dalvik (optimis)
.dex .dex
Entirement automatis avec le plugin ADT sous Eclipse !!
Environnement contraint
Pour
Sources Java
Bytecode Java
.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 applicatifs 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
tend
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
Multitches
Plusieurs
Une
Service
Sert
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
S'excute
android.app.Service
Unbounded
Mode
Bounded
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
Intents : principes
Trois
Principe
A
Filtre d'intentions de A
Filtre d'intentions de S
Filtre d'intentions de B
BroadcastReceiver
Dsignations
1. Explicite
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
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
Format
Filtres d'intention
Chaque
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
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)); } }
Mcanisme
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>
Applications et Tches
Ainsi,
Broadcast receiver
Ragit
Une
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
Content Provider
Un
content provider sert rendre une partie des donnes d'une application accessibles aux autres applications
Un
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'
Rsolution de contenu
Diffrentes
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();
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/
Principe de R.java
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
Objet
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; } }
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
ressources
UI : User Interface
Une API
Principe
Programmation
0..*
ViewGroup
+addView(View child)
ViewSimple
Fonctionnalit
de personnalisation
Hriter et redfinir un widget de base Combiner des widgets existants Dessin 100% personnalis - View::onDraw(Canvas canvas)
ViewGroup
ViewSimple (widget)
Rendu
OpenGL, Renderscript
Layouts : aperu
Proprits de placement
Orientation
Taille
Gravit
Alignement d'une vue dans son conteneur android:layout_gravity = left | center_horizontal | top | bottom | right | ...
Proprits de placement
Poids
Widgets : aperu
Espacement
(intra)
Espacement entre un contenu et les bords de sa vue android:padding? = top | left | right | bottom
Espacement
(inter)
Fragments
Nouveaut
L'tat de tous les widgets (munis d'un id) sont automatiquement sauvegard/restaur via un bundle
Lorsqu'une
Principe
de base
Fragmentation de l'espace d'affichage en diffrentes zones, chargeables indpendamment Mme ide que les "Frames" en HTML
Un
onSaveInstanceState() et onRestoreInstanceState()
android.app.Fragment
Les
onRetainNonConfigurationInstance() et getLastNonConfigurationInstance()
Activits ddies
Afin
Dialogues et Toasts
Dialogues
Toasts
Confirmation
Progession
Menus
Menu
Barres
Menu
principal
contextuel
Barre
d'action rapide
Barre
d'action
Thmes et styles
Un
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
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
Chaque
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")
Les adaptateurs
Les
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
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)
Gestion
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
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
spcifie un texte align gauche et un bouton 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.
MODEL MODEL
Cursor Cursor ou ou Collection Collection
VIEW VIEW
(Spinner, (Spinner, ListView...) ListView...)
...
AdapterView AdapterView
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
Prvoir Utilisation
/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
Images divises en neuf zones (dont certaines tirables) Outil Draw 9-patch du rpertoire /tool du SDK Android
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
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");
Srialisation d'objets
Chaque
de lecture/criture de fichiers
Sauvegarde
et chargement
Flux de sortie : FileOutputStream fos = openFileOutput("CAC40.dat", Context.MODE_PRIVATE) Flux d'entre : FileInputStream fis = openFileInput("CAC40.dat")
Bas
Srialisation
ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(myObject);
Cas
Dsrialisation
XML et JSON
XML
Lger et puissant Typage dynamique des colonnes Ne gre pas les contraintes d'intgrit rfrentielle
JSON
Types
de donnes
Implmentation
Les types Boolens, Dates, sont ''muls'' avec ces types primitifs
Bonnes pratiques
Crer
Interrogation de la base
Approche
un helper
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
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
des tuples (ou n-uplets) retourns par une requte est un curseur
Cursor res = db.query(...)
d'un tuple
On
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''
Supression
Mise
jour de tuples
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
Deux
exemples rcurrents :
1) Communications rseaux
Une NetworkOnMainThreadException est leve depuis Android 3.x
Ncessit
2) Manipulations SQLite
Et
Puis
Tche asynchrone
Classe Fournit
Thread enfant
Mme
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
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(){...});
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
Chaque
Multi-touch
Supporte
vnements gestuels
plusieurs pointeurs simultans
Doigt, stylet... Limite thorique : 256 event.getPointerCount() chaque pointeur actif est attribu un ID
Une
event.getActionMasked()
Diffrencie
Trois
a) Tap
gestes de base
b) Drag c) Pinch-Zoom
Golocalisation
Exploiter
vnements de position
Interface
Instance de android.location.LocationManager
Require
Instance de android.location.LocationProvider Exemple de constantes de la classe LocationManager : LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER, ... Chaque fournisseur offre diverses caractristiques
Chaque
Cartographie
La
Choisir
// Ne pas oublier !
Instance de com.google.android.maps.MapView
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
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
Divers
BluetoothDevice #2
BluetoothAdapter BluetoothDevice #3
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
Contrler
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
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
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
Le
Mise
Sous-rpertoire tests/ de votre projet android Code source de vos tests + manifeste
Exporter et signer
Toute
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 :
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