martes, 27 de abril de 2010

Iniciación a J2ME Parte I

Introducción a J2ME

Antes comenzar a programar, es interesante, aunque no necesario, conocer ciertos conceptos relacionados con java y su versión microedtion (J2ME).

Configurations
Configuración es una especificación que cubre una gama de equipos con características similares, en ella se define las clases mínimas que esos equipos pueden usar. Define los requerimientos del VM (Virtual Machine: intérprete de java) y de las clases principales.
Para J2ME CLDC y CDC. Sun ha desarrollado KVM y CVM para CLDC y CDC respectivamente, CLDC es la que nos interesa a nosotros. El Nokia 6600 posee una nueva version de VM (intérprete de Java) que
hace que muchos de los programas que funcionan en versiones anteriores de Series 60 no funcionen en este modelo.

CLDC
Connected Limited Device Configuration que cubre las necesidades de pequeños aparatos con limitadas posibilidades en cuanto a interfaz de usuario, poder de proceso, etc etc.
Esta configuración posee la K Virtual Machina, un interprete de java preparado para microprocesadores de 16 y 32 bits RISC/CISC con tan solo unos pocos cientos de Kb de memoria.
Debido a esto, CLDC no incluye ciertos tipos de clases, por ejemplo en la versión 1.0 no se pueden usar números float.
Las clases obtenidas de la versión de J2SE son:
  • java.lang.*
  • java.io.*
  • java.util.*
Nuevas clases son:
  • java.microedition.io.*
Importante: El verificador de J2SE es demasiado grande para ser incluido con el CLDC, de hecho es mas grande que el KVM, por lo cual debemos verificar los archivos antes de mandarlos al equipo donde queremos que se ejecuten. Para esta tarea, los SDKs poseen herramientas que nos ayudaran en su proceso y no será necesario realizarlo manualmente.
Profiles
Un perfil es una especificación de las APIs de java, que funciona en conjunción de la capa de configuración. Añaden nuevas clases a las que venían con la configuración.
Hay muchos perfiles, pero los mas importantes en referencia a J2ME son Personal Profile, Foundation Profile y MID Profile.
MIDP
Este perfil esta diseñado para funcionar especialmente con CLDC.
Las clases que contiene son:
  • javax.microedition.midlet: se ocupa del ciclo de vida de la aplicación
  • javax.microedition.lcdui: interfaz de usuario
  • javax.microedition.rms: sistema de mantenimiento de registros (Record Management System) usado para guardar información
  • javax.microedition.io: clases para usar redes
  • java.lang: clases de lenguaje
  • java.util: clases de utilidades
Arquitectura del MIDP
Ciclo de vida del MIDP
El ciclo de vida de un MIDP esta muy bien definido ya que ayuda al MIDlet a coexistir con otros programas en el MIDP. Las fases del ciclo de vida son:
  • Retrieval
  • Installation
  • Launching
  • Version Management
  • Removal
Retreival
El teléfono consigue la aplicación desde la fuente, puede ser vía IRDA, Bluetooth o Internet. En este momento el MIDlet y MID establecen una comunicación para intercambiar información sobre el sistema y la aplicación y decidir así si se procede a instalarlo o no.
Installation
La aplicacion se instala en el MID. La implementación de MIDP verifica que el nuevo MIDlet no viola la seguridad de MID.
Launching
El usuario ejecuta la aplicación. En esta fase, el MIDlet se ejecuta en la KVM y los métodos de ciclos de vida del MIDlet son ejecutados.
  • MIDlet Instance creation – Paused
  • MIDlet initialization – Active
  • MIDlet termination – Destroyed
Version management
El teléfono mantiene una base de datos sobre que programas han sido instalados y su versión. Así, usando la descripción (descriptor) del MIDlet puede ser actualizado si aparece una nueva versión
Renoval
El MIDlet es borrado del teléfono.
Aplicaciones MIDP: MIDlets
Un MIDlet es una aplicación escrita especialmente para el perfil MIDP de J2ME.
Hay muchos conceptos básicos que serian importantes conocer para familiarizarse con los MIDlets, como son el ciclo de vida, interfaz de usuario, instalación, timers, redes, etc.
Ciclo de vida de un MIDlet

Ciclo de vida de un MIDlet
  • startApp()


    • método setCurrent() debería ser llamado aquí si no fue llamado antes. setCurrent() define que display será visible al usuario, solo un display puede ser visible al mismo tiempo.
    • Puede ser ejecutado mas de una vez, así que es mejor no poner ninguna inicialización aquí
  • pauseApp()


    • cuando una aplicación es reactivada, puede aparecer con otro display usando el método setCurrent()
  • destroyApp()


    • libera y destruye todos los recursos usados por la aplicaciones, incluidos los componentes del interfaz de usuario
Estos tres métodos tienen que aparecer siempre.
Aplicación mínima
import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet {
public void startApp() {
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}
El mítico programa Hello World
// como en J2SE pero con las APIs de J2ME

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class HelloMIDlet extends MIDlet implements CommandListener {
private Command exitCommand;
private Display display;

// declaración de los objetos usados en el programa

public HelloMIDlet() {
display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.SCREEN, 1);
}

// Comenzamos el MIDlet creando una TextBox y asignando
// el exitCommand y el Listener a el TextBox

public void startApp() {
TextBox t = new TextBox("Hello MIDlet", "Hello World!!!", 256, 0);
t.addCommand(exitCommand);
t.setCommandListener(this);

display.setCurrent(t);
}

// en este caso no usamos pauseApp() porque no hay
// actividades en backgroud

public void pauseApp() { }

// todo lo que no es tratado por el Garbage Collector
// tiene que ser destruido aquí, en este caso, nada

public void destroyApp(boolean unconditional) { }

// ejecuta los commandos a los cuales se les ha asignado
// un Listener, en este caso solo el exitCommand
// recibe el commando y el display (puede haber dos displays
// con el mismo comando pero que hagan cosas distintas)

public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);

notifyDestroyed();
}
}
}

No hay comentarios:

Publicar un comentario