Sunteți pe pagina 1din 16

Ejemplo de Funcionamiento ciclo de vida de un MIDlet

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. o 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 de KToolbar. 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.