2. Qu`est-ce que J2ME

publicité
Mohamed Quafafou
ESIL – Département Internet
Février 2007
Table de Matière
1.
2.
3.
Pourquoi J2ME ............................................................................................................... 2
Qu’est-ce que J2ME ....................................................................................................... 2
Les Outils de développement et de tests ........................................................................ 4
a. J2ME Wireless Toolkit 2.1....................................... Error! Bookmark not defined.
b. NetBeans IDE ........................................................... Error! Bookmark not defined.
4. La problématique multi-plateformes et multi-périphériques de Java............................ 4
5. CDC (Connected Device Configuration) ....................................................................... 5
6. CLDC (Connected Limited Device Configuration) ....................................................... 6
7. MIDP (Mobile Information Device Profile) .................................................................. 6
8. Les Midlets ..................................................................................................................... 7
9. L’interface Utilisateur .................................................................................................... 7
a. Présentation ................................................................................................................ 7
b. L'interface utilisateur de haut niveau ......................................................................... 8
c. L'interface utilisateur de bas niveau ........................................................................... 9
10.
Le stockage persistent .............................................................................................. 10
11.
Le réseau .................................................................................................................. 12
12.
Mon premier Midlet : « Hello IAAI » ...................................................................... 13
13.
Conclusion ................................................................................................................ 15
1
1. Pourquoi J2ME
Avec l’avènement des nouvelles technologies, la radio, la télévision, les satellites, les
téléphones cellulaires, la société actuelle est devenue une société de communication. La
communication, et particulièrement la diffusion d’informations, sont maintenant une étape
clef de tout les processus économiques. Parmi les médias permettant une diffusion efficace et
très large, l’informatique portable s’est placée en peu de temps au devant de la scène des
produits du progrès ayant un impact fort sur les habitudes de ses usagés, modifiant leur façon
d’agir, de conceptualiser le monde qui les entours. Chacun d’entre nous sollicite son portable
(téléphones, ordinateurs de poche, PDA) de plus en plus souvent pour des services divers et
variés. Dans ce contexte, les applications écrites pour les utilisateurs sont de plus en plus
complètes et complexes. Cependant, chaque nouveau système nécessite une réécriture de
l’application pour lui. De même, le langage de programmation de ces appareils n’est pas
suffisamment structuré ou formalisé pour permettre à leurs utilisateurs de faire eux même du
développement.
Mais, comment faire partager une structure unique aux différents constructeurs de systèmes
portables alors qu’ils se livrent à une guerre commerciale sans merci ? Quel système serait
suffisamment puissant, portable et efficace pour fédérer l’ensemble des développeurs. La
solution existe maintenant, il s’agit de J2ME.
2. Qu’est-ce que J2ME
J2ME signifie Java 2 Micro Edition. Il s’agit donc d’une version allégée de la machine
virtuelle JAVA, adaptée aux systèmes portables. On connaît principalement Java en tant
qu'environnement de programmation pour serveurs, centré autour des technologies qui ont
permis de réaliser Java 2 Enterprise Edition (J2EE), telles les Enterprise JavaBeans (EJBs),
les servlets, et les JavaServer pages (JSPs). Néanmoins, ce langage avait initialement été
conçu en tant qu'environnement pour applications "côté-client". En fait, Java avait été conçu
pour les appareils ménagers. Et maintenant, avec Java 2 Micro Edition Java retourne à ses
sources.
Le "Java" auquel on fait habituellement référence est connu plus formellement sous le nom de
Java 2 Platform. La Java 2 Platform est subdivisée en trois éditions : Java 2 Standard Edition
(J2SE), Java 2 Enterprise Edition (J2EE), et Java 2 Micro Edition (J2ME). Chaque édition de
cette plateforme fournit un environnement complet pour exécuter les applications basées sur
Java, incluant une machine virtuelle Java (Java virtual machine = JVM) et les classes
exécutables. Chacune de ces trois éditions cible des catégories différentes d'applications
exécutées par des types différents de machines. Les applications destinées aux "ordinateurs de
bureau" sont développées à l'aide de J2SE, qui fournit les classes d'interface utilisateur
nécessaires. Les applications destinées aux serveurs sont développées à l'aide de J2EE, qui
met l'accent sur la programmation basée sur les composants et le déploiement. Quant à J2ME,
il cible les ordinateurs de poche et les machines "embarquées".
2
En effet, les terminaux portable (téléphones cellulaires, Palm, etc…) imposent un certain
nombre de contraintes :
o La majorité des terminaux sans fil sont utilisés dans une main
o Petits écrans
o Tous les terminaux n’ont pas de terminal de pointage
o méthodes d'entrées alternatives
o Mémoire limité
o Processeur lent et architectures différentes
Ce qui différencie chacune des éditions, c'est donc principalement l'ensemble des
bibliothèques de classes définies au sein de chacune d'elles.
Organisation des plateformes JAVA
J2ME est un sous-ensemble de J2SE, et J2SE à un sous-ensemble de J2EE. On peut exécuter
le même code Java sur chacune des éditions, dès l'instant où les classes auxquelles le code fait
appel sont disponibles. Le noeud du problème, c'est que bien entendu les machines qui
fonctionnent avec J2ME, en particulier les plus petites, disposent de moins de classes que
J2SE et J2EE peuvent en fournir. Les diverses spécifications qu'incluent J2ME sont toutes
définies au travers du Java Community Process (JCP), comme cela est fait pour J2SE et J2EE.
3
3. Outils de développement et de tests
Le J2ME Wireless Toolkit de SUN comprend un ensemble d’outils permettant aux
développeurs d’applications de bénéficier d’un environnement
d’émulation, d’une
documentation ainsi que des exemples de la technologie JAVA J2ME. En effet, il n’est pas
nécessaire de posséder un appareil supportant le J2ME pour développer et expérimenter ses
applications personnels : un téléphone portable virtuel est alors émulé. Des exemples
d’applications (Midlet) livrées sont directement expérimentables.
4. La problématique multi-plateformes et multi-périphériques de
Java
Java 2 Micro Edition est une architecture technique dont le but est de fournir un socle
de développement aux applications embarquées. L’intérêt étant de proposer toute la
puissance d’un langage tel que Java associé aux services proposés par une version
bridée du Framework J2SE : J2ME. Les terminaux n’ayant pas les mêmes capacités en
terme de ressources que les ordinateurs de bureau classiques (mémoire, disque et
puissance de calcul), la solution passe par la fourniture d’un environnement allégé afin de
s’adapter aux différentes contraintes d’exécution. Cependant, comment faire en sorte
d’intégrer la diversité de l’offre à un socle technique dont la cible n’est pas définie à priori
? La solution proposée par J2ME consiste à regrouper par catégories certaines familles de
produits tout en proposant la possibilité d’implémenter des routines spécifiques à un
terminal donné. L'architecture J2ME se découpe donc en plusieurs couches :
Les profiles : Ils permettent à une certaine catégorie de terminaux d’utiliser des
caractéristiques communes telles que la gestion de l’affichage, des évènements
d’entrées/sorties (pointage, clavier, …) ou des mécanismes de persistance (Base de
données légère intégrée). Ces profiles sont soumis à spécifications suivant le principe du
JCP (Java Community Process)
Les configurations : Elles définissent une plate-forme minimale en terme de services
concernant un ou plusieurs profiles donnés.
Les machines virtuelles : En fonction de la cible, la machine virtuelle pourra être
allégée afin de consommer plus ou moins de ressources (KVM, CVM, …)
4
Le système d’exploitation : L’environnement doit s’adapter au système d’exploitation
existant
(Windows
CE,
Palm
Os,
SavaJe,
…)
Cette architecture en couche a pour but de factoriser pour des familles de produits
données un ensemble d’API permettant à une application de s’exécuter sur plusieurs
terminaux sans modification de code. Dans cette optique, la plate-forme propose deux
configurations :
CDC (Connected Device Configuration) : Spécifie un environnement pour des
terminaux connectés de forte capacité tels que les « set top boxes », les téléphones à
écran, la télévision numérique, …
CLDC (Connected Limited Device Configuration) : Cible les périphériques à
ressources limitées ou faibles tels que les téléphones mobiles, les assistants personnels,
ou les périphériques légers sans fil (wireless)
Voyons de plus près les contraintes en terme de ressources imposées par ces deux
configurations.
5. CDC (Connected Device Configuration)
Les caractéristiques de l’environnement matériel proposé par la configuration CDC sont :
Minimum de 512Ko de ROM et 256Ko de RAM, processeur 32 bits
Une connexion réseau obligatoire (sans fil ou pas)
Support des spécifications complètes de la machine virtuelle Java (CVM)
Cette configuration s’inscrit donc dans le cadre d’une architecture Java presque complète.
5
6. CLDC (Connected Limited Device Configuration)
Cette configuration s’adresse aux terminaux légers tels que les téléphones mobiles ou les
assistants personnels. Ces périphériques étant limités en terme de ressources,
l’environnement classique ne permet pas de respecter les contraintes d’occupation
mémoire liée à ces appareils. J2ME définie donc un ensemble d’API spécifiques à CLDC et
destinées à utiliser les particularités de chaque terminal d’une même famille (profile).
La liste suivante résume l’ensemble de ces caractéristiques :
Minimum de 160Ko à 512Ko de RAM, processeur 16 ou 32 bits, vitesse 16Mhz ou plus
Alimentation limitée, prise en charge d’une batterie
Connexion réseau non permanente, sans fil.
Interface graphique limitée ou inexistante
Cette configuration est définie par un sous-ensemble de classes Java s’exécutant dans la
KVM (KiloByte Virtual Machine). Elle s’inscrit donc dans une logique d’économie de
ressources avec une KVM de 40 à 80 Ko s’exécutant 30 à 80% moins vite qu’une JVM
normale. Il n’y aucun compilateur Just-In-Time ni même de prise en charge des nombres
flottants. Quant au Multi-threading et au Ramasse miettes, ils demeurent supportés.
Toutefois, CLDC n’intègre pas la gestion des interfaces graphiques, la persistance ou
les particularités de chaque terminal. Ces aspects ne sont pas de sa responsabilité. Le
tableau suivant résume les packages et classes présentes dans cette couche :
Liste des packages de CLDC
Java.io
Fournit la gestion des flux d’entrées/sorties
Java.lang
Classes de base du langage (types, etc.)
Java.util
Contient les collections et classes utilitaires
Javax.microedition.io
Classes permettant de se connecter via TCP/IP
7. MIDP (Mobile Information Device Profile)
MIDP est à la base de l’implémentation des classes liées à un profile donné. On y trouve
les méthodes permettant de gérer l’affichage, la saisie utilisateur et la gestion de la
persistance (base de données). Il existe aujourd’hui deux implémentations majeures de
profiles MIDP. L’une, plus spécifique, destinée aux Assistants de type Palm Pilot
(PalmOs) et l’autre, totalement générique, proposée par Sun comme implémentation de
référence (RI). Ces profiles sont en libre téléchargement sur le site de Sun et intègrent
plusieurs émulateurs permettant de tester les applications de manière logicielle. Les API
liées à MIDP font aussi partie de ce package :
Liste des packages de CLDC
javax.microedition.lcdui
Fournit la
gestion
(contrôles, etc.)
de
l’interface
utilisateur
javax.microedition.midlet
Socle technique destiné à gérer le cycle de vie des
midlets
6
javax.microedition.rms
Base de données persistante légère
L’API lcdui est chargée de gérer l’ensemble des contrôles graphiques proposés par ce
profile.
Quant à la gestion des événements, elle suit le modèle des listeners du J2SE avec un
CommandListener appelé en cas d’activation d’un contrôle. Pour finir, io et rms, eux,
fournissent les routines nécessaires aux entrées/sorties réseau et à la prise en charge
d’une zone physique de stockage.
8. Les Midlets
Les Midlets sont l'élément principal d'une application Java embarquée. Pour bien saisir
leur mode de fonctionnement, il suffit de prendre comme analogie les Applets ou les
Servlets.
Le cycle de vie d’une Applet est géré par un conteneur, en l’occurrence le Navigateur
Web, dont le rôle est d’interagir avec celle-ci sous la forme de méthodes de notifications
prédéfinies (init(),paint(),destroyed(),…).
Une servlet possède les mêmes caractéristiques qu’une Applet excepté le fait que le
conteneur est un moteur de servlet (Tomcat, WebSphere, WebLogic, …).
Quant aux Midlets, ils représentent le pendant des Applets et des Servlets pour J2ME
avec comme conteneur votre téléphone mobile ou votre assistant personnel. Ainsi, en cas
de mise à jour d’une application embarquée, un simple téléchargement de code Midlet
est nécessaire à partir d’un quelconque serveur.
De cette manière, un programme développé pour un profile donné est en mesure de
s’exécuter sur tous les périphériques correspondant à cette famille. C’est aussi une
manière de découpler le socle technique des applicatifs puisque le seul lien existant entre
les logiciels embarqués et le terminal est l’API J2ME.
9. L’interface Utilisateur
a. Présentation
MIDP est conçu pour fonctionner sur de nombreux types de terminaux : téléphones, Palm
Pilot, etc. Or la plupart de ces terminaux sans fil sont utilisés dans la main, disposent d'un
petit écran et tous ne possèdent pas de système de pointage comme un stylo.
Tout en respectant ces contraintes, les applications MIDP doivent intégrer toujours les mêmes
fonctionnalités quelque soit le terminal. La solution a été de décomposer l'interface utilisateur
en deux couches : l'API de haut niveau et celle de bas niveau.
La première favorise la portabilité et la seconde l'exploitation de toutes les fonctionnalités du
terminal. Le concepteur doit donc faire un compromis entre portabilité et bénéfice des
particularités du terminal.
L'API de bas niveau donne accès direct à l'écran du terminal et aux événements associés aux
touches et système de pointage. Aucun composant d'interface utilisateur n'est disponible : on
doit explicitement dessiner chaque composant, y compris les commandes.
7
L'API de haut niveau fournit quant à elle des composants d'interface utilisateur simples. Mais
aucun accès direct à l'écran ou aux événements de saisie n'est permis. C'est l'implémentation
MIDP qui décide de la manière de représenter les composants et du mécanisme de gestion des
saisies de l'utilisateur.
Il est possible d'utiliser l'API de haut niveau et l'API de bas niveau dans un même MIDlet
mais pas simultanément. Par exemple, les jeux qui utilisent l'API de bas niveau pour contrôler
l'écran peuvent aussi utiliser l'API de haut niveau pour afficher les meilleurs scores. L'API de
bas niveau peut aussi être utilisée pour tracer des graphes.
b. L'interface utilisateur de haut niveau
Cette API est de loin plus riche en classes que l'API de bas niveau. Le premier composant est
la liste déroulante présentant un menu d'options. Les classes correspondantes sont List et
ChoiceGroup. Elles implémentent toutes deux l'interface Choice.
La classe TextBox permet à l'utilisateur de saisir du texte. Des contraintes de saisie peuvent
être spécifiées.
La classe Alert met en place une alerte. C'est une boîte de dialogue affichant un message
textuel, éventuellement accompagné d'une image ou d'un son. Elle permet ainsi d'afficher un
avertissement, une erreur, une alarme, … Pendant cet affichage, l'interface utilisateur est
désactivée. Si une valeur de timeout a été spécifiée, l'alerte disparaît ensuite automatiquement,
sinon l'application attend une action de l'utilisateur.
La classe Form est un formulaire. Il contient un ensemble d'éléments (items) comme des
textes, des listes ou des images. Un Item correspond à un composant de formulaire. Il est
accompagné d'un libellé. Un ImageItem affiche une image, un StringItem un texte que
l'utilisateur ne peut pas modifier.
La classe Gauge définit une jauge. Cette dernier permet d'afficher un graphique sous forme
de barre dont la longueur correspond à une valeur comprise en zéro et un maximum.
DateField définit une zone de date modifiable.
TextField est un champ de texte permettant la saisie de texte. Il est similaire en plusieurs
points à TextBox. La différence est que TextBox est une sous-classe de Screen et peut donc
être placé directement sur le Display tandis que TextField est une sous-classe de Item et doit
donc être placé dans un Form pour être affiché.
Un Ticker est un composant de l'interface utilisateur affichant une ligne de texte défilante à
une certaine vitesse.
La dernière classe est la classe Command. Elle permet de définir une commande, l'équivalent
du bouton de commande de Windows. Cette classe intègre des informations sémantiques sur
une action. Elle possède trois propriétés : le libellé, le type de commande (exemple : retour,
8
annulation, validation, sortie, aide, …) et le niveau de priorité (qui définit son emplacement et
son niveau dans l'arborescence des menus).
La gestion des événements
Un événement de haut niveau est constitué de la source de l'événement et du listener
d'événement. Cet événement provient de la source pour arriver au listener qui traite alors cet
événement. Pour implémenter un listener, il suffit que la classe l'enregistre auprès du
composant duquel on veut écouter les événements.
Il existe deux types d'événement : l'événement Screen avec son listener correspondant
CommandListener d'une part, l'événement ItemStateChanged avec le listener
ItemStateListener d'autre part.
L'une des différences est que la source d'un événement Command peut être tout objet
affichable (Displayable) tandis que la source d'un événement ItemStateChanged ne peut être
qu'un objet Form.
CommandListener
Le traitement associé à une action effectuée sur une commande est effectué dans une interface
CommandListener. Cette interface définit une méthode, commandAction, qui est appelée si
une commande est déclenchée.
Le listener correspondant est mis en place en implémentant l'interface CommandListener. On
doit alors enregistrer cette dernière avec la méthode setCommandListener
(CommandListener myListener).
ItemStateListener
Toute modification interactive de l'état d'un élément de formulaire déclenche un événement
itemStateChanged (exemple : modification d'un texte, sélection d'un élément d'une liste, …).
Le listener correspondant est mis en place en implémentant l'interface ItemStateListener. Il
faut alors enregistrer l'objet ItemStateListener auprès d'un formulaire Form avec la méthode
setItemStateListener (ItemStateListener myListener).
c. L'interface utilisateur de bas niveau
Cette API comprend les classes Canvas, Graphics et Font. La classe Canvas permet d'écrire
des applications pouvant accéder aux événements de saisie de bas niveau, offrant ainsi un
grand contrôle sur l'affichage. Les jeux sont la meilleure illustration du type d'application qui
utilisera ce mécanisme.
Elle comprend également la classe Graphics. Elle permet de produire des graphiques en 2D.
Elle est similaire à la classe java.awt.Graphics de J2SE.
9
La classe Font représente les polices de caractères ainsi que les métriques associées.
La gestion des événements
La classe Canvas est une sous-classe de la classe Displayable. Elle permet d'enregistrer un
listener de commandes.
Il est cependant préalablement nécessaire de créer plusieurs interfaces listener, chacune étant
associée à un type d'événement.
Les touches
Chaque touche à laquelle un événement est associé est identifiée par un code de touche
(exemple : KEY_NUM0 pour la touche 0).
Il existe trois types de méthodes de gestion des événements relatifs à ces touches :
keyPressed(), keyReleased() et keyRepeated(). Attention, ce dernier événement n'est pas
supporté par tous les terminaux. Pour savoir s'il est supporté, if faut appeler la méthode
hasRepeatEvents().
Les actions de jeu
Des actions de jeu sont prédéfinies. Ces actions correspondent par exemple aux flèches de
déplacement (exemple : DOWN correspond à la touche pour descendre).
Les commandes
Comme avec les sous-classes de la classe Displayable, on peut ajouter des commandes à un
objet Canvas et enregistrer un CommandListener auprès de l'objet Canvas.
La gestion du pointeur
Sur certains terminaux, un pointeur peut être utilisé pour appuyer sur l'écran. Trois
d'événements sont mis à votre disposition : pointerDragged(),pointerPressed() et
pointerReleased(). Pour vérifier qu'un tel mécanisme est disponible sur le terminal sur lequel
tourne le MIDlet, utilisez cette méthode : hasPointerEvents().
10.
Le stockage persistent
10
RMS (Record Management System) est une API de stockage persistent sur le terminal. C'est
en quelque sorte une base de données indépendante du terminal. Chaque enregistrement est
représenté sous forme de tableau d'octets. La mise est jour est dite atomique : l'enregistrement
entier est réécrit à chaque fois.
Les enregistrements sont stockés dans ce que l'on appelle un Record store. Si l'on veut faire
un parallèle avec les SGBD relationnels, RMS correspond au SGBD lui-même et le Record
store à la table. D'ailleurs, le parallèle de la notion de clé primaire des bases de données
relationnelles est le recordID. Il s'agit de l'identifiant de l'enregistrement. C'est un nombre
entier. La valeur de l'ID du premier enregistrement est 1 et chaque nouvel enregistrement a
une valeur ID augmentée de un.
Plusieurs méthodes permettent de gérer les Records store :
openRecordStore et closeRecordStore permettent respectivement d'ouvrir et de fermer un
Record store.
La liste de tous les Record
deleteRecordStore en supprime un.
store
peut
être
obtenue
par
listRecordStore.
Le nombre d'enregistrements dans un Record store est retourné par getNumRecords.
Les opérations de base sur les enregistrements sont assurées par ces méthodes : addRecord
(ajout), deleteRecord (suppression), getRecord (lecture), setRecord (modification),
getRecordSize (taille de l'enregistrement).
L'API RMS dispose cependant de quelques particularités supplémentaires, concernant la
sélection des enregistrements. La première est l'utilisation de la méthode
RecordEnumeration pour lister tous les enregistrements du Record store. La seconde est la
possibilité de définir un filtre avec la méthode RecordFilter. Enfin, l'interface
RecordComparator doit être implémentée pour que des enregistrements puissent être
comparés et donc triés.
11
11.
Le réseau
Présentation
Avec plus de 100 classes, l'API de J2EE dédiée au réseau, aux entrées / sorties et au stockage
est beaucoup trop lourde que celle utilisée pour les terminaux CLDC.
Elle est remplacée dans la CLDC par le GCF (Generic Connection Framework).
Le GCF assure une plus grande cohérence entre les différents types d'entrées / sorties tout en
améliorant la portabilité des applications.
Le GCF
Le GCF fournit un moyen uniforme et pratique d'effectuer des entrées / sorties quelque soit le
type de protocole. La syntaxe générale est la suivante :
Connector.open("<protocole>://<adresse>:<parametres>");
Plusieurs protocoles sont utilisables. On peut par exemple lire un fichier en passant par le
système de gestion de fichier du terminal :
Connector.open ("file://monfichier.txt");
Le plus fréquent sera probablement d'utiliser le célèbre protocole HTTP. Ainsi, on peut
télécharger la page d'accueil du site Yahoo :
Connector.open ("http://www.yahoo.fr");
Pour créer une application du type peer 2 peer, on pourra utiliser les sockets :
Connector.open ("socket://www.monsite.com:8001");
On peut également contrôler l'éventuel port série du terminal :
Connector.open("comm://9600:18N");
HttpConnection
Il faut cependant savoir que la seule obligation de l'implémentation MIDP est d'implémenter
le protocole HTTP. Les autres protocoles ne sont donc pas obligatoirement disponibles sur le
terminal.
MIDP complète le GCF avec HttpConnection, qui comprend les méthodes classiques.
12
getRequestProperty et setRequestProperty permettent d'obtenir ou de spécifier des
propriétés d'une requête.
getRequestMethod et setRequestMethod retournent et modifient le type de la méthode de la
requête : Get, Post ou Head.
getResponseCode et getResponseMessage retournent respectivement le code d'état renvoyé
par le serveur et le libellé associé.
getHeaderField permet d'obtenir la valeur d'un champ figurant dans les entêtes HTTP.
getURL retourne l'URL.
12.
Mon premier Midlet : « Hello IAAI »
La procédure de création, d’installation et d’exécution d’une application MIDP est
différente de celle utilisée pour une application Java standard. On va donc examiner la
structure d’une application MIDP à travers un exemple, HelloMIDlet, dont voici le listing :
/**
* <p>Title: HelloMIDlet</p>
* <p>Description: Premi`ere MIDlet semblable un "Hello World"</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author Mesud HASANOVIC et Lucas PRETRE
* @version 1.0
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloMIDlet extends MIDlet implements CommandListener {
private Display affichage;
private TextField champTexteHello;
private Command boutonQuitter;
private Form formPrincipal;
public HelloMIDlet() {
// Retourne l’objet Display unique cette MIDlet
affichage = Display.getDisplay(this);
// Crée le form principal
formPrincipal = new Form("HelloMIDlet");
// Crée le bouton de commande pour quitter
boutonQuitter = new Command("Quitter", Command.SCREEN, 1);
// Crée un champ texte d’une ligne et de 15 caractères de long
// avec un étiquette (label) "Texte"
champTexteHello = new TextField("Texte", "Hello World!", 15, TextField.ANY);
// Ajoute les composants un form et met en place
// l’écouteur d’évènements
formPrincipal.addCommand(boutonQuitter);
formPrincipal.append(champTexteHello);
formPrincipal.setCommandListener(this);
}
public void startApp() {
// S´electionne affichage comme objet visible
affichage.setCurrent(formPrincipal);
}
public void pauseApp(){/*L’application va être mise en pause*/}
public void destroyApp(boolean unconditional) {/*L’application se termine*/}
public void commandAction(Command c, Displayable s) {
// Si on "clique" sur le bouton quitter
if (c == boutonQuitter) {
// La m´ethode destroyApp() doit ˆetre appel´ee manuellement
destroyApp(false);
// Demande au gestionnaire d’application de terminer l’application
notifyDestroyed();
}}}
13
Cet exemple est le traditionnel Hello World ! adapté pour les MIDlets. Comme on peut le
constater, deux paquetages sont importés : javax.microedition.midlet et javax.microedition.
lcdui. Le premier paquetage comporte la classe de base MIDlet de l’application MIDP et le
second fournit un ensemble d’éléments “interface utilisateur” de type Swing.
HelloMIDlet hérite de la classe de base MIDlet. Cette dernière propose trois méthodes
abstraites dont le gestionnaire d’applications de l’appareil se sert pour communiquer avec les
applications qu’il exécute. La méthode startApp() est appelée immédiatement après le
constructeur et à chaque fois qu’une application est activée (et non pas seulement lors de son
lancement initial !). Une application peut passer de l’état actif l’état inactif plusieurs fois au
cours d’une même exécution ; par conséquent il n’est pas judicieux d’y placer des instructions
d’initialisation (ne devant être exécutée qu’une seule fois). Ce genre d’instructions est bien
évidemment à placer dans le constructeur.
La méthode destroyApp() est appelée par le gestionnaire pour indiquer qu’une application
est sur le point de se fermer. Contrairement startApp(), cette méthode ne sera appelée qu’une
seule fois au cours de l’exécution d’une application ; on peut donc y inclure du code de
nettoyage. Vu que la spécification de la CLDC n’inclut pas la méthode finalize() pour les
objets, il faudra effectuer le nettoyage ici. Cependant, un appareil mobile est généralement
moins stable que la plate-forme standard et sera donc régulièrement éteint ou réinitialisé par
l’utilisateur. En conséquence, on ne peut pas compter sur le fait que la méthode destroyApp()
soit exécutée.
La troisième et dernière méthode abstraite, pauseApp() est à première vue étrange. Son
objectif est de signaler que l’application va se mettre en pause. Cet événement se produit
lorsque l’utilisateur passe une autre application ou se sert d’une fonction de l’appareil qui
empêche la poursuite de l’exécution de l’application. Comme la plupart des appareils n’ont
pas la puissance nécessaire pour être réellement multitâche, une application sera dans ce cas
14
de figure. Il faut donc veiller à libérer un maximum de ressources au sein de cette méthode. A
la reprise de l’application, le gestionnaire appellera la méthode startApp().
13.
Conclusion
J2ME (Java 2 Micro Edition) met à la porté des systèmes portables la puissance et la
modularité de la programmation JAVA et ce de façon adaptée aux caractéristiques des
terminaux embarqués :
- petits écrans
- architecture variable
- dispositifs d’entrée multiples
- processeur lent
- mémoire réduite
Il permet :
- de fédérer les constructeurs autour d’une plateforme unique
- la facilité d’utilisation et d’échange de programmes (code portable), propre au
langage JAVA
- de développer des applications complexes et modulaires
- aux utilisateurs de développer leurs propres applications
Cette technologie émergente prendra une importance de plus en plus grande sur le marché des
systèmes portatifs (en particulier celui des téléphones portables). Il va sans dire que cette
technologie sera un plus important pour tout système compatible et par là, un argument
commercial indiscutable.
15
Téléchargement