Vous êtes sur la page 1sur 144

Architectures Mobiles

Tarak Chaari
Matre assistant lISECS

Cours de Mastre de recherche lISECS

Votre interlocuteur
Tarak CHAARI
Matre Assistant lInstitut Suprieur dElectronique
et de Communication de Sfax
Thse soutenue fin septembre 2007 lINSA de Lyon
Recherche (ReDCAD ENIS)
ladaptation dans les systmes dinformation pervasifs
gestion smantique de la qualit de service

Enseignement (ISECS ENIS)


Ingnierie des systmes dinformation distribus

Tarak CHAARI

Android

Prsentation gnrale de lintervention

Initiation la programmation Android


Prrequis: POO en Java & un peu dXML

Objectifs
Prsentation des enjeux des architectures mobiles

Avoir une ide sur larchitecture Android


Avoir une ide sur la programmation Mobile sous Android
Tarak CHAARI

Android

Introduction

Tarak CHAARI

Android

Constat
Explosion du march des terminaux mobiles
Faible cot

Internet

March grande consommation


Intranet

Evolution technologique exponentielle

AVANT :
Affichage limit
100x60 pour les crans N/B
640x240 pour les terminaux avec crans couleurs
Faible mmoire
Ne dpasse pas 1Mo de mmoire morte et vive runies
Faibles capacits de calcul
Moyens de communication limits

MAINTENANT :
Hautes rsolutions, GPS, WIFI, extension mmoire

Lvolution technologique dpasse le march de dveloppement


Tarak CHAARI

Android

Lordinateur : une tendance claire

Tarak CHAARI

Android

volution de lutilisation dinternet

Tarak CHAARI

Android

Enjeux
Fournir linformation partout
et tout moment
Tlphone mobile
PALM
PDA
Tablettes
eBook / cartable lectronique

Tarak CHAARI

Android

Origines
Google? Pas tout fait, cest une PME amricaine qui
sappelle Android cr en 2003 et rachete par Google en
2005
Google voulait sintroduire dans le march mobile (pas
russi au dbut)
Lobjectif est davoir un OS mobile qui peut apercevoir la
situation de lutilisateur (notamment lemplacement
gographique)
En 2007, Apple dvoile
technologie apparait)
Tarak CHAARI

lIphone

(un

gouffre

Android

de

Linfluence de lOpen Handset Alliance (OHA) (1/2)


En novembre 2007, lOHA a t cr par 35 entreprises
dont Google

Tarak CHAARI

Android

10

Linfluence de lOpen Handset Alliance (OHA) (2/2)


Lobjectif est davoir des standards open source pour les
appareils mobiles
Et pourquoi pas un OS mobile open source pour
concurrencer les OS propritaires iOS et Windows
Mobile ( limage de Linux par rapport MacOS et
Windows)?
Android est ainsi n de lOHA qui a attir des dixaines
dautres entreprises y compris Samsung, LG, HTC,
Asus (plus de 80 lheure actuelle)

Tarak CHAARI

Android

11

Philosophie et avantages dandroid (1/2)


Open Source
Gratuit (mme pour les constructeurs)
25$ pour publier des applications android via le market (play

store)
publier autant dapplication quon veut vie pour 25 $

Facile pour le dveloppement


API trs complte bas sur JDK 1.6 (+ dautres classes

complmentaires)
API simple de haut niveau (2 lignes de code pour envoyer un
SMS)

Facile vendre (via le play store)


Tarak CHAARI

Android

12

Philosophie et avantages dandroid (2/2)


Flexibilit
sadapte diffrentes architectures matrielles (avec clavier,

tactile, tlphones, tablettes et mme micro-ondes)


distribution intelligente

Exemple : application ncessitant bluetooth ne sera visible qu


partir des terminaux avec bluetooth)

Ingnieux
rutiliser le maximum de lexistant et combiner les composants :
Exemple : utiliser le rpertoire tlphonique
Combiner les composants (Appareil photo + GPS par exemple)
Collecte

de contributions damateurs (avantage de lopen

source)

Tarak CHAARI

Android

13

Contraintes du dveloppement mobile (1/2)


Peu de mmoire (8 fois moins quun PC en gnral)
Respecter lordre de priorit des tches
Les applications doivent interagir avec le systme sans le

bloquer
Un SMS ou un appel est toujours plus prioritaire que les autres
applications

Respecter des contraintes de scurit plus strictes


risque dabimer le matriel est plus fort

Autonomie (des jeux/applications usent toute la batterie


en 30 min)
Tarak CHAARI

Android

14

Contraintes du dveloppement mobile (2/2)


Puissance de calcul limit (risque de surchauffe)
Taille de lcran
Rduite voire variable
Linterface doit dadapter plusieurs crans (risque de perdre

des utilisateurs)

Nature de lcran
avec stylet petits composants
sensitif composants plus gros

Htrognit (langues, composants matriels, versions


de lOS)

Utilisateur plus exigeant (ce ne sont plus les mmes


besoins quavec un Nokia 3310)
Tarak CHAARI

Android

15

Java : un choix stratgique


Portabilit (la plus grande motivation)
Partager le mme langage et la mme conception
depuis les serveurs jusquaux terminaux

Programmes compacts et portables


Ateliers et Outils homognes
Interaction plus volue que les applications WEB
Gestion complte des ressources matrielles
Tarak CHAARI

Android

16

Les technologies actuelles JAVA

Cot serveur : J2EE

Dveloppement standard (PC) : J2SE


Cot clients lgers : J2ME Android
Pour les systmes embarqus : EmbeddedJava
Pour les cartes puces : JavaCard

Tarak CHAARI

Android

17

Architecture dAndroid

Une architecture complexe pour vous rendre la vie plus facile

Tarak CHAARI

Android

18

Architecture couches

Tarak CHAARI

Android

19

Dalvik VM, au lieu de JVM


Machines registres

Chaque application sa propre DVM


Communication inter-applications assure par le middleware
Multi thread assur par Linux
Accs la couche matrielle par le noyau Linux

Android

Le noyau android
Noyau standard Linux assurant :

Gestion de mmoire et de processus

Gestion de la pile rseau

Gestion des pilotes des capteurs

Gestion des permissions daccs

Avec quelques retouches pour le matriel du mobile :

Alarm

Process Binder

Power Management

Low Memory Killer

Kernel Debugger

Logger
Android

Gestion de lnergie avec le noyau android (1/2)

Gestion de lnergie
Problme
Limite

de la capacit des batteries et sa dgradation continue


avec leur utilisation

Proprits du module de gestion dnergie (PM)


est bas sur la gestion standard de lnergie dans un noyau
linux
PM ajoute des rgles un peu plus agressives pour prserver
lnergie
Principe de la course la mise en veille (Race to idle)
Les couches suprieures demande dactiver les composants
matriels travers des signaux appels Wake Locks.
Support de plusieurs types de Wake Locks.
PM

Tarak CHAARI

Android

Gestion de lnergie avec le noyau android (2/2)


Fonctionnement du module de gestion dnergie

If there are no active


wake locks, CPU will be
turned off.
If there are no partial
wake locks, screen and
keyboard will be turned
off.

Tarak CHAARI

Android

Environnement dexcution Android (1/3)

Core Libraries
Fournit les fonctionnalits offertes par les librairies de

bases du langage Java


APIs
Structures

de donnes

Utilitis

daccs aux fichiers


Accs au rseau
Composants graphiques
Etc
Gestion

Tarak CHAARI

Android

Environnement dexcution Android (2/3)

Dalvik Virtual Machine


Fournit un environnement sur lequel toute application

android est excute


Chaque

application Android est excute dans son propre


processus et dans sa propre instance de Dalvik VM.
Dalvik VM a t ralis dune faon efficace que la grande
majorit des terminaux puissent excuter plusieurs instances de
la machine virtuelle sans problmes.

Machine virtuelle base sur des registres et non sur une

pile

Tarak CHAARI

Android

Environnement dexcution Android (3/3)


Dalvik Virtual Machine
Execute des fichiers avec un format spcial (.dex)
Le format .dex est optimis pour consommer le moins de
mmoire
Compilation

Utilise le noyau Linux pour:


Threading (gestion des processus)
Gestion de la mmoire physique du systme

Tarak CHAARI

Android

Librairies (1/2)

Dveloppes en C/C++

Fournissent des fonctions de base pour les


applications Android (dveloppes en Java)
Tarak CHAARI

Android

Librairies (2/2)
Suite de la liste des librairies principales
System C Library (Bionic)
Media Libraries
Surface Manager (Surface Flinger)
Audio Manager (Audio Flinger)

3D Libraries (OpenGL)
LibWebCore (WebKit)
Gestion de la persistance (SQLite)

Bionic
Custom libc implementation optimized for embedded use
Problem with GNU libc
License
Size
Speed
Tarak CHAARI

The authors want to keep GPL out of user-space.


Libc will load in each process, so it needs to be small.
Limited CPU power means it needs to be fast.
Android

Framework des applications

Composants
applications

Java

de

base

pour

les

autres

View System: composants graphiques (Boutons, zones texte)


Resource Manager: accs aux ressources (images, icones,
traductions de texte, dispositions sur lcran)

Content provider: Partage de donnes entre applications


Activity Manager: Gestion du cycle de vie des applications

Tarak CHAARI

Android

Couche Applications

Applications de base pour utiliser le tlphone


Rpertoire tlphonique
Application de tlphone
Navigateur
Paramtres du tlphone
Lanceur dapplications

Tarak CHAARI

Android

Etapes de dveloppement (JVM)

Tarak CHAARI

Android

31

Etapes de dveloppement (Dalvink VM)

Tarak CHAARI

Android

32

Outils Android

Le outils fournis pour le dveloppement Android ont fait son


succs

Tarak CHAARI

Android

33

Prrequis (1/2)
JDK http://www.oracle.com/technetwork/java/javase/downloads
Android SDK http://developer.android.com/sdk/index.html

Tarak CHAARI

Android

34

Prrequis (2/2)

Tarak CHAARI

Android

35

Contenu de Android SDK


SDK ROOT

Development
Tools

System Images

Sample Code
and
Applications

Documentation

Rpertoire

Description

Development Tools

Un ensemble doutils pour le dveloppement


et le dboggage des applications et pour la
cration des interfaces utilisateurs

System Images
Sample Code and
Applications
Documentation
Tarak CHAARI

Images systme dAndroid


Des exemples dapplications Android
JavaDoc locale
Android

Contenu de Android SDK (Cont)


Development Tools
Hierarchy Viewer
Un outil permettant le dboguage et loptimisation des interfaces
utilisateurs
Cet outil offre une reprsentation visuelle des dispositions
hirarchique des composants graphiques
Android Debug Bridge (adb)
Un outil qui permet dinstaller et de dboguer les applications
dveloppes
Ceci peut se faire de la mme faon que sur un vrai terminal que sur
un mulateur
Il offre un ensemble de commandes pour grer le transfert
dapplications entre lespace de dveloppement et le terminal ou
lmulateur
Le dboguage se fait travers un Log (journal) maintenu sur le
terminal ou lmulateur (adb logcat)
Tarak CHAARI

Android

Contenu de Android SDK (Cont)


Development Tools (Cont)
9-patch: Un diteur graphique pour la cration dimages

redimentionnables ou ddies une rsolution donne


Android Asset Packaging Tool (aapt)
Cest loutil de finalisation du dveloppement qui permet de
crer des paquetages dapplication (Android Package Files
.apk) contenant les fichiers compils et les ressources
(images, fichiers de configuration)
Dalvik Debug Monitor Service (ddms) : un outils qui

permet de grer les processus sur lmulateur ou le


terminal
Tuer

des processus, slectionner


dboguer,faire des copiers dcrans

Tarak CHAARI

un

processus

Android

Contenu de Android SDK (fin)


Development Tools (Cont)
Android Interface Description Language (aidl)
Un langage qui permet de dfinir les interfaces dchanges interprocessus
Ce sont des interfaces Java

sqlite3
Un outil permettant daccder aux bases de donnes SQLite des
applications Android
Traceview
Analyse statistiques sur les applications (mmoire utilise, charge
processeur)
dx

Loutil qui permet de transformer les .class en bytcode Dalvik

Tarak CHAARI

Android

IDE de dveloppement
Pour ne pas dstabiliser les dveloppeurs: un diteur habituel

Tarak CHAARI

Android

40

IDE de dveloppement (cont)


Eclipse
Un IDE open source project dvelopp par une grande

communaut

Tarak CHAARI

Android

IDE de dveloppement (cont)


Eclipse Platform

Eclipse est bas sur une architecture ouverte permettant

dajouter des plug-ins de dveloppement offrants de nouvelles


fonctionnalits
Tarak CHAARI

Android

IDE de dveloppement (cont)

Exemples de plug-ins:
Plug-in

Function

JDT

provides the capability to create, edit, navigate, build,


and debug projects that use Java as a programming
language

CDT

provides the capability to create, edit, navigate, build,


and debug projects that use C and/or C++ as a
programming language

UML2
...

Tarak CHAARI

provides the capability to create UML models


...

Android

Le plugin ADT - Android Development Tools

Tarak CHAARI

Android

Installation - ADT

Tarak CHAARI

Android

Un mulateur (1/3)
Pour essayer les applications dveloppes (pas obligatoire)

Tarak CHAARI

Android

46

Un mulateur (2/3)

Tarak CHAARI

Android

47

Un mulateur (3/3)

Pour le test
sur le
terminal, ne
pas oublier
dinstaller les
pilotes USB !

Tarak CHAARI

Android

48

Composants principaux dapplications


Android

Le dveloppement dapplications (graphiques) sur Android est


bas sur la notion dactivits

Tarak CHAARI

Android

49

Introduction au dveloppement Android


Mots-cls
Applications,
Communication, vnements, intentions,
Services en tche de fond,
Persistance.

Une Application hrite le la classe Activity


Surcharge de certaines mthodes
Du dj vu : MIDlet, Applet, Servlet,

Le cycle de vie est impos par le framework


Dj vu : pour une Applet init() puis

Tarak CHAARI

Android

Contenu dune application Andoid

Les applications android sont dveloppes en Java


Une application android (.apk) et construite par loutil aapt
.apk
Java
Code

Data Files

Tarak CHAARI

Resources
Files

res/layout: declaration layout files

res/drawable: intended for drawing


res/anim: bitmaps, animations for transitions
res/values: externalized values
strings, colors, styles, etc
res/xml: general XML files used at runtime
res/raw: binary files (e.g. sound)

Android

Composants principaux dapplications


Les applications Androids nont pas un point dentre
unique (comme la mthode main())
Les applications Android sur des composants que le
systme pourrait instancier quand il le faut
Ces composants principaux sont :
Components

Description

Activity

UI component typically corresponding to one screen

Service

Background process without UI

Broadcast Receiver

Component that responds to broadcast Intents

Content Provider

Component that enables applications to share data

Ces composants doivent tre dcalrs dans un fichier


xml (appel manifest) associ lapplication
Tarak CHAARI

Android

Applications Android
une application graphique est un assemblage de
fentres entre lesquelles il est possible de naviguer
Ces diffrentes fentres sont appeles des activits

comme une activit remplie tout l'cran, alors votre


application ne peut en afficher qu'une la fois
Une activit est un ensemble de composants appels
vues (View)
Elle contient aussi des informations sur lapplication
appel contexte (Context)
Tarak CHAARI

Android

Exemple dune application Android : Paramtres

Activits

Tarak CHAARI

Android

Activit

Interface graphique + Contexte dexcution


En inversion de contrle (callback)
Mthodes onStart(). Dclenches par le middleware

Cycle de vie contrl par le systme dexploitation


Tarak CHAARI

Android

55

Pile dactivits gre par le systme dexploitation

En tache de fond (onPause) : Empiler(lactivit_courante);


Activit au 1er plan (onResume) : activit_courante = Dpiler();
Tarak CHAARI

Android

56

OnPause -> onResume (1/2)


1)

OnPause
2)

3)

OnResume
4)

Tarak CHAARI

Android

onPause onResume (2/2)

Android

public class android.app.Activity


package android.app;
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState){
protected void onStart();
protected void onRestart();

protected void onResume();


protected void onPause();
protected void onStop();
protected void onDestroy();
}
Tarak CHAARI

Android

Inversion de Contrle (callback) Rappel

Activits

activit_1

Activit 2

Activit 3

onCreate(..)
onStart();

Dveloppeur

Android OS

activit_1 = new Activit_1();

activit_1.onCreate();

startActivity(activit_1);

activit_1.onStart();

public class Activity extends ApplicationContext


{
1

protected void onCreate(Bundle savedInstanceState);


protected void onStart();
..}

Tarak CHAARI

Android

Dmonstration, Activity dans tous ses tats


public class ActivityLifeCycle extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("=======","onCreate");
// cf. page prcdente
}
public void onDestroy(){
super.onDestroy();
Log.i("******", "onDestroy");
}
}

Android

Emulateur (ou terminal) + LogCat : traces bien utiles

Android

Dmonstration, Activity dans tous ses tats


public class ActivityLifeCycle extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);Log.i("=======","onCreate");}

public void onStart(){


super.onStart();Log.i("=======","onStart");}
public void onResume(){
super.onResume();
Log.i("=======","onResume");
}
public void onPause(){
super.onPause();
Log.i("=======","onPause");
}
public void onStop(){
super.onStop();
Log.i("******","onStop");
}
public void onDestroy(){
super.onDestroy();
Log.i("******", "onDestroy");
}
}

Android

Activity : visibilit pour lutilisateur et tats

State

Description

Running

Lactivit est en premier plan de lcran (A la tte de la pile


des activits courante).

Paused

Lactivit a perdu le Focus puisquune autre vient de


safficher au premier plan.

Stopped

Lactivit est arrt mais elle est tjr prsente en arrire


plan
Android

64

Une activit est compose dun ensemble de View

Ceci est gnralement dfini en XML


(dtails plus tard)

Tarak Chaari (UHA)

Android

65

Dclaration des activits dans le manifest de


lapplication
Package principal

Permission pour raliser


des connexions internet

Nom de lactivit

ressources
Android

66

les Ressources Android

J2ME

67
67

Les resources
Un rpertoire res est automatiquement cr lors de la
cration dun projet android (en plus dun rpertoire src)
/* AUTO-GENERATED FILE. DO NOT MODIFY. This class was
automatically generated by the
* aapt tool from the resource data it found. It should not be
modified by hand. */

/res
anim
drawable
xhdpi
hdpi
mdpi
ldpi
layout
values
arrays.xml
colors.xml
strings.xml
xml
raw
Tarak CHAARI

R.java

package cs454.demo;
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 textview=0x7f050000;
}
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;
}
}

Android

Types de ressources
Type

Description

Dessin et image
(res/drawable)

Images, icones et fichiers XMlL de dessin


simple (rectangles, cercles)

Mise en page graphique


(res/layout)

Disposition des composants dans les activits

Menu
(res/menu)

Les fichiers XML pour pouvoir constituer des


menus.

Donne brute
(res/raw)

Donnes diverses au format brut. Par exemple


de la musique ou des fichiers HTML

Diffrentes variables
(res/values)

On y trouve entre autre des variables


standards, comme des chaines de caractres,
des dimensions, des couleurs, etc.

Tarak CHAARI

Android

69

Les sous types de ressources


Dans chaque type de ressources on peut avoir des sous
types (langue, taille de lcran)
Ces sous typessont spcifis par des quantificateur
spars par des -
res/<type_de_ressource>[<-quantificateur 1><-quantificateur N>]

Exemples de quantificateurs :
Langues : fr,en, fr-rFR, fr-rCA
Taille de lcran : small, normal, large, xlarge
rsolution de lcran : ldpi (160 dpi), mdpi (160 dpi), hdpi (240

dpi), xhdpi (320 dpi)


orientation de lcran : land (paysage), port (portrait)

Les sous types les plus utiliss :


res/drawable-xhdpi, res/drawable-hdpi, res/drawable-ldpi,
res/drawable-mdpi, res/layout-land, res/layout, res/values-fr-rFR
Tarak CHAARI

Android

Les ressources (2/2)

Les ressources sont utilises de la manire suivante:

R.type_ressource.nom_ressource qui est de type int.

Il s'agit de l'identifiant de la ressource.

On peut alors utiliser cet identifiant ou rcuprer l'instance de


la ressource en utilisant la classe Resources:

Resources res = getResources();

String hw = res.getString(R.string.hello);

XXX o = res.getXXX(id);

Une mthode spcifique pour les objets graphiques permet de


les rcuprer partir de leur id, ce qui permet d'agir sur ces
instances mme si elles ont t cres via leur dfinition XML:

TextView texte = (TextView)findViewById(R.id.le_texte);

texte.setText("Here we go !");
J2ME

71

Rfrencement entre ressources

On peut utiliser les ressources comme valeurs dattributs dans dautres


ressources sous forme XML. Cette possibilit est trs utilise dans les mises
en page par exemple.
La notation pour faire rfrence une autre ressource est la suivante :
attribute="@[package_name:]resource_type/resource_identifier"

En voici lutilisation au sein dun exemple qui cre une mise en page sous
forme de table (dune ligne et de deux colonnes) dont les cellules sont
remplies par des chanes de caractres :
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

android:stretchColumns="1">
<TableRow>
<TextView android:text="@string/table_cellule_gauche" />
<TextView android:text="@string/table_cellule_droite" />
</TableRow>
</TableLayout>
J2ME

72
72

Les chanes

Les chanes constantes de l'application sont situes


dans res/values/strings.xml.
L'externalisation des chanes permettra de raliser
l'internationalisation de l'application.
Voici un exemple:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello Hello JFL !</string>
<string name="app_name">AndroJF</string>
</resources>

La rcupration de la chane se fait via le code:


Resources
String

res = getResources();

hw = res.getString(R.string.hello);
J2ME

73
73

Internationalisation
Le systme de ressources permet de grer facilement l'internationalisation
d'une application.
Il

suffit de crer des rpertoires values-XX o XX est le code de la langue que l'on
souhaite implanter.
On

place alors dans ce sous rpertoire le fichier xml strings.xml contenant les
chaines traduites associes aux mme clefs que dans values/strings.xml.
Android

chargera le fichier de ressources appropri en fonction de la langue du

systme.
On

obtient par exemple pour les langues es (espagnol) et fr (franais) l'arborescence:


MyProject/

res/
values/
strings.xml
values-es/
strings.xml
values-fr/
strings.xml
J2ME

74
74

Autres valeurs simples

Plusieurs fichies xml peuvent tre placs dans


res/values.
Cela

permet de dfinir des chaines, des couleurs, des


tableaux,...

L'assistant de cration permet de crer de nouveaux


fichiers de ressources contenant des valeurs simples,
comme par exemple un tableau de chaines:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="test">
<item>it1</item>
<item>it2</item>
</string-array>
</resources>
J2ME

75
75

Les couleurs
Une couleur dfinit une valeur RVB (rouge, vert et bleu) et une
transparence.
Cette

couleur peut tre utilise de multiples endroits comme pour dfinir la


couleur dun texte.
Il existe diffrents formats dont la syntaxe globale est la suivante :
<color name=nom_couleur>valeur_de_la_couleur</color>

Exemple de dclaration d'une couleur


<resources>
<color name="bleu_transparent">#50F00FF</color>
</resources>

Utilisation des couleurs (exemple avec la dclaration de la


couleur bleu_transparent):
Java

: R.color.bleu_transparent
XML : @[package:]color/bleu_transparent
J2ME

76
76

Les dimensions

Les dimensions sont la plupart du temps rfrences


dans les styles et les mises en page.
Les units prises en charge par Android : px (pixels), in
(pouces), mm (millimtres), pt (points), dp (densityindependant pixel), sp (scale-independant pixel).
dp

: une unit relative se basant sur une taille physique de lcran


de 160 dpi.
Avec cette unit, 1 dp est gal 1 pixel sur un cran de 160 pixels.
Si la taille de lcran est diffrente de 160 pixels, les vues
sadapteront selon le ratio entre la taille en pixels de lcran de
lutilisateur et la rfrence des 160 pixels;

sp

: fonctionne de la mme manire que dp. Ils sont aussi fonction


de la taille de polices spcifie par lutilisateur.
J2ME

77
77

Les dimensions : Exemple


Exemple de fichier de ressources de dimensions
<resources><dimen name="taille_texte">5sp</dimen></resources>

Utilisation des dimensions :


Java

: R.dimen.un_nom

Resources.getDimen(R.dimen.taille_texte);

XML

: @dimen/un_nom
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/taille_texte"/>

J2ME

78
78

Les images

Android prend en charge les fichiers bitmap sous


diffrents formats avec une prfrence pour le format PNG.
Java

: R.drawable.image1
XML : @[package:]drawable/image1

Concernant les rsolutions, chacune des catgories (low,


medium, high) dispose dun rpertoire o enregistrer les
ressources.

J2ME

79
79

Les animations
La dclaration danimations contient des possibilits de rotation, de
fondu, de translation et de changements de taille. Les animations sont
places dans un ou plusieurs fichiers dans le rpertoire res/anim.
Voici les quatre types danimations proposes :
<alpha> : permet de faire un fondu ;
<scale> : dfinit un facteur dchelle de dpart et darrive en X et Y ;
<translate> : permet de dplacer llment ;
<rotate> : propose une rotation avec un point pivot et un angle en degrs.

Android propose galement des attributs permettant de nombreux


rglages comme la dure, la rptition, etc.
Exemple danimation de type fondu avec la transparence qui passe de
01:
<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="100"/>
Tarak Chaari

J2ME

80

Les interfaces graphiques Android

Tout est bas sur XML

Tarak CHAARI

Android

81

Ralisation dinterface utilisateur sous Android

UI construction can be done in three ways:

Programmatic, like hand-coded Java desktop GUI construction


Declarative hand-written, like Java web UI construction

XML

Declarative with a GUI builder, like .NET UI construction

GUI builder generates the XML

Par programmation
package cs454.demo;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class AndroidDemo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Activity is a subclass of context, so the TextView takes this as a parameter
TextView tv = new TextView(this);
tv.setText("Hello, CS454");
setContentView(tv);
}
}

Par dclaration manuelle XML


main.xml Layout File:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>
strings.xml resource file:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello Again, CS454!</string>
<string name="app_name">CS454 AndroidDemo</string>
</resources>

Par dclaration manuelle XML (suite)


Java class:

package cs454.demo;
import android.app.Activity;
import android.os.Bundle;

public class AndroidDemo extends Activity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Whats R?
package cs454.demo;
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 textview=0x7f050000;
}
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;
}
}

Par dcalaration XML avec assistant graphique

Gestion des vnements


From the code file for the activity:
Button ok = (Button) findViewById(R.id.button1);
ok.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CharSequence s = et.getText();
tv.setText("Welcome, " + s);
}
});

Elements and layouts

Linear Layout
Shows nested View elements
/* linear.xml */
<?xml version=1.0 encoding=utf-8?>
<LinearLayout android:orientation=horizontal
android:layout_width=fill_parent
android:layout_height=fill_parent
android:layout_weight=1>
<TextView android:text=red />
<TextView android:text=green />
</LinearLayout>
<LinearLayout android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
android:layout_weight=1>
<TextView android:text=row one />
</LinearLayout>

Tarak CHAARI

Android

Elements and layouts

Table Layout
Like the HTML div tag
/* table.xml */
<?xml version=1.0 encoding=utf-8?>
<TableLayout android:layout_width=fill_parent
android:layout_height=fill_parent
android:stretchColumns=1>
<TableRow>
<TextView android:layout_column=1
android:text=Open...
android:padding=3dip />
<TextView android:text=Ctrl-O
android:gravity=right
android:padding=3dip />
</TableRow>
</TableLayout>

Tarak CHAARI

Android

Elements and layouts

Grid View
/* grid.xml */
<?xml version=1.0 encoding=utf-8?>
<GridView
android:id=@+id/gridview
android:layout_width=fill_parent
android:layout_height=fill_parent
android:columnWidth=90dp
android:numColumns=auto_fit
android:verticalSpacing=10dp
android:horizontalSpacing=10dp
android:stretchMode=columnWidth
android:gravity=center
/>

Tarak CHAARI

Android

Elements and layouts

Grid View
/* GridExample.java */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new AdapterForGridView(this));
gridview.setOnItemClickListener(
new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int pos, long id) {
Toast.makeText(
GridPrimer.this, "" + pos, Toast.LENGTH_SHORT).show();
}});

Tarak CHAARI

Android

Elements and layouts

Grid View
/* AdapterForGridView.java */
public class AdapterForGridView extends BaseAdapter {
private Context mContext;
public AdapterForGridView(Context c) { mContext = c; }
public int getCount() { return mThumbIDs.length; }
public Object getItem(int position) { return null;}
public long getItemId(int position) { return 0; }
// bad getView implementation
public View getView(int pos, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(mThumbIDs[pos]);
return imageView;
}
private Integer[] mThumbIDs =
{ R.drawable.img1, R.drawable.img2 /*...*/ };
}

Tarak CHAARI

Android

Elements and layouts

Tab Layout
/* tab.xml */
<?xml version=1.0 encoding=utf-8?>
<TabHost android:id=@android:id/tabhost
android:layout_width=fill_parent
android:layout_height=fill_parent>
<LinearLayout android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent>
<TabWidget android:id=@android:id/tabs
android:layout_width=fill_parent
android:layout_height=wrap_content/>
<FrameLayout
android:layout_width=fill_parent
android:layout_height=fill_parent/>
</LinearLayout>
</TabHost>

Tarak CHAARI

Android

Elements and layouts

Tab Layout
/* selector1.xml */
<?xml version=1.0 encoding=utf-8?>
<selector xmlns:android=http://schemas.android.com/apk/res/android>
<! Tab is selected -->
<item android:drawable=@drawable/ic_tab_1_selected
android:state_selected=true />
<! Tab not selected -->
<item android:drawable=@drawable/ic_tab_1_not_selected />
</selector>
/* selector2.xml */
/* selector3.xml */

Tarak CHAARI

Android

Elements and layouts

Tab Layout
/* Tab1.java */
public class Tab1 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textview = new TextView(this);
textview.setText(This is the Artists tab);
setContentView(textview);
}

}
/* Tab2.java */
/* Tab3.java */

Tarak CHAARI

Android

Elements and layouts

Tab Layout
/* TabExample.java */
public class TabExample extends TabActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab);
TabHost tabHost = getTabHost();
//--- tab 1 --Intent intent = new Intent().setClass(this, Tab1.class);
TabHost.TabSpec spec = tabHost.newTabSpec(tab1).setIndicator(
Artists, getResources().getDrawable(R.drawable.selector1))
.setContent(intent);
tabHost.addTab(spec);
//--- tab 1 --tabHost.setCurrentTab(2);
}

Tarak CHAARI

Android

Elements and layouts

List View
/* list_item.xml */
<?xml version=1.0 encoding=utf-8?>
<TextView
android:layout_width=fill_parent
android:layout_height=fill_parent
android:padding=10dp
android:textSize=16sp />

Tarak CHAARI

Android

Elements and layouts

List View
/* ListViewExample.java */
public class ListViewExample extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(this,
R.layout.list_item, COUNTRIES));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
((TextView) view).getText(), Toast.LENGTH_SHORT).show();
}});
}

Tarak CHAARI

Android

Elements and layouts

Button
ImageButton
EditText
CheckBox
RadioButton
ToggleButton
RatingBar

Tarak CHAARI

Android

Elements and layouts

DatePicker
TimePicker
Spinner
AutoComplete
Gallery
MapView
WebView

Tarak CHAARI

Android

Events

Event Handler
Hardware buttons

Event Listener
Touch screen

Tarak CHAARI

Android

Events

KeyEvent is sent to callback methods


onKeyUp(), onKeyDown(), onKeyLongpress()
onTrackballEvent(), onTouchEvent()
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA) {
return true; // consumes the event
}
return super.onKeyDown(keyCode, event);
}
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { /* ... */ }
});

Tarak CHAARI

Android

Events

public class TouchExample extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) { /*...*/ }
});
button.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
// ...
return true;
}
});
}
}

Tarak CHAARI

Android

Menus
Options Menu: MENU button, tied to an Activity
Context Menu: View LongPress
Submenu
public void onCreate(Bundle savedInstanceState) {
registerForContextMenu((View)findViewById(/*...*/));
public boolean onCreateOptionsMenu(Menu menu) {
}
menu.add(0, MENU_ADD, 0, Add)
public void onCreateContextMenu(ContextMenu menu, View v,
.setIcon(R.drawable.icon);
ContextMenuInfo menuInfo){
menu.add(0, MENU_WALLPAPER, 0, Wallpaper);
super.onCreateContextMenu(menu, v, menuInfo);
return super.onCreateOptionsMenu(menu);
menu.add(0, MENU_SMS, 0, SMS);
}
menu.add(0, MENU_EMAIL, 0, Email);
public boolean onOptionsItemSelected(MenuItem item) {
}
switch(item.getItemId()) {
public boolean onContextItemSelected(MenuItem item) {
case MENU_ADD:
//... ; return true;
switch(item.getItemId()) { case MENU_SMS: /*...*/ }
case MENU_WALLPAPER: //... ; return true;
}
default: return false;
}
}

Tarak CHAARI

Android

les intents

J2ME

106
106

Aperu sur les Intents (les intentions)


Un intent est un message simple envoy dautres
applications
Chaque Intent est compos de:
Une action effectuer (MAIN, VIEW, EDIT, PICK, DELETE, DIAL,

etc)
Contenu concern (identifi par un URI)

Exemples
startActivity(new Intent(Intent.VIEW_ACTION, Uri.parse("http://www..google.fr"));
startActivity(new Intent(Intent.VIEW_ACTION, Uri.parse("geo:47.480843,8.211293"));
startActivity(new Intent(Intent.EDIT_ACTION,Uri.parse("content://contacts/people/1"));

Tarak CHAARI

Android

Aperu sur les Intent Filters


Un intent filter permet de spcifier une capacit de
rpondre un un type dintents.

Le premier intent filter indique que lactivit sera


excutable (1re activit lors de lexcution)
Le second filtre dclare une action que l'activity peut
raliser sur un type particulier de donnes
Tarak CHAARI

Android

Principe des Intents


Les Intents permettent de grer l'envoi et la rception de
messages afin de faire cooprer les applications.
Le but des Intents est de dlguer une action un autre
composant, une autre application ou une autre activit de
l'application courante.
Un objet Intent contient les information suivantes:
le

nom du composant cibl (facultatif)

l'action
les

raliser, sous forme de chane de caractres

donnes: contenu MIME et URI

des

donnes supplmentaires sous forme de paires cl/valeur

une

catgorie pour cibler un type d'application

des

drapeaux (informations supplmentaires)

On peut envoyer des Intents informatifs pour faire passer des


messages.
On peut aussi envoyer des Intents servant lancer une nouvelle
activit.
J2ME 109
109

Fonctionnement des intents

Les Intents ont essentiellement trois utilisations :


Dmarrer

une activit au sein de lapplication courante ou de


solliciter dautres applications et denvoyer des informations.
Dmarrer

une activit au sein dune mme application est


utilis pour la navigation entre crans dune interface graphique
et lappel dune bote de dialogue.
Cest le seul cas o on doit dmarrer une activit en mode explicite.

Solliciter

une autre application pour rpondre un besoin (qui


peut tre lexcution dune action ou bien la transmission
dinformations).
On se contenterde transmettre son intention au systme qui, lui, va se
charger trouver lapplication et le composant le plus appropri puis dmarrer
ce dernier et lui transmettre lIntent correspondant.

J2ME

110
110

Fonctionnement des intents

Les Intents ont aussi dautres utilisations, dont le


dmarrage dun service. Le mcanisme relatif aux
objets Intent et leur utilisation sont en effet
indispensables pour les applications fonctionnant en
arrire plan (telles que les services) afin de recevoir
des actions effectuer et de pouvoir communiquer
avec dautres applications.
Il est aussi possible de vouloir diffuser un objet Intent
plusieurs applications (par exemple pour informer
lensemble des applications ouvertes que la batterie
est dfaillante).
les

applications peuvent mettre en place un filtre permettant de


ne conserver que les Intents que lapplication juge ncessaires.
J2ME

111
111

Naviguer entre crans


Une application est souvent compose de plusieurs
crans qui senchanent les uns la suite des autres
en fonction de lutilisateur et chaque cran est
reprsent par une activit dfinissant son interface
utilisateur et sa logique.
La

principale utilisation dun Intent est le dmarrage de ces activits (une


la fois) permettant cet enchanement.
De

faon plus gnrale, chaque composant de lapplication


ncessitera lemploi dun Intent pour tre dmarr.

Il existe deux mthodes pour dmarrer une activit,


en fonction de la logique de linterface : parfois on a
besoin de savoir comment sest droule lactivit (et
obtenir un retour lors de son arrt), parfois non.
J2ME

112
112

Intents pour une nouvelle activit

Il y a plusieurs faons de crer l'objet de type Intent


qui permettra de lancer une nouvelle activit.
Si l'on passe la main une activit interne
l'application, on peut crer l'Intent et passer la classe
de l'activit cible par l'Intent:
Intent login = new Intent(this, GiveLogin.class);
startActivity(login);

Le premier paramtre de construction de l'Intent est


en fait le contexte de l'application.
Dans

certain cas, il ne faut pas mettre this mais faire appel


getApplicationContext() si l'objet manipulant l'Intent n'hrite pas
de Context.
J2ME

113
113

Intents pour une nouvelle activit (suite)

S'il s'agit de passer la main une autre application, on


donne au constructeur de l'Intent les donnes et l'URI
cible: le SE est charg de trouver une application
pouvant rpondre l'Intent.
Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Uri telnumber = Uri.parse("tel:0248484000");
Intent call = new Intent(Intent.ACTION_DIAL, telnumber);
startActivity(call);}});

Sans oublier de dclarer la nouvelle activit dans le


Manifest.
J2ME

114
114

Retour d'une activit (1/4)

Lorsque le bouton retour est press, l'activit


courante prend fin et revient l'activit
prcdente.
Cela

permet par exemple de terminer son appel


tlphonique et de revenir l'activit ayant initi
l'appel.

Au sein d'une application, une activit peut


vouloir rcuprer un code de retour de l'activit
"enfant".
On

utilise pour cela la mthode startActivityForResult


qui envoie un code de retour l'activit enfant.
J2ME

115
115

Retour d'une activit (2/4)


Lorsque l'activit parent reprend la main, il devient possible de
filtrer le code de retour dans la mthode onActivityResult pour
savoir si l'on revient ou pas de l'activit enfant.
L'appel d'un Intent devient donc:
Intent login = new Intent(getApplicationContext(), GivePhoneNumber.class);
startActivityForResult(login,48);}

Le filtrage dans la classe parente permet de savoir qui avait


appel cette activit enfant:
public void onCreate(Bundle savedInstanceState) {
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == 48)
Toast.makeText(this, "Code de requte rcupr (je sais d'o je viens)",
Toast.LENGTH_LONG).show();}
J2ME

116
116

Retour d'une activit (3/4)

Il est aussi possible de dfinir un rsultat d'activit,


avant d'appeler explicitement la fin d'une activit avec
la mthode finish().
Dans

ce cas, la mthode setResult permet d'enregistrer un


code de retour qu'il sera aussi possible de ltrer dans l'activit
parente.

Dans l'activit enfant, on met donc:


Button finish = (Button)findViewById(R.id.finish);
finish.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setResult(50);
finish();}});
J2ME

117
117

Retour d'une activit (4/4)

Et la classe parente peut ltrer ainsi:


protected void onActivityResult(int requestCode, int resultCode, Intent
data){
if (requestCode == 48)
Toast.makeText(this, "Code de requte rcupr (je sais d'ou je
viens)", Toast.LENGTH_LONG).show();
if (resultCode == 50)
Toast.makeText(this, "Code de retour ok (on m'a renvoy le bon code)",
Toast.LENGTH_LONG).show();}

J2ME

118
118

Solliciter dautres applications (1/4)

On utilise des objets Intent pour dmarrer des


activits (via le nom du type dactivit) au sein dune
mme application

Lenvoi dun Intent permet galement de demander


un composant dune autre application de traiter laction
souhaite.
Cest

le systme qui dcide alors de lapplication utiliser


Pour dcider du composant le plus appropri, le systme se
base sur les informations quon spcifie dans lobjet Intent :
action, donnes, catgorie, etc.

J2ME

119
119

Solliciter dautres applications (2/4)


Ainsi on exprime lintention au systme et le systme se
chargera de la rsoudre en proposant le composant de
lapplication le plus appropri.
Ce

mcanisme permet dviter les dpendances vers des


applications puisque lassociation entre lapplication et le composant
ncessaire se fait au moment de lexcution et non de la compilation.

Cette utilisation dIntent est implicite puisque le systme doit


rsoudre celle-ci en fonction de son environnement.
Il

recourt des filtres comme points dentre pour distribuer les


intents aux composants les plus appropris.
Les informations qui sont utilises pour la rsolution sont : laction,
les donnes (lURI et le type de contenu MIME) et la catgorie.
Les autres donnes ne jouent pas de rle dans la rsolution et la
distribution des Intent aux applications.
J2ME

120
120

Solliciter dautres applications (3/4)

Exemple : composer un numro de tlphone.


On

doit utiliser le type daction ACTION_DIAL permettant de


demander au systme de composer un numro.
Pour

pouvoir demander au systme de raliser cette action, on


cre un nouvel objet Intent dont le type daction et les valeurs
complmentaires sont spcifies dans le constructeur ; et cela
sans prciser le type de la classe cible.
Puis on dmarre une nouvelle activit en spcifiant cet objet
Intent. la charge du systme, en fonction des filtres dIntents
dclars par les applications, de dterminer quel composant
dune quelconque application envoyer cette demande daction.
Pour appeler un numro de tlphone, lintention envoyer au
systme sera compose dune action et dun URI comportant le
numro appeler.
J2ME

121
121

Solliciter dautres applications (4/4)


Le

systme dterminera quelle application ouvrir (par


dfaut linterface de composition de numro)
Code de lexemple:
Uri uri = Uri.parse("tel:74111111");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);

Un URI (Uniform ressource Identifier) est un


identifiant unique permettant didentifier une
ressource de faon non ambige sur un rseau.

J2ME

122
122

Ajouter des informations


Les Intents permettent de transporter des informations
destination de l'activit cible.
On

appelle ces informations des Extra


Les mthodes permettant de les manipuler sont getExtra et putExtra.

Lorsqu'on prpare un Intent et que l'on souhaite ajouter une


information de type "cl -> valeur", on procde ainsi:
Intent callactivity2 = new Intent(getApplicationContext(), Activity2.class);
callactivity2.putExtra("login", "jfl");

startActivity(callactivity2);

Du ct de l'activit recevant l'Intent, on rcupre l'information


de la manire suivante:
Bundle extras = getIntent().getExtras();
String s = new String(extras.getString("login"));
J2ME

123
123

Types d'Intent: actions

Le premier paramtre de construction de


l'Intent est le type de l'action vhicul par cet
Intent.
Ces

types d'actions peuvent tre les actions natives


du systme ou des actions dfinies par le dveloppeur.

Plusieurs actions natives existent par dfaut


sur Android. La plus courante est l'action
Intent.ACTION_VIEW qui permet d'appeler une
application pour visualiser un contenu dont on
donne l'URI.
J2ME

124
124

Types d'Intent: actions (suite)


Voici un exemple d'envoi d'email.
Dans ce cas o l'on utilise l'action native, il faut ajouter des
informations supplmentaires l'aide de putExtra:
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
String[] recipients = new String[]{"my@email.com", "",};
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, recipients);

emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Test");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Message");
emailIntent.setType("text/plain");
startActivity(Intent.createChooser(emailIntent, "Send mail..."));

finish();

Pour dfinir une action personnelle, il suffit de crer une chane


unique:
Intent monIntent = new Intent("andro.jf.nom_du_message");
J2ME

125
125

Types d'Intent: catgories

Les catgories d'Intent permettent de grouper les


applications par grands types de fonctionnalits (clients
emails, navigateurs, players de musique, etc...).
Par exemple, on trouve les catgories suivantes qui
permettent de lancer:
DEFAULT:

catgorie par dfaut


BROWSABLE: une activit qui peut tre invoque depuis un clic
sur un navigateur web, ce qui permet d'implmenter des
nouveaux types de lien, e.g. foo://truc
APP_MARKET: une activit qui permet de parcourir l'Android
market de tlcharger des applications
APP_MUSIC: une activit qui permet de parcourir et jouer de la
musique
126
J2ME

126

Diffuser des informations

Il est aussi possible d'utiliser un objet Intent pour


diffuser (broadcaster) un message but informatif.
Ainsi,

toutes les applications pourront capturer ce message et


rcuprer l'information.
La

mthode putExtra permet d'enregistrer une paire


cl/valeur dans l'Intent.
Intent broadcast = new Intent("andro.jf.broadcast");
broadcast.putExtra("extra", "test");
sendBroadcast(broadcast);

On peut rcuprer les donnes l'aide de la mthode


getExtras dans l'objet Bundle qui est dans l'Intent:
Bundle extra = intent.getExtras();
String val = extra.getString("extra");
J2ME

127
127

Recevoir et filtrer les Intents

Etant donn la multitude de messages vhiculs par


des Intents, chaque application doit pouvoir facilement
"couter" les Intents dont elle a besoin.
Android dispose d'un systme de filtres dclaratifs
permettant de dfinir dans le Manifest des filtres.
Un filtre peut utiliser plusieurs niveaux de filtrage:
action:

identifie le nom de l'Intent. Pour viter les collisions, il


faut utiliser la convention de nommage de Java
category: permet de filtrer une catgorie d'action (DEFAULT,
BROWSABLE, ...)
data: filtre sur les donnes du message par exemple en
utilisant android:host pour filtrer un nom de domaine particulier
J2ME

128
128

Filtrage d'un Intent par l'activit


En dclarant un filtre au niveau du tag activity, l'application
dclare les types de messages qu'elle sait grer et qui
l'invoquent.
<activity android:name=".Main" android:label="@string/app_name">
<intent-filter>
<action android:name="andro.jf.nom_du_message" />

<category android:name="android.intent.category.DEFAULT" />


</intent-filter>
</activity>

Ainsi, l'application rpond la sollicitation des Intents envoys


par:
Button autoinvoc = (Button)findViewById(R.id.autoinvoc);
autoinvoc.setOnClickListener(new OnClickListener() {
@Override

public void onClick(View v) {


Intent intent = new Intent("andro.jf.nom_du_message");
startActivity(intent);}});
J2ME

129
129

Utilisation de catgories pour le filtrage

Les catgories d'Intent permettent de rpondre des


vnements dans un contexte particulier.
L'exemple

le plus utilis est l'interception d'un clic lors d'une


navigation sur le web ou un protocole particulier est prvu.

Pour par exemple rpondre un clic sur un lien


http://www.isecs.rnu.tn, il faut construire un filtre d'Intent
utilisant la catgorie dfinissant ce qui est "navigable"
tout en combinant cette catgorie avec un type d'action
signifiant que l'on souhaite "voir" la ressource.

J2ME

130
130

Utilisation de catgories pour le filtrage (suite)

Il faut en plus utiliser le tag data dans la construction du filtre:


<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="www.isecs.rnu.tn"/>
</intent-filter>

L'attribut host dfinit l'URI de l'autorit (on vite ainsi


le fishing). L'attribut scheme dfinit la partie de gauche
de l'URI.
On peut ainsi lancer une activit lors d'un clic sur:
<a href="http://www.isimsf.rnu.tn">lien</a>
J2ME

131
131

Les messages natifs


Un certain nombre de messages sont diffuss par le SE:
ACTION_BOOT_COMPLETED:

diffus lorsque le systme a fini son boot


ACTION_SHUTDOWN: diffus lorsque le systme est en cours d'extinction
ACTION_SCREEN_ON / OFF: allumage / extinction de l'cran
ACTION_POWER_CONNECTED / DISCONNECTED: connexion / perte de
l'alimentation
ACTION_TIME_TICK: une notification envoye toutes les minutes
ACTION_USER_PRESENT: notification reue lorsque l'utilisateur
dverrouille son tlphone
...

D'autres actions permettent de lancer des applications tierces


pour dlguer un traitement:
ACTION_CALL

(ANSWER, DIAL): passer/rceptionner/afficher un appel


ACTION_SEND: envoyer des donnes par SMS ou E-mail
ACTION_WEB_SEARCH: rechercher sur internet
J2ME

132
132

Rception dintents par un Broadcast Receiver


Un broadcast receiver est un componsant qui reoit
et ragit des vnements appels intentions (Intents)
Beaucoup de ces vnements viennent du systme

Par exemple, la batterie est faible, Rseaux wifi


disponibles, tlchargement termin
Broadcast Receiver

Activity

Get incoming calls


Get incoming SMS

SMS

Tarak CHAARI

Android

Exemple dun BroadcastReceiver


package com.tuto.android;
public class SMSReceiver extends BroadcastReceiver
{
private final String
ACTION_RECEIVE_SMS =
"android.provider.Telephony.SMS_RECEIVED";
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(ACTION_RECEIVE_SMS))
{
Bundle bundle = intent.getExtras();
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];

Tarak CHAARI

Android

134

Exemple dun BroadcastReceiver


for (int i = 0; i < pdus.length; i++)
{ messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
Toast.makeText(context,
"Expediteur
:
"
+
messages[i].getDisplayOriginatingAddress(), Toast.LENGTH_LONG).show();
Toast.makeText(context, "Message : " + messages[i].getMessageBody(),
Toast.LENGTH_LONG).show();
}

Dans le manifest

Dclaration du Broad castReceiver


<receiver
class="com.tuto.android.SMSReceiver"android:name="com.tuto.android.SMSReceiver">
<intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Permissions ncessaires
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission. READ_SMS" />
Tarak CHAARI

Android

135

les Services et les contents providers

J2ME

136
136

Composants principaux : Les services


Un service est un composant qui na pas dinterface
graphique
Il tourne en tche de fond pour une priode
gnralement indtermine
Exemple: music player, Tlchargement, etc
Un service Android hrite de android.app.Service
La communication avec le service se fait laide du
langage AIDL (Android Interface Definition Language).
Notification

Media
Player
Activity
Tarak CHAARI

Communication
Pause/rewind
/stop/restart

Service
Background
running
for playback
Android

Cycle de vie dun service Android


Deux faons dutiliser un service
Le service peut tre dmarr ou arrt au besoin
Dmarrer

par Context.startService()
Arrter par Context.stopService()

Le service peut tre gr par le systme et appel

travers une interface AIDL


Le

serveur dmarre le service en utilisant Context.bindService()


Le service peut tre arrt en utilisant Context.unbindService()
Les clients tablissent des connexions au service pour lutiliser

Dclaration obligatoire dans le manifest

Tarak CHAARI

Android

Cycle de vie dun service Android (cont)

Tarak CHAARI

Android

Exemple dun service Android


package com.tuto.android;
public class MonPremierService extends Service
{
private LocationManager locationMgr = null;
private LocationListener onLocationChange
= new LocationListener()
{
public void onLocationChanged(Location location)
{
Toast.makeText(getBaseContext(),"coordonnes de votre tlphone : " + location.getLatitude()
+ " " + location.getLongitude(), Toast.LENGTH_LONG).show();
}
};
public void onCreate()
{
locationMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0,
onLocationChange);
super.onCreate();
}
Tarak CHAARI

Android

140

Exemple dun service Android (cont)


public void onDestroy()
{
super.onDestroy();
locationMgr.removeUpdates(onLocationChange);
}
}

Dans le manifest
Dclaration du service
<service android:name="com.tuto.android.MonPremierService"/>
Permissions ncessaires
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.LOCATION" />

Tarak CHAARI

Android

141

Composants principaux : Content Provider


Application
Activity

Activity

Application

Application

Activity

Content
Resolver

Service

Content
Resolver

Content
Provider

Content
Resolver

Data

SQLite

XML

Remote
Store

Un content provider (fournisseur de contenu) permet


de partager des donnes dune application dautres
applications.
Tarak CHAARI

Android

Composants principaux : Content Provider (Cont)


Lutilisation dun content provider est le seul moyen
pour partager des donnes entre des applications
Android
Un content provider est une extension de la classe de
base ContentProvider qui doit implmenter un
ensemble de mthodes standars (requte, ajout,
supression et mise jour)
Les applications nutilisent pas ces mthodes
directement
Elles doivent utiliser un ContentResolver pour intragir avec les

donnes
Un ContentResolver peut interagir avec nimporte quel content
provider.

Le contenu (les donnes) est identifi par un URI


Tarak CHAARI

Android

Ce support est disponible sur

www.redcad.org/members/tarak.chaari/
cours/cours_android.pdf

Tarak CHAARI

Android

144