Le J2Me : Java for Mobile Application

MIDLET's

Le Midlet est le coeur d'un programme J2ME. il, peut est comparé au "main" en c ou en J2SE classiquen sauf qu'il s'agit d'une classe entière.

Le MIDLET

La midlet est l'application lancée sous le contrôle du "Application Management Software".

Ce dernier est lancée sous controle de du Runtime de MIDP. L'AMS est donc en charge de la duirée de vie et de l'execution de toute applet.

On notera ainsi que chaque MIDLET (et tout programme J2ME hérite de MIDLET) doit implémenter 3 méthodes, qui seront controlées par l'AMS:

Exemple de MIDLET classique : le HelloWorld :

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloWorld extends MIDlet {
     private Display myDisplay;

     public HelloWorld() {

     }


     public void startApp() throws MIDletStateChanged {
          // first run, create forms
          myDisplay = Display.getDisplay( this );
          myDisplay.setCurrent(new Form("Hello World"););

     }

     public void pauseApp() {
     }

     public void destroyApp(
     }
}  

 

Dans l'exemple de code précédent, lze programme affiche un "formulaire" ayant pour titre Hello World. Cet exemple a pour but de faire percevoir les principes du MIDLET.

La manipulation graphique

Une midlet active a normalement accès à l'écran. Celui ci est représenté par la classe Display et l'unique instance de cette classe est obtenue en appelant Display.getDisplay(m) où m est la midlet comme dans l'exemple précédent. Il peut ainsi etre compéré à la Frame d'un porgramme Java.

Cependant ce display peut être manipulé sous deux formes :

Les listeners:

Les boutons doivent être enregistrés aupres d'une classe implémentant l'interface CommandListener. Une fois déclaré (1), le bouton douit etre ajouter dans le pool du CommandListener (2).

L'appel du bouton utilise la méthode commandAction de l'interface (qui aura été détaillé) pour définir l'action a faire en fonction du bouton appelé(3). Ci dessous un exemple :

public class HelloWorld extends MIDlet implements CommandListener{


 form = new Form("HelloWorld");

 ...


 exitButton = new Command("Exit", Command.SCREEN,1); // 1
 form.addCommand(exitButton); // (2)

 public void commandAction(Command c, Displayable s)    {   //3
   // verifie le bouton
   if (c == exitButton)      {
		.../
 }
}

 

Une commande (Command) encapsule à la fois le nom (ce qui est affiché), le type (intention de la commande comme BACK, CANCEL, OK) et la priorité d'une action.

 

L'utilsation des flux

Les objets permettant les entrées/sorties en MIDP sont des sous classes de la classe Connection. Ils sont créés par la méthode Connector.open et dépendent de l'argument URL passé. En particulier le type de connexion dépend du schéma de l'URL :

Si l'URL n'a pas de nom de machine, il s'agit d'un port en réception. Les arguments de configuration peuvent être passés comme arguments des URLs. Par exemple :

DatagramConnection dc = (DatagramConnection) Connector.open("datagram://:1024");

 

ouvrira un datagramme sur le port 1024 en réception, alors que :

HttpConnection http = (HttpConnection) Connector.open ("http://etudiant.univ-mlv.fr/~jfontera/j2me.txt");

Ouvrira une connexion sur une url donnée.

Les différents types possibles de connexion (liste exhaustive de par l'existence de flux proprietaires):

file ; http(s) ; datagram , socket sms, apdu.

Notons également, que MIDP 2.0 apporte de nouveau types de connexion en natif : sms, btl2cap pour le bluetooth

 

La persistence

Le stockage persistant est un endroit non-volatile pour stocker l'état d'objets. Sans stockage persistant, des objets et leurs états sont détruits quand une application se ferme.

la persistance, et est manipulé dans MIDP par RMS (système de gestion des registres).

Ce mécanisme est une base de données simple appelée Record Management System (RMS). Une base de données de MIDP se compose d'une collection d'enregistrements qui demeurent persistants après les sorties de MIDlet.

Ce mécanisme est implémenté dans le package javax.microedition.rms .

La création d'un flux se fait simplement :

RecordStore db = RecordStore.openRecordStore("myDBfile", true); 

 

Il suffit ensuite d'opérer les actions souhaitées sur le flux en question :

Exemple de lecture:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeUTF(record);
byte[] b = baos.toByteArray();
db.addRecord(b, 0, b.length);

Exemple d'écriture :

ByteArrayInputStream bais = new  ByteArrayInputStream(db);
DataInputStream dis = new  DataInputStream(bais);
String in = dis.readUTF();

 

 

Un exemple : les sms

Comme expliqué, les flux réseau sont gérés par le J2Me. La seule contrainte sera l'opportunité laissée au terminal d'avoir accès aux ressources.

Voyons ici un exemple simple d'envoie de sms.


On ouvre en premier lieu la connexion sur le terminal :

MessageConnection  sms_con=(MessageConnection)Connector.open("sms://"+telNumber+":"+smsPort);



Puis on ecrit le message dans le flux ouvert :

TextMessage sms=(TextMessage)sms_con.newMessage(MessageConnection.TEXT_MESSGE);
sms.setAddress(tel+":"+smsPort);
sms.setPayloadText("I love you");


Enfin on envoie le SMS :


     sms_con.send(sms);
     sms_con.close();

Note : il est possible de connaitre le port par défaut (ici smsPort ) avec la commande :

     String smsPort = getAppProperty("SMS-Port");

 

ici un exemple d'automate wap.