Você está na página 1de 27

Organisation du module

Programmation des
systmes mobiles &
sans fil

CM/TD/TP

Cours magistraux : 5 heures

Travaux pratiques : 37,5 heures

valuation

Contrle continu : 1 sance (1h30)

[70%]

Note de TP : projet MobileApp (~6h)

[30%]

Ressources

Olivier Le Goaer

pdagogiques

Tout au format lectronique (PDF) sur WebCampus

M2 TI Anne 2012-2013

Prrequis du module
Langages

HTML, CSS, JavaScript, Java SE, PHP

Formats

de dveloppement

d'change

XML, JSON

Outils

de dveloppement

IDE Eclipse

phpMyAdmin

Base

Plan du module
Avant-propos

Comprendre les tendances et les enjeux du dveloppement


d'applications pour terminaux mobiles

Dvelopper

Dvelopper

de donnes

une WebApp

Apprendre dvelopper une application Web compatible


mobile l'aide du framework jQuery Mobile

une MobileApp

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

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

crans

QVGA, WVGA...

Mono/multi-touch

Capteurs

Une

offre de formation qui s'adapte

GPS, boussoles,
acclromtres...

Connectivit

Les coles et universits intgrent peu peu la


programmation mobile dans leurs plaquettes de formation

GSM (voix + donnes),


WiFi, Bluetooth, NFC

L'universit de Pau a lanc ce module ds 2008, en ciblant


alors J2ME (Java 2 Micro Edition)

Rseaux sans fil


Les

Tlphonie mobile

quatre catgories de rseaux sans fil

GSM,
GPRS,
EDGE,
UMTS (3G)

2e

1990 : GSM (Global System for Mobile Communication)

Frquences 900 et 1800 MHz, dbit 9,6 kb/s

2,5

2001 : GPRS (General Packet Radio Service)

Dbit 250 kb/s mais la voix continue de transiter sur le


rseau GSM

3e
Rseaux locaux
sans fil (WLAN)

Rseaux mtropolitains
sans fil (WMAN)

gnration

Zone de couverture
Rseaux personnels
sans fil (WPAN)

gnration : passage au numrique

gnration

2004 : UMTS (Universal Mobile Telecommunications


System)

Frquences 1900-2200 MHz, dbit 2 mb/s

Rseaux tendus
sans fil (WWAN)

OS Mobile : l'offre actuelle

OS mobile : dveloppements
Plateforme

Programmation

IDE conseill

Windows Phone

VB.Net, C#

Visual studio .Net

iOS

Objective-C

X-CODE

Blackberry OS

Java

MDS Studio

Java ME

Java

EclipseME (CLDC, MIDP)

Android

Java, code natif C++

Eclipse + ADT

Palm WebOS

JavaScript, C/C++

Eclipse + webOS plug-in

Symbian OS

C++

Performance

Brew MP

C++

Visual Studio + plug-in

Bada

C++

badaIDE

MeeGo

Qt C++

QtCreator

Firefox OS (B2G)

HTML5/CSS3/JavaScript

Xemacs ? ;-)

Modles de dveloppement
MobileApp

versus WebApp
Application mobile (native)

Application web

Portabilit

Dveloppement spcifique chaque plateforme

Navigateur Web

Dveloppement
/cot

Ncessite un SDK + connaissance dun langage


spcifique

Langage du Web (HTML / JS / CSS /


PHP...)

Mises jour

Soumission un magasin dapplications et


ventuelle validation + retlchargement par le
client

Mise jour rapide en mettant jour


tout simplement les fichiers sur le
serveur Web

Disponibilit

Mode online et offline

Ncessite obligatoirement une


connexion internet

Fonctionnalits

Utilise toutes les fonctionnalits du mobile (GPS,


voix, notifications, contacts...)

Limites aux possibilits du navigateur

HybridApp

Arbre de dcision

: le modle hybride

Encapsulation d'une WebApp dans une MobileApp

Ce modle de dveloppement reste un compromis...

Ekito.fr

Le dfi du cross-plateforme
Un

slogan : "Write once, run everywhere"

Les WebApp et les HybridApp sont un faux problme

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

Les MobApp sont au cur du problme

Redvelopper une application native pour chaque plateforme

Ncessite des comptences et des talents ($$)

Quelle

"lingua franca" pour dvelopper ?

Les langages du web

JavaScript, HTML, CSS...

Les langages mainstream

Les langages ddis (DSL)

Solutions cross-platform *
Nom

Programmation

Technique

Commentaires

Titanium Mobile

JavaScript

Interprtation

Composant pr-install

PhoneGap

HML,CSS,JavaScript

Interprtation

Socle web pr-install

NeoMAD

Java

Transcompilation

API android-like

Codename One

Java

Transcompilation

API gnrique

MoSync

HTML5,JavaScript,
C/C++

Transcompilation

Canappi

DSL

Transcompilation

Applause

DSL

Transcompilation

IBM Worklight

HTML5, CSS3,
JavaScript

Interprtation

- Bas sur PhoneGap


- Middleware fournit

...

...

...

...

C++, Java...
* Diapositive exprimentale Merci de votre comprhension

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

WebApp mobile-friendly
Customisation

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

Frameworks actuels
Sencha
Sencha
Touch
Touch
iUI
iUI

jQuery
jQuery
Mobile
Mobile

Voir
''Media Query''
du W3C

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 auxquelles il est habitu

Dojo
Dojo
mobile
mobile

...
...

Principes de base
Vous

allez crer des documents

Conformes au doctype HTML 5

Puis,

jQuery Mobile modifie le DOM des


documents au chargement

En ajoutant des lments et des attributs de style

En exploitant de faon transparente la technologie Ajax

Au

final on obtient automatiquement

Une apparence graphique trs "iOS-like"

Des effets de transition entre les pages

jQuery Mobile en images...

tape 1 : importation
Des

bibliothques sont requises

Soit stockes en local sur votre serveur

Soit directement sur le serveur public haute disponibilit


de jQuery.com

Importation

dans le document courant

Une feuille de style spcifique mobile (.css)

La bibliothque JavaScript jQuery (.js)

La bibliothque JavaScript jQuery Mobile (.js)

Versions
compactes

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

tape 2 : structure

Template d'un document

l'attribut data-* dans votre


document, o * est la fonctionnalit dsire

Exploitez

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)

<!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
<divdata-role="page"
data-role="page" id=''foo''>
id=''foo''>
<div
<div data-role="header">
data-role="header">
<h1>Page
<h1>Page Title</h1>
Title</h1>
</div><!-</div><!-- /header
/header -->
-->
<div
<div data-role="content">
data-role="content">
<p>Page
<p>Page content
content goes
goes here.</p>
here.</p>
</div><!-</div><!-- /content
/content -->
-->
<div
<div data-role="footer">
data-role="footer">
<h4>Page
<h4>Page Footer</h4>
Footer</h4>
</div><!-</div><!-- /footer
/footer -->
-->
</div><!-/page
</div><!-- /page -->
-->
</body>
</body>
</html>
</html>

Deux approches possibles


Monopage

Multipages

1 document = 1 page

Lien

1 document = n pages
HTML
HTML

HTML
HTML

Modle de navigation

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)

Permet le
prfetching
des pages

Lien
Page
Page

Page
Page

lien interdocument

Page
Page

lien intradocument

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"

HTML
HTML

Page
Page

intradocument

Page
Page

Quelques composants
Barre

d'outils

header, footer, navbar...

Formatage

Layout, blocs rtractables & effet accordon...

simples, icnes, inline, groupes...

Simples, numrots, imbriques, sparateurs...

Formulaires

(voir diapo suivante)

classique

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

inclusion des lments de HTML 5

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

Pour

Listes

Balise
Puis,

Boutons

Formulaires

une mise en forme soigne

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>

Dialogues

Catgories d'vnements

Une

page peut tre stylise en tant que boite


de dialogue modale

Accapare l'cran jusqu' ce qu'elle soit ferme

Utile pour : confirmation, message informatif, etc.

se joue ensuite sur le lien vers la page

l'affichage des pages

pagebeforeshow, pagebeforehide, pageshow, pagehide

Lis

au dfilement de l'cran

scrollstart, scrollstop

Lis

au changement d'orientation de l'cran

orientationchange

Lis

au pointage/touch

tap, taphold, swipe, swipeleft/swiperight

Lis

<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
<div data-role="content">
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>

Tout

Lis

l'initialisation des pages

pagebeforecreate, pagecreate

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

Gestion des vnements


Mthodes

live() ou bien bind()

Pour fonctionner,
doivent tre
positionnes
dans le
document matre !

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

Exemples

en vrac :

Et la "touche finale"
Immiter

une icne de lancement native

Crer une favicon de 57x57 pixels, au format PNG

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

Solution

sous iPhone et sous Android

//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('pageshow',function(event,
$('div').live('pageshow',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('pagecreate',function(event){
$('#aboutPage').live('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')

Tester votre WebApp


Test

en visuel, via un terminal mobile

Consulter le niveau de support (le grade) du navigateur


http://jquerymobile.com/gbs/

Tester

en visuel, sans terminal mobile

jQuery Mobile fonctionne sur un navigateur standard !

Ripple Emulator (Extension pour Chrome)


http://ripple.tinyhippos.com/

Opera Mobile Emulator


http://www.opera.com/developer/tools/mobile/

Framework

de test pour jQuery

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

Dmo : Bankster
Bankster

: La banque des gangsters

Plagie une WebApp mobile-friendly d'un organisme bancaire

Fonctionnalits

de l'application Bankster

Partie publique

Flashez pour accder


la dmo

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

Dvelopper une
MobileApp [sous
Android]

2003

2007

Naissance
Naissance de
de la
la startup
startup
Android
Android inc.
inc.

Annonce
Annonce d'Android
d'Android +SDK
+SDK
Open
Open Handset
Handset Alliance
Alliance

2005

2008

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

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

Open Handset Alliance (OHA)


Regroupement

Fabricants de matriels

Oprateurs mobile

Dveloppeurs d'applications

...

http://goo.gl/LejV9

Matriels Android

de + de 50 entreprises

Voir annonce
par Sergey Brin
sur YouTube :

APN
APN
Tablette
Tablette

Embarqu
Embarqu
Smartphone
Smartphone

Objectif

Dvelopper des normes ouvertes pour les appareils de


tlphonie mobile

Netbook
Netbook
Tlvision
Tlvision

Points forts d'Android


Point de vue constructeur

Systme
Systme Linux
Linux
++
Java
Java

Versions d'Android

Point de vue utilisateur

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

November 1, 2012 Google Inc

Point de vue bidouilleur

Point de vue dveloppeur

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

CodeName

Platform

API Level

Cupcake

Android 1.5

Donut

Android 1.6

Eclair

Android 2.1

Froyo

Android 2.2

Gingerbread

Android 2.3

Honeycomb

Android 3.0

11

Ice Cream Sandwich

Android 4.0

14

Jelly Bean

Android 4.1

16

Key Lime Pie


Kouign-Amann

Android en images...

Architecture logicielle

Version Ice Cream Sandwich (ICS)

Machine virtuelle "Dalvik"


Offre

l'avantage de toute machine virtuelle

Processus
Processus actif
actif

Couche d'abstraction entre le dveloppeur d'applications et


des implmentations matrielles particulires

La

Processus
Processus visible
visible

VM Dalvik n'est pas une VM Java

Tient compte des contraintes de CPU et mmoire

Excute des fichiers .dex (Dalvik Executable) optimiss

La

VM cr une instance Dalvik pour chaque


processus (lourd)

Pour garantir une haute


ractivit

limination de processus
sans avertissement !

Politique de priorit base


sur une hirarchisation
des processus

Les applications sont totalement indpendantes ("sandbox")

Espaces protgs (mmoire, disque)

vite un plantage gnralis !

Concepts

Processus
Processus vide
vide

Outils du dveloppeur

de la POO Java

Plugin

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

Idiomes

gre ses
ressources de
manire agressive

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

Le petit univers Java

Android

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

Priorit

Priorits des processus

Classes anonymes, classes internes, POJO...

Bibliothques

Eclipse ADT (Android Development Tools)

Assistant la cration de projets

Crateur d'interface graphique (WYSIWYG)

Vues et perspectives ddies

Android

(API)
Apache
Harmony

API

SDK

J2SE (subset) : java.io.*, java.lang.*...

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

mulateurs

Google : com.google.android.maps.*...

Dbogeur, compilateur, empaqueteur, signature

Exemples (dmos)

...

Design

patterns

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

Plugin ADT Eclipse


Perspectives

mulateur : aperu
Bouton
'HOME'

Numro du
terminal

Vues

Bouton
'MENU'

Bouton
'BACK'

cran
''Tactile''

Thme (skin)
par dfaut

mulateur : limitations
Lent

Arborescence systme
Alternative :
AndroVM
sur
VirtualBox

au dmarrage et l'usage

Emulation (i.e. couche d'indirection) versus simulation

Applications
utilisateur (.apk)
(AngryBirds, Mto...)

Noyau Linux + services + composants android

Fonctionnalits

Donnes des
applications
(database SQLite,
SharedPreferences...)

non-disponibles

Appareil photo (CameraWebcam support)

Vibreur

Appels tlphoniques rels

Capteurs en gnral

Connexions USB

volution de la charge de la batterie

Applications
systme (.apk)
(Horloge, Browser,
Calculatrice...)

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

Arborescence projet

Dossier du
projet

Le plugin ADT
gre et facilite
cette structuration

Externaliser les ressources


Android

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

Crer

des ressources

Simples valeurs, chanes de


caractres, couleurs, menu, layout,
styles, images, etc.

Stockes dans les sousrpertoires de /res/ du projet

Ressources organises
(icnes, layout,
textes...)
Fichier Manifest

Facilit de maintenance, de mise


jour et de gestion

un seul niveau de profondeur est autoris !

Compilation et dploiement

Sources Java

Bytecode Java

.java
.java

Entirement
automatis
avec le
plugin ADT
sous Eclipse !!

Bytecode Dalvik
(optimis)
.dex
.dex

.class
.class

.apk
.apk

Ressources + Manifest

Application
empaquete

/data/app

.png
.png
.xml
.xml

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 transfert plus lents avec une latence leve

Des connexions rseau moins fiables

Des batteries autonomie limite

Types d'applications Android

Construction d'une
application Android

Application
Application
d'arrire
d'arrire plan
plan

Application
Application
de
de premier
premier plan
plan

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

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

Widget
Widget

(ex:
(ex: mto
mto du
du jour)
jour)

Intermittente
Intermittente

(ex:
(ex: lecteur
lecteur de
de mdia)
mdia)

Les diffrents composants

Le manifeste
Chaque

Activities

Services

Intents

crans
crans de
de prsentation
prsentation

Tches
Tches d'arrire-plan
d'arrire-plan

Activations
Activations && messages
messages
inter/intra-applications
inter/intra-applications

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

Manifeste

Mtadonnes,
Mtadonnes,
composants,
composants, prrequis
prrequis

Dclare le niveau minimum de compatibilit du SDK pour


que l'application fonctionne

...

Content Providers

Broadcast Receivers

Sources
Sources de
de donnes
donnes
partageables
partageables

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

AndroidManifest.xml

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

<?xml version="1.0" encoding="utf-8"?>


<manifest package="fr.univpau.bankster">
Permissions requises

<uses-permission />
<uses-sdk />
<supports-screens />

Nud de l'application

<application>

Nud d'un service de l'application

contexte modlise les informations globales


sur l'environnement de l'application

Possde

<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
</activity>

Nud d'une activit de l'application

Le

<service>
<intent-filter> . . . </intent-filter>
</service>

Nud d'un broadcast receiver de l'application

<receiver>
<intent-filter> . . . </intent-filter>
</receiver>

Nud d'un content provider de l'application

<provider>
<grant-uri-permission />
</provider>

getRessources, getPackageName, getSystemService...

startActivity, startService, sendBroadcast, getContentResolver...

openFileInput, openOrCreateDatabase, getSharedPreferences...

Accs

au contexte

Depuis une Activity ou un Service : this (car hritage)

Depuis un BroadcastReceiver : en argument de onReceive()

Depuis un ContentProvider : this.getContext()

</application>
</manifest>

Activit
Une

les mthodes importantes

Cycle de vie d'une activit

activit un cran graphique

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

mthodes de callback

void onCreate(...)

void onStart()

void onRestart()

void onResume()

void onPause()

3) Fiche d'un contact

void onStop()

4) Ajout d'un contact

void onDestroy()

Une

application est forme de n activits

Exemple

: application de tlphonie

1) Numroteur
2) Annuaire des contacts

tend

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

Activit : code source


package fr.univpau.bankster;
import android.app.Activity;
public class Home extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Allocation des ressources ici */
}
@Override
protected void onDestroy() {
super.onDestroy();
/* Dsallocation des ressources ici */
}
}

Lancer une activit


Le bundle sert
mmoriser l'tat
de l'UI de
l'activit lorsqu'elle
passe en
arrire plan

Pour

pouvoir tre lance, toute activit doit tre


pralablement dclare dans le manifeste

Une

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

activits sont
empiles/dpiles

Empile quand une activit


dmarre

Dpile (i.e. dtruite) quand


on presse le bouton 'BACK'

Multitches
Plusieurs

piles d'activits peuvent coexister


avec Android

L'utilisateur passe de l'une l'autre

Une

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

Elle passe simplement en


arrire plan

Reprend l'activit
situe au
sommet de
la pile

Service
Sert

effectuer des oprations ou des calculs


en dehors de linteraction utilisateur

Ne ncessite pas une interface graphique

Deux

Local : service qui sexcute dans le mme processus que


votre application
Distant (IPC) : service qui sexcute dans des processus
indpendants de votre application (cf. description AIDL)

Un

types de services :

Cycle de vie d'un service


5

mthodes de callback

onCreate()

onStart()

onStartCommand()

onDestroy()

onBind()

onUnbind()

SDK<2.0

service est une classe qui tend

android.app.Service

S'excute

dans le
processus courant

Dmarrage et arrt d'un


service

Service : code source


package fr.univpau.bankster;
import android.app.Service;

Mode

public class AccountCleaner extends Service {


@Override
public void onCreate() {
/* Allocation des ressources ici */
}
@Override
void onStartCommand(Intent intent,
int flags, int startId) {
/* Votre code du service ici */
}
@Override
protected void onDestroy() {
super.onDestroy();
/* Dsallocation des ressources ici */
}
}

Unbounded

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

Mode

Oprations

startService(...)

stopService(...)

Bounded

Des composants (appels


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

Oprations

Un mme service
peut supporter
les 2 modes
simultanment

bindService(...)

unbindService(...)

+ toutes les mthodes de


l'interface dfinie

Intents : principes

Intents : vue d'ensemble

Les

trois types de composants applicatifs sont


activs via des intentions (Intents)

onActivityResult(Intent)
onActivityResult(Intent)

Activity, Service et BroadcastReceveir

Principe

d'un bus messages asynchrones

Filtre
d'intentions
de A

startActivity(Intent)
startActivityForResult(Intent)
finishActivity(int)

Main Activity

Intent
Intent getIntent()
getIntent()

setResult(Intent)

sendBroadcast(Intent)
sendOrderedBroadcast(Intent)
sendStickyBroadcast(Intent)
startService(Intent)
stopService(Intent)
bindService(Intent)

Filtre
d'intentions
de S

Activity

Filtre
d'intentions
de B

Service

BroadcastReceiver

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

onReceive(Intent)
onReceive(Intent)

Intent
Intent
Bus

Natures des intents


Types

Modes

1. Direct

de dsignation

Intents : les extras


Il

est possible d'utiliser l'intent pour convoyer


des donnes supplmentaires

1. Explicite

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

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)

Le composant cible est nomm

Activer tel composant

2. Implicite

2. Par procuration

Le composant cible n'est pas


nomm

Stockage

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

Une une, ou regroupes dans un bundle


(android.os.Bundle)

sur le principe d'une table de hash

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

Actions et URI courantes


Action

package fr.univpau.bankster;

URI

Signification

ACTION_EDIT

content://contacts/people/125

diter la fiche du contact 125

import android.app.Activity;
import android.content.Intent;

ACTION_VIEW

geo:49.5000,123.5000

Ouvrir lapplication de golocalisation


la position donne (latitude, longitude).

public class Home extends Activity {

ACTION_CALL

tel:0156601234

Appeller le numro

ACTION_VIEW

google.streetview: cbll=49.5000,123.5000

Ouvrir google street view la localisation donne

...

...

...

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

Actions

natives android

Constantes de la classe android.content.Intent

Format

d'une URI

scheme://host:port/path

schemes usuels : http, mailto, tel, mms, geo, file...

}
}

Filtres d'intention
Chaque

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 ?

au bus de savoir si le message


d'activation (i.e. l'intent) doit tre dlivr au
composant ou non

Rsolution des intentions


Importance

du mode de dsignation

Explicite : le composant cible est excut

Implicite : 0, 1 ou plusieurs composants sont cibls, mais un


seul sera excut (choix de l'utilisateur si besoin)
A1

Permettra

A2

A3

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

tel:112

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

de filtres implique une dsignation


explicite du composant

<activity android:name="A3">
</activity>

L'absence

Bus

Actions personnalises
Dfinir

ses propres verbes d'action

package fr.univpau.bankster;

Applications et Tches
Ainsi,

une application peut faire appel des


"morceaux" d'autres applications

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

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>

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

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

Broadcast receiver
Ragit

aux annonces diffuses l'aide


sendBroadcast(...)

Receiver : code source


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

System-defined : la batterie est faible, un SMS vient


d'arriver, etc.

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

User-defined : solde bancaire ngatif, etc.

Ne

ncessite pas une interface graphique

Un

broadcast receiver est une classe qui tend

android.content.BroadcastReceiver

Un

receiver s'abonne/dsabonne via le fichier


manifest ou programmatiquement

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

Content Provider

Rsolution de contenu

Un

content provider sert rendre une partie


des donnes d'une application accessibles aux
autres applications

Seul moyen pour un partage de donnes interapplications

Un

content provider est une classe qui tend

Diffrentes

Fichier binaire (srialisation d'objets)

Fichier XML/JSON

Base de donnes embarque ou distante

Etc.

La

android.content.ContentProvider

Expose

les donnes via une URI dont le


schme 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 offerte par


un content provider

Elle s'obtient via un contentResolver

ContentResolver cr = getContentResolver();

Content Resolver : exemples

URI et type MIME


Publier

content://call_log/calls
SpyApp

techniques de persistance

l'URI de votre provider

Content Providers Natifs

Elle sera utilise pour y accder via le ContentResolver

Settings

public static final URI CONTENT_URI =


Uri.parse("content://fr.univpau.bankster/account");

++ delete()
delete()
++ insert()
insert()
++ notifyChange()
notifyChange()
++ query()
query()
++ update()
update()

Content
Resolver

CallLog

MediaStore.Images

MediaStore.Audios

Deux

cas de figure :

1) Un seul enregistrement

URI

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

: content://fr.univpau.bankster/account/[id]

2) Plusieurs enregistrements

URI

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

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

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

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

d'accs aux ressources via R.java

user-defined : fr.univpau.foo.R.color.rose_bonbon

system-defined : android.R.color.darker_gray

Objet

java reprsentant les ressources

Instance de la classe android.content.res.Resources

Ressources du projet en cours : context.getResources()

public final class R {


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

Exploiter les ressources


Utiliser

des ressources depuis le code

obj.setColor(R.color.rose_bonbon);

obj.setColor(android.R.color.darker_gray);

des ressources depuis d'autres

ressources

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

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

du
design pattern
Composite

0..*
+onDraw(Canvas canvas)

ViewGroup

ViewSimple

+addView(View child)

ViewGroup

(layout)

ViewSimple

LinearLayout

Button

TableLayout

EditText

RelativeLayout

TextView

FrameLayout

Spinner

ScrollView

CheckBox

Spare la vue du code mtier

(widget)

Mais peut se
faire de faon
100%
programmatique

de personnalisation

Hriter et redfinir un widget de base

Combiner des widgets existants

Dessin 100% personnalis - View::onDraw(Canvas canvas)

Rendu

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

OpenGL, Renderscript

Layouts : aperu
View

Principe

dclarative la XML

Les Vues Android

Des layouts et des widgets (appels Vues )

Fonctionnalit

attribute="@[packageName]:resourcetype/resourseIdent"

Java riche

Programmation

Rfrencer

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)

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

Proprits de placement
Orientation

Proprits de placement
Poids

Sens de placement des vues dans un conteneur

Taux d'espace libre affects chaque widgets

android:orientation = vertical | horizontal

android:layout_weight = ? (0 par dfaut)

Taille

Espacement

(intra)

Surface prise par la vue

Espacement entre un contenu et les bords de sa vue

android:layout_width/android:layout_height = ??px | fill_parent |


wrap_content

android:padding? = top | left | right | bottom

Gravit

Alignement d'une vue dans son conteneur

android:layout_gravity = left | center_horizontal | top | bottom |


right | ...

Espacement

(inter)

Espacement entre les vues

android:layout_margin? = ??px

Widgets : aperu

Activits ddies
Afin

de simplifier les choses, il existe des


classes prdfinies tendre directement

ListActivity : si votre activit prsente une liste d'items

ExpandableListActivity : si votre activit prsente une liste


d'items extensible

TabActivity : si votre activit prsente des onglets

WebViewClient : si votre activit prsente un rendu de pages


web

PreferenceActivity : si votre activit prsente un panneau de


prfrences

Fragments
Nouveaut

depuis Android 3.0

Prvus pour les crans plus larges, comme les tablettes

Principe

Fragmentation de l'espace d'affichage en diffrentes zones,


chargeables indpendamment

Mme ide que les "Frames" en HTML

fragment est une classe qui tend

android.app.Fragment

Les

Dialogues

Confirmation

Progession

de base

Un

Dialogues et Toasts

fragments sont ensuite insrs dans une


activit hte (FragmentActivity)

Toasts

Message compact et
rapide l'intention de
l'utilisateur

Menus
Menu

principal

Barres
Menu

contextuel

Barre

d'action rapide

Thmes et styles
Un

Ensemble de styles appliquer une activit

Thmes par dfaut : Theme.Holo.Dark, ...

Un

style est une ressource Android

User-defined : R.style.Joli, R.style.Joli2, ...

Hritage de style possible (parent="@style/Joli")

est ncessaire d'instancier les vues (i.e.


obtenir des objets) pour pouvoir les manipuler
Grce aux identifiants affects chaque vue

Button myButton = (Button) findViewById(R.id.my_button);

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

vue est stylisable

Un seul style applicable la fois (android:style="@style/Joli")

Gestion des vnements

onClick(View), onLongClick(View)

adaptateurs sont des classes qui lient des


donnes aux vues de l'UI

Bizarrerie :
un seul
listener
par widget :-/

Hritent de android.widget.BaseAdapter

SimpleAdapter, ArrayAdapter<?> : sert rcuprer des


donnes stockes dans une collection

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)

onKeyUp(KeyEvent), onKeyDown(KeyEvent)

du TouchScreen (pression, gesture)

onTouchEvent(MotionEvent)

d'adaptateurs

OnTouchListener

Les vues concernes tendent android.widget.AdapterView

Classes

OnKeyListener

Gestion

du KeyPad (tap, trackball)

OnClickListener, OnLongClickListener

Les adaptateurs
Les

Fournir une implmentation respectant un contrat (interface)


afin de ragir des types d'vnements particuliers

Gestion

des couteurs de Java SE

toute une vue depuis le code

Proprits : taille, padding, background, textColor, ...

Principe

les widgets depuis le code

Rcuprer

Il

Rcuprer

System-defined : android.R.style.Widget_Button, ...

Chaque

d'action

Instanciation des vues

thme correspond une "feuille de styles"

Barre

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

Model-View-Presenter (MVP)

Apparences des items


L'apparence

des items sont dfinies par dfaut


par des layouts systme

PRESENTER
PRESENTER
Notify data changed

BaseAdapter
BaseAdapter

(CursorAdapter,
(CursorAdapter,
ArrayAdapter,
ArrayAdapter, ...)
...)

android.R.layout.simple_spinner_item

adapted-by
query data

refresh

android.R.layout.simple_list_item_1

MODEL
MODEL
Cursor
Cursor ou
ou
Collection
Collection

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

VIEW
VIEW
AdapterView
AdapterView

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

spcifie un texte align gauche et un bouton radio droite, ainsi qu'un


texte noir sur fond blanc.

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

...

Vous

pouvez videmment dfinir vos propres


layouts pour crer des items plus complexes

fr.univpau.bankster.R.layout.mon_bel_item

Notifications
Diffrentes

formes de notifications :

Application Multicran
Prvoir

diffrentes variantes d'une mme image

LED

/res/drawable-hdip/icon.png

Son

/res/drawable-mdip/icon.png

Vibreur

/res/drawable-ldip/icon.png

Barre de notification (icne)

Prvoir
Utilisation

facilite par le notification manager

NotificationManager nm = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);

nm.notify(NUMBER, new Notification(...))

les deux orientations possibles (portrait


ou landscape)

/res/layout-port/main.xml

/res/layout-land/main.xml

Images redimensionnables
Utiliser

les images 9 patchs

Application Multi-langues
Prvoir

diffrentes variantes d'une mme chane

Images divises en neuf zones (dont certaines tirables)

/res/values-fr/strings.xml

Outil Draw 9-patch du rpertoire /tool du SDK Android

/res/values-en/strings.xml

/res/values-it/strings.xml

Draw9patch.exe produit des fichiers *.9.png

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

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

Le

choix sera fait automatiquement en fonction


de la configuration du terminal (ex: LOCALE=FR_fr)

S'applique

galement aux images car elles


peuvent afficher du texte !

/res/drawable-fr/splashscreen.png

/res/drawable-en/splashscreen.png

Shared Preferences

Persistance et
threading

Mcanisme

simple et lger

Sauvegarde de paires cl/valeur simple

SharedPreferences pref = getPreferences(Activity.MODE_PRIVATE)

Sauvegarder

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

de lecture/criture de fichiers

Exploite l'espace de stockage interne ou externe

API habituelle java.IO

Sauvegarde

et chargement

Flux de sortie : FileOutputStream fos =


openFileOutput("CAC40.dat", Context.MODE_PRIVATE)

Srialisation d'objets
Chaque

classe implmente l'interface


Serializable (+champs serialVersionUID)

Idem que pour java SE

Format de stockage binaire

Bas

Flux d'entre : FileInputStream fis = openFileInput("CAC40.dat")

Cas

d'un fichier statique (lecture uniquement)

Dposez-le dans le rpertoire res/raw/ de votre projet

Accs avec openRawResource(R.raw.cac40)

sur la gestion de fichiers ci-avant

Srialisation

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(myObject);

Dsrialisation

ObjectInputStream ois = new ObjectInputStream(fis);

myObject = (myClass) ois.readObject();

XML et JSON

Base de donnes embarque

XML

des prfrences

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

Gestion de fichiers plats


Mcanisme

des prfrences

Android

embarque le SGBD-R SQLite

Parsing de ressources au format XML

Lger et puissant

Voir API javax.xml.parsers

Typage dynamique des colonnes

Ne gre pas les contraintes d'intgrit rfrentielle

Approche hirarchique (DOM) : org.w3c.dom

Approche vnementielle (SAX) : org.xml.sax

JSON

Parsing de ressources au format JSON

Voir API org.json

Note
SAX plus
performant
que DOM !

Types

de donnes

NONE, INTEGER, REAL, TEXT, BLOB

Implmentation

Les types Boolens,


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

Support du standard SQL-92

Support partiel des dclencheurs (triggers)

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

Bonnes pratiques
Crer

Interrogation de la base

un helper

Approche

tendre android.database.sqlite.SQLiteOpenHelper

Classe abstraite qui gre la cration, l'ouverture et la monte


de version d'une base de donnes

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

myHelper = new BanksterHelper(context, "bankster.db", null, 1)

L'instance

de la BDD est ensuite obtenue


l'aide du helper, selon deux modes

SQLiteDatabase db;

db = myHelper.getWritableDatabase() //lecture et criture

db = myHelper.getReadableDatabase() //lecture seule

Approche

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)

Ajout, suppression, m-a-j

L'ensemble

des tuples (ou n-uplets) retourns


par une requte est un curseur
Cursor res = db.query(...)

On

peut ensuite parcourir cet ensemble

Reprsentation

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

Un n-uplet est une instance de android.content.ContentValues

n paires nom-de-champ/valeur-de-champ

de tuples

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

Supression

Fermeture
d'un curseur :
manuellement ou
en mode ''manag''

Mise

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

Ncessit

de les dplacer en arrire-plan

de tuples

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

jour de tuples

db.update(String table, ContentValues values, String whereClause,


String[] whereArgs)

Thread principal
Tous

d'un tuple

Ajout

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

par composante

Rsultats

par SQL brut

Tche asynchrone
Classe

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

Fournit

des gestionnaires d'vnements dj


synchroniss avec le UIThread pour mettre
jour les vues

doInBackground : placez le code excuter cet endroit. Pas


d'interaction avec l'UI !

A l'aide de tches asynchrones

onProgressUpdate : mettez jour l'UI au fil du traitement

A l'aide de vos propres Threads enfants

onPostExecute : une fois le traitement termin, m-a-j de l'UI

Puis

les synchroniser avec l'interface graphique

Car le UIThread est le seul habilit modifier les vues !

Excution

de la tche

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

Thread enfant
Mme

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

Pour

synchroniser un thread enfant avec l'UI

Directement depuis une activit

fonctionnement que JAVA SE

Objectif : viter les ANR


Faire

attention aux traitements qui interfrent


sur l'UI et donc sur l'exprience utilisateur

Dclenchent une "Application Not Responding" (ANR)

Fermeture agressive de l'application

Exemples

Communications rseaux

Manipulations SQLite

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

Dans les autres cas

Instancier un handler ncessairement dans le UiThread : h = new Handler();

Y enfiler des runnables depuis le thread enfant : h.post(new Runnable(){...});

frquents :

Voir du cot de android.app.LoaderManager

Pensez

faire patienter votre utilisateur

Barre de progression, SplashScreen au dmarrage...

Les capteurs

Exploiter les
dispositifs matriel

Un

priphrique Android peut possder aucun


ou plusieurs capteurs (sensors en anglais)

Cinmomtre (ou acclromtre)

Gyroscope (ou boussole)

Luminomtre

Magntomtre

...

Constantes

supportes par la classe


android.hardware.Sensor

Principes des capteurs


Systme

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

TYPE_AMBIENT_TEMPERATURE, TYPE_GRAVITY,
TYPE_GYROSCOPE, TYPE_LIGHT...

Capteurs : code source


package fr.univpau.bankster;
import android.app.Service;
import android.hardware.*;
public class FallingDown extends Service {

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

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

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

@Override
protected void onDestroy() {
super.onDestroy();
sm.unregisterListener(...);
}
}

Acquisition des donnes


Choisir

son taux d'acquisition (toutes les n


microsecondes)

Exemple de contantes de la classe Sensor :


SENSOR_DELAY_NORMAL, SENSOR_DELAY_FASTEST...

Interface

android.hardware.SensorEventListener
commune tous les capteurs

onAccuracyChanged() : la prcision a change (+/-)

onSensorChanged() : une nouvelle valeur brute est disponible

Evnement de capteur
L'vnement

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)

Acclromtre, gravit,
gyroscope...

Vecteur de flottants dont la


taille et l'interprtation
dpendent du capteur

Chaque

vnement est un objet instance de la


classe android.hardware.SensorEvent

Multi-touch

vnements gestuels
Supporte

plusieurs
pointeurs simultans

Une

mme instance de android.view.MotionEvent


peut ainsi modliser de multiples vnements

Doigt, stylet...

Autant qu'il y a de pointeurs actifs la surface

Limite thorique : 256

Technique du masque binaire pour extraire les informations

event.getPointerCount()

chaque pointeur actif


est attribu un ID

Trois

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

Cycle de vie (ou d'actions) des suivants

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

b) Drag
c) Pinch-Zoom

ACTION_DOWN (ACTION_MOVE)* ACTION_UP

ACTION_POINTER_DOWN (ACTION_MOVE)* ACTION_POINTER_UP

Golocalisation
Exploiter

Instance de android.location.LocationManager

vnements de position
Interface

android.location.LocationListener pour
couter les changements de position

onLocationChanged() : une nouvelle position est disponible

Instance de android.location.LocationProvider

onProviderDisabled()/Enabled() : fournisseur dsactiv/activ

Exemple de constantes de la classe LocationManager :


LocationManager.GPS_PROVIDER,
LocationManager.NETWORK_PROVIDER, ...

onStatusChanged() : le statut du fournisseur a chang

Require

le gestionnaire de position

le premier pointeurs des suivants

gestes de base

a) Tap

event.getActionMasked()

Diffrencie

le choix d'un fournisseur de position

Chaque fournisseur offre diverses caractristiques

Consommation d'nergie

Prcision

Capacit dterminer l'altitude

...

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

OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE, AVAILABLE

Chaque

position est un objet instance de la


classe android.location.Location

Modlis par : latitude, longitude, cap, altitude, vitesse, et


horodatage

Parfois, dtails additionnels dans les extras (Bundle)

Golocalisation : code
source

Cartographie

package fr.univpau.bankster;

La

golocalisation est un tremplin naturel vers


la cartographie

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

Service dimages tuiles pour permettre une visualisation


fluide et performante

Gocodage (avant/inverse) : coordonnes adresses

+ services ad-hoc : itinraires, parcelles cadastrales, lieux


d'intrts, street view, ...

Choisir

Fournie par des entreprises qui se sont spcialises dans la


cartographie

L'API Google Maps est logiquement favorise sous Android

// Ne pas oublier !

une tierce API de cartographie

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

Google Maps lements cls


MapView

Voi aussi
l'activit ddie
MapActivity

Instance de com.google.android.maps.MapView

Vue composite (ViewGroup) destine afficher une carte

Google Maps - Coordonnes


Chaque

coordonne est un objet instance de la


classe com.google.android.maps.GeoPoint

MapController

Instance de com.google.android.maps.MapController

Utilis pour contrller la carte, vous permettant de centrer et


de rgler le niveau de zoom...

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

Latitude et Longitude uniquement

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

Projection

Traduire des coordonnes gographique (latitude, longitude)


en coordonnes cran (x,y)

Interface com.google.android.maps.Projection

Overlay

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

des coordonnes

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

Mthodes toPixels() et fromPixels()

Bluetooth : vue d'ensemble


BluetoothDevice #1
Bluetooth
Server
Socket

Bluetooth
Socket

BluetoothDevice #2

BluetoothAdapter
BluetoothDevice #3

Divers

Services systme

Alarmes et Timers

Il

est frquent de rcuprer des Managers


partir de services systmes prconfigurs

Les

Appel de la mthode getSystemService(Context.XXXXX)

des heures dtermines

Retour : LocationManager, LayoutInflater, WifiManager...

des intervalles dtermins

Exemples

Context.LOCATION_SERVICE

Context.LAYOUT_INFLATER_SERVICE

Context.STORAGE_SERVICE

Prise

de services (constantes)

alarmes sont un moyen de dclencher des


intents (et donc des composants)

AlarmManager am =
(AlarmManager)getSystemService(Context.ALARM_SERVICE)

am.set(TYPE, TIME, pendingIntent)

Les

Context.TELEPHONY_SERVICE

Context.WIFI_SERVICE

en charge par le gestionnaire d'alarmes

timers eux, grent l'excution de tches

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

Linkify, TextWatcher

Application : variable globale

Transformer

des textes (TextView) en liens


cliquables (i.e. gnrateurs d'intents)

Comment

partager des donnes travers tous


les composants d'une application

Classe utilitaire android.text.util.Linkify

Crer une sous classe de android.app.Application

Reconnaissance de motifs : n tel, email, URL Web, map...

Gre des vnements propres la vie de l'application

Contrler

la saisie d'un texte (EditText)

Classe utilitaire android.text.TextWatcher

Gre des vnements : avant, aprs, pendant la saisie

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

Se dclare au niveau du nud <application> du manifeste

Principe

Une seule instance de la classe pour toute l'application

Les variables d'instances sont les donnes partager

Mapping objet-relationnel
Le

vas-et-viens entre la BDD embarque et les


objets mtiers est fastidieuse

Appliquer le fameux pattern DAO

du singleton

Base de donnes 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

existe toutefois des solutions ORM adaptes


Android (car lgres)
ActiveAndroid

Orman

NeoDatis

DataFramework

Androrm

SOAP

REST

Requte

++

DB4O

Astuce :
masquez le tout
avec un
ContentProvider

Rponse

Serveur
Serveur
HTTP
HTTP

ORMLite

...
JSP/Servlets,...
PHP,JSP/Servlets,
PHP,

est ncessaire de mettre en place une


approche par "WebService"

...
XML/SOAP,
JSON...

192.56.7.45

BDD
BDD

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

Mockups pour MobileApps


Prototypage

de l'UI de
votre MobileApp

Tests et dploiement

Dessiner les crans avant de


dmarrer le dveloppement

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

unitaire des composants applicatifs


Android

JUnit pour Android

android.test.AndroidTestCase tend junit.framework.TestCase

junit.framework.Assert

test du singe sur votre IHM

Ide : "si elle rsiste au comportement anarchique d'un


singe, elle rsistera l'utilisateur"

Gnre des vnements pseudoalatoires, tels que des


clics, des pressions de touches, des gestes, etc.

Le

programme s'excute dans votre mulateur

Se lance en ligne de commande

Vous suivez les vnements gnrs dans le log

android.test.InstrumentationTestRunner

Mise

Le

Activits, Services, et Providers

Extension

Test de l'UI

en place d'un projet de test

Sous-rpertoire tests/ de votre projet android


Code source de vos tests + manifeste

:Sending Pointer ACTION_DOWN x=437.0 y=183.0

:SendKey (ACTION_DOWN): 90 // KEYCODE_FORWARD=

...

Exporter et signer
Toute

Distribution des MobileApps

application doit tre signe

Signature digitale avec un certificat dont la cl prive est


conserve par le(s) dveloppeur(s)

Signature avec debug.keystore par dfaut

Trois
1

Utilitaire jarsigner.exe du JDK

Optimiser l'APK qui vient d'tre sign

Utilitaire keytool.exe du JDK

Signer l'APK avec la cl prive

tapes :

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

Utilitaire zipalign.exe du SDK Android

adb shell monkey [options] <event-count>

Procdure
entirement
automatise
avec ADT

solutions s'offrent vous


Utiliser Google Play (anciennement Android Market)

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

Autopublier sur votre propre site Web

Exemple : http://www.univ-pau.fr/~olegoaer/bankster.apk

Type MIME pour le tlchargement : application/vnd.android.package-archive

Utiliser un magasin tiers

YAAM (http://yaam.mobi/)

Bazaar (http://www.bazaarandroid.com/)

AndroLib (http://fr.androlib.com/)

Analyse d'audience
Google Analytics

SDK pour Android

Nombre d'utilisateurs actifs de votre application

Leur localisation travers le monde

Impact de votre campagne de pub (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

Você também pode gostar