Sie sind auf Seite 1von 25

Organisation du module

Programmation des systmes mobiles & sans fil

CM/TD/TP

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

Evaluation

Contrle continue : 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

Pr-requis 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

Tlphonie mobile
2me

quatre catgories de rseaux sans fil

gnration : passage au numrique

1990 : GSM (Global System for Mobile Communication) Frquences 900 et 1800 MHz, dbit 9,6 Kb/s

GSM, GPRS, EDGE, UMTS (3G)

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 : l'offre actuelle

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

Application mobile (native)


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

existe des solutions pour du dveloppement natif cross-plateformes

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 browsing sur mobile

Dvelopper une WebApp [avec jQuery Mobile]

Le

browsing sur mobile est dj une ralit

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

pour terminal mobile

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

Deux

solutions sont envisageables

1) Handheld stylesheets

Voir ''Media Query'' du W3C

jQuery jQuery Mobile Mobile


jqTouch jqTouch

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

Dojo Dojo mobile mobile

... ...

Principes de bases
Vous

allez crer des documents

Conforme 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 obtiens automatiquement

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

jQuery Mobile en images...


Des

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

dans le document courant

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

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" <divdata-role data-role ="page" id=''foo''> id=''foo''> <div ="header"> <div data-role data-role ="header"> <h1>Page <h1>Page Title</h1> Title</h1> </div><!-</div><!-- /header /header --> --> <div ="content"> <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><!-</div><!-- /page /page --> --> </body> </body> </html> </html>

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)

Deux approches possibles


Mono-page

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"

Page Page HTML HTML

lien intra-document Page Page Page Page

Quelques composants
Barre

Formulaires
Balise

d'outils

classique

header, footer, navbar...

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

Formatage

Puis,

inclusion des lments de HTML 5 une mise en forme soigne

Layout, blocs rtractables & effet accordons...

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

Boutons

Pour

simples, icnes, inline, groupes...

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>

Listes

Simples, numrots, imbriques, sparateurs...

Formulaires

(voir diapo suivante)

Dialogues
Une

Catgories d'vnements
Lis

page peut tre stylise en tant que boite de dialogue modale


Accapare l'cran jusqu' quelle 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>

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

tap, taphold, swipe, swipeleft/swiperight

Lis

orientationchange

Lis

scrollstart, scrollstop

Lis

pagebeforeshow, pagebeforehide, pageshow, pagehide

Tout

se joue ensuite sur le lien vers la page

Lis

pagebeforecreate, pagecreate

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

Gestion des vnements


Mthodes

Et la "touche finale"
Immiter

live() ou bien bind() en vrac :

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

Pour fonctionner, doivent tre positionnes dans le document matre !

une icne de lancement native

Crer une favicon de 57x57 pixels, au format PNG


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

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')

sous iPhone et Android

Tester votre WebApp


Test

Dmo : Bankster
Bankster

en visuel, via un terminal mobile

: La banque des gangsters de l'application Bankster

Flashez pour accder la dmo

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

Plagie une WebApp mobile-friendly d'un organisme bancaire

Tester

en visuel, sans terminal mobile

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

de test pour jQuery

Qunit : http://docs.jquery.com/Qunit

Bref historique

Dvelopper une MobileApp [sous Android]

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

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

Open Handset Alliance (OHA)


Regroupement

Matriels Android
APN APN Tablette Tablette

de + de 50 entreprises

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

Embarqu Embarqu Smartphone Smartphone

Objectif

:
Netbook Netbook Tlvision Tlvision

Dvelopper des normes ouvertes pour les appareils de tlphonie mobile

Points forts d'Android


Point de vue constructeur Point de vue utilisateur

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 ? ?

Systme Systme Linux Linux + + Java Java

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

Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Key Lime Pie Kouign-Amann

Point de vue bidouilleur

Point de vue dveloppeur

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

Version Ice Cream Sandwich (ICS)

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 Elimination de processus sans avertissement ! Politique de priorit base sur une hierarchisation des processus

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

La

VM cr une instance Dalvik pour chaque processus (lourd)


Les applications sont totalement indpendantes ("sandbox")

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

Espaces protgs (mmoire, disque) Evite 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 projet Createur d'interface graphique (WYSIWYG) Vues et perspectives ddies

Idimes

Classes anonymes, classes internes, POJOs...

Bibliothques

(API)
Apache Harmony

Android

SDK

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

API Emulateurs Debugger, 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

Emulateur : aperu
Boutton 'HOME' Boutton 'MENU' Boutton 'BACK'

Ecran ''Tactile''

Theme (skin) par dfaut

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

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/ 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

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 transferts 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 applicatif 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

Etend

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(); /* Desallocation 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

Multi-tches
Plusieurs

activits sont empiles/dpiles


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

piles d'activits peuvent co-exister 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 : 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

service est une classe qui tend


S'xcute dans le

android.app.Service

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(); /* Desallocation des ressources ici */ } }

Dmarrage et arrt d'un service


Mode

Unbounded

Mode

Bounded

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

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

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

Intents : principes
Les

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)

trois 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 onReceive( onReceive(Intent Intent))

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

Intent Intent Bus

Natures des intents


Types

Intents : les extras


Il

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

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

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 direct */ i.putExtra("first", false); /* Donne additionelle */ if(je_connais_la_cible) { /* Designation explicite (implmentation) */ i.setClass(Home.this, NextActivity.class); } else { /* Designation 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
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

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


Importance

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


Quelles actions sont supportes ? Sur des URIs de quelle forme ? Quels types de donnes ? Dans quelles circonstances ?

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,

ses propres verbes d'action

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 application peut faire appels des "morceaux" d'autres applications


Rutilisation/partage de composants voulu par Android

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

Dclarer

des filtres en consquence

<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

Receiver : code source


package fr.univpau.bankster; import android.content.BroadcastReceiver; public class Sleep extends BroadcastReceiver {

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


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

Ne Un

ncessite pas une interface graphique


}

@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); }

broadcast receiver est une classe qui tend


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

android.content.BroadcastReceiver

Un

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

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.

Seul moyen pour un partage de donnes inter-applications

Un

content provider est une classe qui tend

android.content.ContentProvider

La

Expose

les donnes via une URI dont le scheme est 'content'


System-defined : content://contacts/people/125 User-defined : content://fr.univpau.bankster/account/28854165

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();

Content Resolver : exemples


Publier
content://call_log/calls
SpyApp

URI et type MIME


l'URI de votre provider

Content Providers Natifs


Settings

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

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

Plusieurs enregistrements

URI

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

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

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 */ } } }

Interface graphique utilisateur (GUI)

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

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

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

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

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

Exploiter les ressources


Utiliser

UI : User Interface
Une API

des ressources depuis le code

Java riche dclarative la XML


Mais peut se faire de faon 100% programmatique

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);

Des layouts et des widgets (appels Vues )

Programmation

Spare la vue du code mtier

Rfrencer

des ressources depuis d'autres

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"

<EditText android:textColor="@color/rose_bonbon"/> <EditText android:textColor="@android:color/darker_gray"/>

Rendu

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

OpenGL, Renderscript

Les Vues Android


View

Layouts : aperu

Principe

du design pattern Composite

0..*
+onDraw(Canvas canvas)

ViewGroup
+addView(View child)

ViewSimple

ViewGroup

(layout)

ViewSimple

(widget)

LinearLayout TableLayout RelativeLayout FrameLayout ScrollView

Button EditText TextView Spinner CheckBox

Proprits de placement
Orientation

Proprits de placement
Poids

Sens de placement des vues dans un conteneur android:orientation = vertical | horizontal

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

Taille

Espacement

(intra)

Surface prise par la vue android:layout_width/android:layout_height = ??px | fill_parent | wrap_content

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

Gravit

Espacement

(inter)

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

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

depuis Android 3.0

Toasts

Prvus pour les crans plus large, comme les tablettes

Confirmation

Principe

de base

Message compact et rapide l'intention de l'utilisateur

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

Un

fragment est une classe qui tend

Progession

android.app.Fragment

Les

fragments sont ensuite insrs dans une activit hte (FragmentActivity)

Menus
Menu

Barres
Menu

principal

contextuel

Barre

d'action rapide

Barre

d'action

Instanciation des vues


Il

Gestion des vnements


Principe

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

des couteurs de Java SE

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

du KeyPad (tap, trackball)

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

Rcuprer

tout une vue depuis le code

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

du TouchScreen (pression, gesture)

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, ...) ...)

BaseAdapter BaseAdapter adapted-by

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

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

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

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

Apparences des items


L'apparence

Notifications
Diffrentes

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

formes de notifications :

LED Son Vibreur Barre de notification (icne)

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

facilite par le notification manager

Vous

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

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

Application Multi-crans
Prvoir

Images redimensionnables
Utiliser

diffrentes variantes d'une mme image

les images 9 patchs

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

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

Draw9patch.exe produit des fichiers *.9.png

Prvoir

les 2 orientations possibles (portrait ou landscape)


/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)

Application Multi-langues
Prvoir

diffrentes variantes d'une mme chane


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

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

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

Gestion de fichiers plats


Mcanisme

simple et lger

de lecture/criture de fichiers

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

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

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

uniquement aux fichiers de l'application courante


Sparateurs de chemins interdits

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

Serialisation d'objets
Chaque

XML et JSON
XML

classe implmente l'interface Serializable (+champs serialVersionUID)


Idem que pour java SE Format de stockage binaire

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


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

Bas

sur la gestion de fichiers ci-avant

Note SAX plus performant que DOM !

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

JSON

Parsing de ressources au format JSON Voir API org.json

D-srialisation

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

Base de donne relationelle


Android

Bonnes pratiques
Crer

embarque le SGBDR SQLite

son propre helper

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

NONE, INTEGER, REAL, TEXT, BLOB

L'instance

Implmentation

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


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

Support du standard SQL-92

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

Support partiel des dclencheurs (triggers)

Interrogation de la base
Approche

Rsultats
L'ensemble

par SQL brut

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"})

des t-uples retourns par une requte est un curseur Fermeture


Cursor res = db.query(...)
d'un curseur : manuellement ou en mode ''manag''

On

peut parcourir cet ensemble

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)

Ajout, suppression, m-a-j


Reprsentation

Thread principal
Tous

d'un t-uple

Un t-uple est une instance de android.content.ContentValues t paires nom-de-champs/valeur-de-champ

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) :-(

Ajout

de t-uples de t-uples

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

Supression

Ncessit

de les dplacer en arrire-plan :

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

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

Mise

jour de t-uples

Puis

les synchroniser avec l'interface graphique

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

Car le UIThread est le seul habilit modifier les vues !

Tche asynchrone
Classe

Thread enfant
Mme

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

fonctionnement que JAVA SE

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

synchroniser un thread enfant avec l'UI


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

Directement depuis une activit Dans les autres cas


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(){...});

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

Les capteurs

Capteurs & pointage tactile

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() d'une activit

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


Acclromtre, gravit, gyroscope...

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

Vecteur de flottants dont la taille dpends du capteur

Chaque

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

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

est frquent de rcuprer des Managers partir de services systmes pr-configurs


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'alarme

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 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 (gnrateur d'intent)


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

partager des donnes travers tous les composants d'une application


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

Controler

la saisie d'un texte (EditText)

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

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

Se dclare au niveau du nud <application> du manifeste

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

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 adapte Android (car lgre)


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

des activits, services, et providers android.test

test du singe sur votre IHM

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

programme s'xcute dans votre mulateur

Se lance en ligne de commande


adb shell monkey [options] <event-count>

TODO

Vous suivez les vnements gnrs dans le logcat


: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


Utiliser Google Play (anciennement Android Market)

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

Obtenir une cl prive


Utilitaire keytool.exe du JDK

Auto-publier 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

Utiliser un magasin tiers


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

Das könnte Ihnen auch gefallen