You are on page 1of 32

Tutorial: Herramientas de programacin JAVA de dispositivos mviles

Versin: 1.0, Septiembre, 2006


Autor: Manuel Gmez Olmedo
Web: http://decsai.ugr.es/~mgomez, Mail: mgomez@decsai.ugr.es

(C) Dpto. de CCIA


Web: http://decsai.ugr.es

Introduccin
En este tutorial se inicia al alumno en el uso de la herramienta KToolbar, una de las herramientas disponibles para la realizacin de aplicaciones para dispositivos mviles. En ella, una vez escrito el cdigo fuente, puede crearse un proyecto que permite compilar y preparar el cdigo para su ejecucin en un emulador apropiado. De hecho, el producto final de esta herramienta puede ser instalado, de forma directa, en el dispositivo mvil en que vaya a emplearse. As no tendremos que descargar nada, ni pagar....

ndice
1. Herramientas necesarias. Instalacin

2. MIDlets y MIDlet suites

3. Ejecucin de MIDlets

4. Uso de KToolbar

Herramientas necesarias. Instalacin


Para poder compilar y ejecutar aplicaciones para dispositivos mviles necesitamos disponer de las siguientes herramientas:

Java 2 SDK, o bien cualquier otro entorno de desarrollo que ofrezca un compilador en linea de comandos para JAVA. Se recomienda el uso del SDK de JAVA, ya que los ejemplos vistos en clase se centrarn sobre esta herramienta. Se puede descargar de la pgina de SUN, en la siguiente direccin: http://java.sun.com/javase/downloads/index.jsp. Nosotros trabajeremos en el aula de prcticas con la versin 5, actualizacin 6, aunque ya hay disponibles versiones ms recientes (actualizacin 8, e incluso verin 6 en modo beta).

Java 2 Micro Edition. Se trata del paquete completo de desarrollo necesario. Incluye la herramienta KToolbar, junto con el perfil MIDP. Mediante la herramienta KToolbar se puede compilar cdigo sin necesidad de interactuar directamente con CLDC, al mismo tiempo que se dispone de un emulador de terminal telefnico. De esta forma se puede comprobar el funcionamiento de la aplicacin sobre un telfono mvil. Se puede descargar en la direccinhttp://java.sun.com/javame/downloads/index.jsp. La versin ms reciente es la 2.5, aunque nosotros trabajaremos con la 2.2. Esta versin puede descargarse desde http://java.sun.com/products/sjwtoolkit/download-2_2.html.

CLDC 1.1. Esta herramienta slo se necesita si se trabaja a bajo nivel, por ejemplo, para incorporar cdigo nativo (en lenguaje C) que se quiera incorporar a la aplicacin. Se trata de la versin ms reciente de CLDC. El software necesario se puede encontrar en la direccin: http://www.sun.com/software/communitysource/j2me/cldc/d ownload.xml. Para instalar convenientemente CLDC hemos de seguir los siguientes pasos (para linux): 1. Una vez descargado el archivo j2me_cldc_1_1-fcs-srcwinunix.zip (se trata de los fuentes del CLDC, comunes para windows, linux y otras plataformas), procederemos a descomprimirlo. Supongamos que el directorio donde est ubicado el zip es $HOME/java. Si aqu se descomprime el archivo (mediante el comando unzipnombrearchivo ), se generar el directorio j2me_cldc, donde se extraern los archivos integrados en el zip. Uno de los subdirectorios creados bajo j2me_cldc es build. Bajo el directorio build se pueden encontrar diversos directorios, relativos a las diferentes plataformas para las que est disponible CLDC. Mirad si se encuentra el directorio $HOME/java/j2me_cldc/bin/linux. En

caso afirmativo, aqu termina el proceso de instalacin. En caso contrario es preciso continuar.

2. El siguiente paso a realizar consiste en situarnos en el directorio asociado a la plataforma para la que se va a hacer la instalacin. En nuestro caso cambiaremos al directorio linux (dentro del directorio build). El contenido de este directorio es un archivo Makefile, que contiene las rdenes necesarias para instalar la versin adecuada de CLDC. Basta ejecutar, en dicho directorio, el comando make.

3. As se genera la mquina virtual, en el directorio $HOME/java/j2me_cldc/bin/linux. La mquina virtual se denomina kvm.

Netbeans. Se trata de un entorno completo de desarrollo de aplicaciones JAVA, con mdulos especiales para aplicaciones sobre dispositivos mviles. Dicha herramienta se puede descargar de la direccin: htpp://www.netbeans.org. Nosotros usaremos la versin 5, aunque hay disponibles versiones beta ms recientes.

MIDlets y MIDlet suites


Las aplicaciones JAVA que se ejecutan en dispositivos que implementan MIDP se denominan MIDlets. Un MIDlet consta de al menos una clase JAVA, que debe derivar de la clase base abstracta javax.microedition.midlet.MIDlet. El tiempo de ejecucin de un MIDlet viene controlado por una serie de mtodos definidos en dicha clase y que, forzosamente, todas las clases derivadas deben implementar. Un grupo de MIDlets relacionados pueden agruparse en un MIDlet suite. Todos los MIDlets de un suite se agrupan e instalan en un dispositivo como si fuesen un nico elemento, de forma que slo pueden desinstalarse y eliminarse en conjunto. Los MIDlets agrupados en un suite comparten tanto recursos estticos como dinmicos:

En tiempo de ejecucin, si los dispositivos soportan ejecucin concurrente, todos los MIDlets se ejecutarn en la misma mquina virtual. Por tanto, todos los MIDlets comparten las mismas instancias de todas las clases, as como los recursos cargados en la mquina virtual. Entre otras cosas, esto supone que se pueden compartir datos entre MIDlets y que las primitivas de sincronizacin no slo deben usarse para proteger frente al acceso concurrente dentro de cada MIDlet, sino tambin el producido por otros MIDlets asociados al mismo suite. El almacenamiento persistente es gestionado de forma globar para todos los MIDlets del suite. Por tanto, los MIDlets pueden acceder tanto a sus propios datos persistente como a los de otras clases del MIDlet. Como ejemplo de la forma en que los MIDlets de un suite comparten recursos, supongamos un suite que contiene una clase denominada Contador, destinada a mantener la cuenta del nmero de instancias de MIDlets del suite que se ejecutan en cada momento.
public class Contador { // Contador del numero de instancias private static int instancias; public static synchronized void incrementar(){ instancias++; } public static synchronized void decrementar(){ instancias--; } public static int obtener(){ return instancias; } }

Una nica instancia de esta clase se cargar en la mquina virtual, sin importar cuntos MIDlets de los que integren el suite estn en ejecucin en la mquina virtual. Esto significa que el mismo dato miembro esttico instancias ser usado por todos los MIDlets, por lo que los mtodos incrementar y decrementar afectarn al mismo contador. En este caso es necesaria la sincronizacin para asegurar que las operaciones de incremento y decremento sean realmente atmicas. Es importante indicar que los MIDlets deben empaquetarse antes de poderse instalar en los dispositivos de destino. Todo lo necesario de un suite debe empaquetarse en un archivo JAR. La informacin del paquete debe incluirse

en un archivo de manifiesto. Esta informacin tambin estar especificada en otro archivo denominado descriptor de aplicaciones JAVA (JAD: java application descriptor), que se mantiene separado del archivo JAR. Los archivos de manifiesto y JAD son archivos de texto con la siguiente estructura:
nombre_atributo: valor_atributo

El nombre del atributo y su valor estn separados por dos puntos, siendo el espacio adicional opcional. Todos los atributos que son relevantes para la instalacin de MIDlets comienzan por el prefijo "MIDlet-". Una lista completa de atributos, junto con una breve descripcin de sus valores asociados, aparece en la tabla siguiente. Los valores en las columnas JAD y JAR indican que el atributo es obligatorio (M), opcional (O) o ignorado (I).
Nombre de JAR JAD atributo MIDlet-Name M MIDletVersion M M M Valor y significado El nombre del suite integrado en el archivo JAR. El usuario podr ver este nombre El nmero de versin del suite empaquetado en el archivo JAR. Los nmero de versin tienen la forma a.b.c, donde valores mayores indican versiones ms recientes, teniendo los nmeros de la izquierda mayor precedencia El nombre del fabricante del suite. Se trata de texto libre. Atributo que describe cada uno de los MIDlets que integran el suite. El valor numrico n comienza en 1 y sirve para identidicar cada uno de los MIDlets Una descripcin del suite, para servir de informacin a los usuarios Un icono que representa al suite durante la instalacin o configuracin. Se debe tratar de una imagen en formato png (Portable Network Graphics) Direccin URL de un archivo que contiene informacin adicional sobre el suite. El contenido del archivo se mostrar al usuario, de forma que ste pueda decidir si desea o no instalar dicho suite.

MIDletVendor MIDlet-n

M M

M I

MIDletDescription MIDlet-Icon

O O

O O

MIDlet-InfoURL

MIDlet-Data- O Size

Mnima cantidad de espacio de almacenamiento persistente para que el suite funcione de forma correcta. Se trata de espacio usado por el suite para almacenar datos de larga duracin. Se espcifica en bytes. Si no se proporciona este atributo, se asume que el suite no precisa almacenamiento persistente La direccin URL del archivo JAR que contiene el suite El tamao del JAR que contiene el suite, en bytes Una direccin URL usada para indicar condiciones de error o de xito en la instalacin del suite. Se trata de un atributo no incluido en la especificacin MIDP, pero soportado por J2ME. Mensaje a mostrar en caso de que el suite vaya a ser borrado del dispositivo. Con este atributo ocurre lo mismo que se indic respecto al anterior: se trata de un atributo no incluido en la especificacin de MIDP Los desarrollados de MIDlets pueden proporcionar atributos especficos La versin de especificacin MIDP con la que el suite puede trabajar. Cuando aparecen varias versiones deben separarse mediante espacios. Las versiones especificadas en este atributo se comparan con el valor de la propiedad microedition.profiles para determinar la compatibilidad del suite con la versin de MIDP disponible La configuracin J2ME precisada por el suite. El valor de este atributo se compara con la propiedad microedition.configurationpara determinar la compatibilidad

MIDlet-JarURL MIDlet-JarSize

I I

M M O

MIDletI Install-Notify

MIDletDeleteConfirm

MIDletspecific attributes

MicroEdition- M Profile

MicroEdition- M Configuration

Se aprecia que alguna informacin aparece duplicada en el archivo de manifiesto del JAR y en el archivo JAD. Veremos por qu esto es necesario. La funcin del archivo de manifiesto es indicar al dispositivo el nombre y versin del suite almacenado en el JAR, as como indicar cules de los archivos empaquetados se corresponden con cada uno de los MIDlets. Para usar esta informacin el dispositivo debe descargar el JAR y extraer el archivo

de manifiesto. Una vez hecho esto, se pueden mostrar los valores de los atributos MIDlet-Name, MIDlet-Version, MIDlet-Vendor. Tambin de los atributos opcionales MIDlet-Description y MIDlet-Icon. Estos atributos permiten al usuario decidir sobre la descarga. No obstante, el archivo JAR podra ser muy grande, por lo que llevara mucho tiempo recuperarlo en situaciones de conexiones lentas, por ejemplo. Para evitar este problema, algunos de los atributos del manifiesto, con informacin extra, se duplica en el archivo JAD. Esto permite descargar inicialmente el archivo JAD en lugar del JAR. De esta forma, se puede mostrar al usuario la informacin del suite antes de haber descargado el archivo de sus clases. El archivo JAD contendr informacin contenida en el manifiesto y alguna particular. Tpicamente, los atributos que aparecen en l son:
MIDlet-Name MIDlet-Vendor MIDlet-Version MIDlet-Description MIDlet-Icon MIDlet-Info-URL MIDlet-Data-Size MIDlet-Jar-Size MIDlet-Jar-URL

El objetivo de estos atributos, como se indic con anterioridad, es ofrecer informacin sobre los MIDlets incluidos en el suite. Supongamos que desarrollamos un suite denominado Notas que permiten al usuario acceso directo a sus notas desde un dispositivo mvil. El suite contiene dos MIDlets: uno para ver las notas y otro para enviar informacin sobre posibles errores en ellas. Para desarrollar la clase se han usado mtodos de utilidad, pertenecientes a la clase Utilidades. En definitiva, las clases involucradas seran las siguientes (teniendo en cuenta que forman parte del paquete desarrollo.moviles): desarrollo.moviles.VerNotas desarrollo.moviles.ErrorNotas desarrollo.moviles.Utilidades El manifiesto para este suite podra ser el siguiente:
MIDlet-Name: Notas MIDlet-Vendor: Programas Pepe MIDlet-Version: 1.0.1 MIDlet-Description: Conjunto de midlets para ver notas MIDlet-Icon: /desarrollo/moviles/iconos/notas.png MIDlet-Info-URL: http://www.programaspepe.com/notas/info.html MIDlet-Data-Size: 512 MicroEdition-Profile: MIDP-1.0 MicroEdition-Configuration: CLDC MIDlet-1: Visualizador,/desarrollo/moviles/iconos/ver.png,desarrollo.moviles.Ver Notas

MIDlet-2: Errores,/desarrollo/moviles/iconos/error.png,desarrollo.moviles.ErrorN otas

En el archivo JAR correspondiente, el archivo de manifiesto aparecera como META.INF/MANIFEST.mf. El archivo JAR tambin contendra los siguientes archivos: /desarrollo/moviles/VerNotas.class /desarrollo/moviles/ErrorNotas.class /desarrollo/moviles/Utilidades.class /desarrollo/moviles/iconos/notas.png /desarrollo/moviles/iconos/ver.png /desarrollo/moviles/icones/error.png Conviene hacer algunos comentarios en relacin al valor de los atributos y al contenido del archivo JAR: El archivo JAR contiene las clases correspodientes a ambos MIDlets. Aunque la clase de utilidades se incluye no hay ninguna referencia a ella en el manifiesto. El atributo MIDlet-Icon contiene la ruta absoluta del archivo que contiene el icono del suite. Asociado a cada MIDlet hay un atributo que describe su nombre y le asocia un identificador. El valor del atributo incluye nombre, icono y clase asociada. El archivo JAD asociado a este MIDlet contendr la siguiente informacin:
MIDlet-Name: Notas MIDlet-Vendor: Programas Pepe MIDlet-Version: 1.0.1 MIDlet-Description: Conjunto de midlets para ver notas MIDlet-Info-URL: http://www.programaspepe.com/notas/info.html MIDlet-Data-Size: 512 MicroEdition-Jar-Size: 10132 MIDlet-Jar-URL: http://www.programaspepe.com/notas/Notas.jar

Este archivo contiene la informacin que la pantalla del dispositivo mostrar al usuario, junto con la direccin URL del archivo JAR. En este caso, los atributos comunes tienen el mismo valor tanto en el archivo de manifiesto como en el archivo JAD. Para que el suite sea portable, es preciso que el archivo JAR est codificado usando la codificacin iso-8859-1, ya que se precisa que todas las implementaciones de MIDP soporten esta codificacin. En tiempo de ejecucin los MIDlets pueden acceder a los archivos del JAR asociado al suite y obtener informacin sobre los valores de los atributos.

Ejecucin de MIDlets
Simplemente, como comentario inicial, aunque se comentar ms tarde, los MIDlets deben derivar de la clase abstractajavax.microedition.midlet.MIDlet, que contiene mtodos destinados a controlar el tiempo de ejecucin de los MIDlets. Todos los MIDlets deben tener un constructor pblico predeterminado (es decir, que no requiera argumentos). La estructura bsica de un MIDlet se muestra a continuacin:
public class EjemploMidlet extends MIDlet{ // Constructor: opcional. Bastara con el constructor por // defecto public EjemploMidlet(){ } // Mtodo que iniciar la ejecucin del MIDlet public void startApp() throws MIDletStateChangeException{ } // Mtodo que interrumpe la ejecucin del MIDlet public void pauseApp(){ } // Mtodo para finalizacin del MIDlet public void destroyApp(boolean unconditional) throws MIDletStateChangeException{ } }

En todo momento, los posibles estados en que podra estar un MIDlet son: pausa activo destruido Inicialmente, cuando se produce la carga de un MIDlet, ste estar en estado pausa. Cuando se produce la llamada al mtodostartApp() se produce el paso al estado activo. En cualquier instante, la plataforma MIDP podra poner a un MIDlet en estado de pausa. Por ejemplo, en los telfonos mviles esto ocurrir cuando se detecta una llamada entrante. Esto se realiza mediante una llamada al mtodo pauseApp(). La vuelta al estado activo precisa de una nueva llamada a startApp(). Cuando se precisa la finalizacin de un MIDlet se usar una llamada a destroyApp(...). Al producirse esta llamada se liberan los recursos que el MIDlet pudiera estar usando, siempre que el argumento de este mtodo sea true. Pero pudiera haber algunas situaciones en que este tipo de finalizacin no es conveniente; por ejemplo, por haber datos que an no se

han almacenado. En este caso, la llamada al mtodo debera hacerse usando como argumento false. Esto produce el lanzamiento de la excepcin MIDletStateChangeException. El cdigo debera estar preparado para capturar la excepcin y actuar en consecuencia. Para ilustrar el ciclo de vida un MIDlet y la forma en que se controla, a la vez que mostrar el funcionamiento de las herramientas de generacin de MIDlets, vamos a considerar un ejemplo sencillo de MIDlet, caracterizado por: El MIDlet se llamar EjemploMIDlet1. El constructor imprime el valor de la propiedad color (ya veremos para qu se hace esto) y muestra un mensaje indicando que el midlet est construido y el valor de la propiedad.

El mtodo startApp() se encarga de mostrar un mensaje que permita trazar el ciclo de vida del MIDlet. A continuacin se hace lo siguiente: o Si es la primera vez que se llama al mtodo startApp(), entonces se crea un objeto auxiliar de la clase Tarea, que permite, en una hebra aparte, ejecutar una simple cuenta. Despus de crear este objeto se invoca al mtodo start()del mismo, de forma que empieze a desarrollarse la tarea indicada en el mtodo run() de la misma. Finalmente se cambiar el valor de la variable booleana, de forma que la prxima vez que se llame al mtodo startApp() se sepa que se trata de una llamada producida al salir de una pausa.

Si no es la primera vez que se llama al mtodo startApp(), entonces se prosigue con la ejecucin de la tarea realizada por la hebra, desde el punto en que se quedara parada previamente como consecuencia de la pausa. Cuando la tarea se finaliza, se fuerza la destruccin del MIDlet, mediante la llamada a destroyApp(true). El argumento true pasado a destroyApp indica que se busca liberar todos los recursos que el MIDlet pudiera estar usando.

El mtodo pauseApp() se invoca al producirse una llamada telefnica, por ejemplo. Para forzar este evento hay una opcin concreta del men MIDlet de KToolbar. Al recibirse la llamada a este mtodo, se muestra un mensaje para seguir la traza de funcionamiento. Se imprime el

estado de trabajo de la tarea auxiliar (de la cuenta) y se fuerza a que la hebra deje de trabajar. Este es el objetivo de la llamada tarea.interrumpir(). Como no se sabe an lo suficiente como para construir interfaces de usuario (aunque pronto se sabr), todos los mensajes se enviarn a la salida estndar. Se incluye a continuacin el cdigo correspondiente, y seguidamente se ver cmo generar el suite, tanto de forma manual como automtica.
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class EjemploMIDlet1 extends MIDlet{ Tarea tarea; boolean primeraVez; // Constructor por defecto de la clase public EjemploMIDlet1(){ String color=getAppProperty("color"); System.out.println("\n\n\nConstruido MIDlet con color: "+color); primeraVez=true; } // Metodo para iniciar el funcionamiento del MIDlet public void startApp() throws MIDletStateChangeException{ System.out.println("Metodo startApp"); if (primeraVez == true){ System.out.println("Ejecucion la primera vez......."); System.out.println("Se inicia cuenta larga para permitir pausar"); tarea=new Tarea(); tarea.start(); primeraVez=false; } else{ // Se reanuda la ejecucion tras salir de la pausa System.out.println("Llamada tras pausa..... Valor de i: "+tarea.getI()); tarea.continuar(); // Se destruye el midlet cuando la tarea termine if (tarea.getFinalizado() == true){ destroyApp(true); } } } // Metodo para detener el funcionamiento del MIDlet public void pauseApp(){ System.out.println("Metodo pauseApp"); System.out.println("Valor de i en el momento de la pausa: "+tarea.getI()); tarea.interrumpir(); } // Metodo para destruir el MIDlet

public void destroyApp(boolean condition){ System.out.println("Metodo destroyApp. Condicion: "+condition); if (condition == true){ // Se indica la finalizacion del midlet notifyDestroyed(); } } } class Tarea extends Thread{ int i; boolean interrumpido; boolean finalizado; Tarea(){ i=0; interrumpido=false; finalizado=false; } public void run(){ for(; i < 9000000; ){ if (interrumpido == false){ i++; } else{ try{ sleep(100); } catch(InterruptedException e){ System.out.println("Problema al dormir hebra...."); } } //System.out.println("Valor de i: "+i); } // Se finaliza la tarea finalizado=true; } // Metodo para obtener el valor de i int getI(){ return i; } // Metodo para interrumpir void interrumpir(){ interrumpido=true; } // Metodo para continuar void continuar(){ interrumpido=false; } // Metodo para acceder al valor de finalizado boolean getFinalizado(){ return finalizado; } }

El cdigo completo de este MIDlet puede descargarse directamente desde aqu: EjemploMIDlet1.java Se trata de un MIDlet muy sencillo, que permitir practicar con los procedimientos de generacin de MIDlets, as como los posibles estados en que puede encontrarse un MIDlet en ejecucin: pausa, activo y destruido. Uso de KToolbar Seguiremos el proceso completo de trabajo sobre el MIDlet incluido anteriormente. El primer paso consistir en ejecutar la herramienta KToolbar. Esta aplicacin se encuentra en la instalacin de Wireless Toolkit. Para ejecutarla haremos lo siguiente (si no funciona, avisad al profesor.......).
ktoolbar

La ventana principal de KToolbar tiene la siguiente aparencia:

Crearemos un proyecto de suite, en el que incluiremos el MIDlet generado con anterioridad. Para ello se pulsa en el botn New Project. Al pulsar sobre l aparecer la siguiente ventana:

Como se ve, hemos rellenado la informacin de ambos campos de texto. Como nombre del proyecto podemos elegir cualquiera, sin necesidad de coincidir con el nombre de la clase principal del MIDlet. En el segundo campo

de texto hemos de especificar el nombre de la clase principal del suite que queremos ejecutar en el emulador. En este caso es EjemploMIDlet1. En cuanto se pulsa el botn Create Project aparecer una nueva ventana donde aparecen informaciones relativas al MIDlet.

Al mismo tiempo, en la ventana principal de KToolbar han aparecido varios mensajes:

Estos mensajes indican que se ha creado la estructura de directorios necesaria para el proyecto, y que las clases que queramos formen parte del MIDleet habr que ubicarlas en el directorio src; recursos adicionales (como iconos) irn en el directorio res y las libreras (si las hubiera) en el directorio lib. Como se ve, el directorio del proyecto se crea en el directorio de instalacin de la herramienta, bajo el subdirectorio apps. En nuestro caso, la ruta completa ser $HOME/java/WTK2.2/apps/ejemplo1. Nuestro primer MIDlet usar un icono muy sencillo (descargadlo aqu: iconoPeq.png). Por tanto, lo primero que haremos ser copiar el archivo con la clase asociada al MIDlet en el directorio$HOME/java/WTK2.2/apps/ejemplo1/src/. El icono se ubicar en el directorio $HOME/java/WTK2.2/apps/ejemplo1/res/. Dentro de este directorio crearemos a su vez el directorio icons. Y en l ser donde se guarde el archivo png del icono. Para indicar que el icono del MIDlet es este, debe modificarse la informacin sobre el icono. Para ello se pulsa el botn Settings deKToolbar. Aparecer la venta siguiente:

Aprovechamos ahora para indicar que deseamos que el MIDlet sea conforme a MIDP1.0. Para ello se selecciona esta opcin de las disponibles al pulsar sobre Target Platform. Para indicar el icono asociado, se selecciona la pestaa MIDlets. Una vez hecho esto aparecer

Para poder cambiar el icono (el valor presente en la figura anterior se introduce por defecto), basta con seleccionar la lnea con los datos (la fila que aparece rellena), con lo que se marcar con un color diferente para indicarnos que est seleccionada:

Ahora basta con pulsar sobre el botn Edit, lo que dar lugar a la aparicin de la ventana de edicin:

Sobre esta ventana, en el recuadro Icon escribiremos /icons/iconoPeq.png, tal y como se aprecia a continuacin:

Al finalizar se pulsa sobre el botn Aceptar de la ventana de edicin. Con esto queda registrado el cambio de la propiedad correspondiente al icono del MIDlet:

Y pulsando sobre el botn OK desaparece la ventana de propiedades. Esto es todo lo necesario para poder generar y ejecutar el MIDlet. En primer lugar, procedemos a generar las clases a partir del cdigo fuente. Para ello se pulsa el botn Build. Si todo ha ido bien, aparecer un mensaje indicado que la

generacin se realiz de forma correcta. En caso de haber errores, se mostrarn en la ventana principal de KToolbar.

En cuanto se ha generado el MIDlet, podemos ejecutar mediante el botn Run. Al pulsarlo, aparecer el emulador con el MIDlet listo para ejecucin.

Para lanzar la ejecucin del MIDlet se pulsa sobre la tecla bajo el mensaje Launch. En cuanto se produce esto el MIDlet se crea y el dispositivo invoca al mtodo startApp(). Esto explica los mensajes que se aprecian en la consola de KToolbar:

Se muestra el mensaje de traza puesto en el constructor, indicando que la propiedad color no est definida. Arreglar esto se deja para ms adelante. Tambin se aprecia la traza ubicada a la entrada del mtodo startApp(), que ha sido invocado por el sistema de gestin de ejecucin de MIDlets del dispositivo mvil. Los dos mensajes que aparecen a continuacin son trazas que muestran que el MIDlet se ejecuta por primera vez. Para pausar el MIDlet, tras unos segundos de funcionamiento, basta con actuar sobre el men MIDlet del emulador telefnico y seleccionar la opcin Pause. Al hacerlo el emulador queda de la forma siguiente:

A su vez, en la consola de KToolbar veremos los siguientes mensajes:

Las nuevas lneas de traza indican que se ha invocado al mtodo pauseApp(). Como comentamos previamente, esto ocurrir al producirse una llamada de telfono sobre el mvil, por ejemplo. Se observa el valor de la cuenta en el momento en que se produjo la pausa. Para continuar ejecutando el MIDlet (lo que ocurrira al finalizar la llamada), forzamos la salida del modo de pausa. Para ello volvemos a actuar sobre el men MIDlet, seleccionado la opcin Resume. Esto hace que aparezcan nuevas lneas de traza indicando que se ha producido una nueva llamada al mtodo startApp(), pero sin tratarse de la primera llamada al mismo.

Por su parte, del emulador desaparece la indicacin de llamada entrante:

Si se observa el cdigo del mtodo startApp(), se aprecia que la destruccin del MIDlet slo se producir en el caso en que ya haya finalizado la tarea de cuenta. Para asegurarnos que esto ocurre, tras la salida del modo de pausa esperaremos unos segundos, se genera una nueva pausa (pulsando, como se indicn previamente, sobre la opcin Pause del men MIDlet) para, a continuacin forzar, mediante Resume (en el men MIDlet), una nueva llamada a startApp() una vez finalizada la cuenta. Cuando esto ocurra, tendremos:

Slo cuando el MIDlet haya sido destruido de forma completa podr volver a lanzarse de forma correcta. EJERCICIO 1: probad qu ocurre cuando se intenta lanzar de nuevo la ejecucin del MIDlet antes de que haya finalizado completamente la tarea de cuenta. Justificad el comportamiento observado. Cuando se usa destroyApp(false) permite que el mtodo compruebe si se cumplen las condiciones necesarias para finalizar o no. En caso de no cumplirse, puede generar una excepcin del tipo MIDletStateChangeException, lo que genera a su vez una nueva llamada startApp(). EJERCICIO 2: se propone que modifiquis el cdigo del MIDlet anterior de la forma siguiente: Montad un nuevo proyecto, ejemplo2, para trabajar sobre esta variante. La clase del MIDlet se denominar EjemploMIDlet2. Podis partir de la clase EjemploMIDlet1 y modificarla.

En el mtodo startApp(), en caso de no ser la primera llamada, despus de la sentencia tarea.continuar(), se realiza la llamada

a destroyApp(false). Esta llamada habr que encerrarla en un bloque try-catch, ya que el mtodo destroyApp()podra decidir generar la excepcin si considera que el MIDlet no debe finalizar.

Modificad el mtodo destroyApp(), de forma que en caso de recibir como argumento false, compruebe si la tarea ha finalizado o no. Si no ha finalizado, lanza una excepcin del tipo MIDletStateChangeException, para dar tiempo a que la tarea de conteo finalice. Si la tarea ha finalizado, se llama al mtodo notifyDestroyed(), con lo que el MIDlet indica que desea finalizar. En nuestro caso, el MIDlet usa un valor de atributo ( color). Si se observa el cdigo, se comprobar que al imprimir su valor se muestra null. Si se intenta manejar esta propiedad, sin haberla especificado de forma explcita, puede ocurrir un error como el mostrado a continuacin:

Pero, cmo se define este atributo?. Para ello usaremos el botn Settings. Cuando aparezca la ventana de propiedades del MIDlet, seleccionaremos la

opcin User Defined, que permitir definir atributos propios. Sobre esta ventana, pulsaremos el botn Add.

Al pulsar sobre Add aparecer la ventana que hemos de usar para definir el valor de la propiedad deseada:

Se escribe el nombre de la propiedad (color) y se pulsa sobre Aceptar. Con esto la ventana de propiedades queda de la siguiente forma:

Se pincha sobre el campo de texto en blanco y se introduce el valor deseado:

Pulsamos OK y ya podemos volver a ejecutar el MIDlet. Ahora la traza inicial indica:

EJERCICIO 3: probad con los MIDlets de demo que vienen con la herramienta. Activad la monitorizacin, activando las preferencias (Edit + Preferences + Monitor) deseadas. Con esto podis haceros una idea de la capacidad de la plataforma de desarrollo. Haced un pequeo guin con indicaciones sobre vuestra opinin al respecto: demos ms interesantes, limitaciones, puntos fuertes, etc.

You might also like