Introdução ao desenvolvimento móvel com Java ME
Por Francisco Demontiê dos Santos Junior
(demontie@dsc.ufcg.edu.br)
Cada vez mais, várias plataformas para desenvolvimento móvel vêm surgindo, tais como: Android, Windows Mobile, Symbian, BlackBerry e iPhone OS. Java ME surgiu para que um aplicativo, uma vez escrito, possa rodar em qualquer dispositivo.

O Java ME é um componente da plataforma Java para dispositivos móveis, ou seja, é um subconjunto da linguagem Java, mas possui vários recursos próprios para o desenvolvimento móvel. Nesta matéria, serão introduzidos alguns conceitos, e mostrados exemplos de aplicativos Java ME. Para esse fim, será considerado que já se tem um ambiente para desenvolvimento Java ME configurado.

Um aplicativo que roda na plataforma Java ME é chamado de MIDlet. Para começar a entender alguns conceitos dessa plataforma, vamos ver um pequeno exemplo “Hello World”.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.TextBox; 

public class HelloWorld extends MIDlet {  
    private TextBox tbox;  
   
    public HelloWorld() {  
        tbox = new TextBox("Hello world", "Hello World!", 25, 0);  
    }  

    protected void startApp() {  
        Display.getDisplay(this).setCurrent(tbox);  
    }  
 
    protected void pauseApp() {}  
    protected void destroyApp(boolean bool) {}  
}

Note que a classe do exemplo, HelloWorld, herda da classe MIDlet. Essa classe contém os métodos e atributos necessários para uma aplicação Java ME. Geralmente, apenas a classe principal do aplicativo herda de MIDlet. Caso tentemos usar outra MIDlet dentro da classe principal, Java ME lançará uma exceção. Entendamos, agora, o código: na linha 9, criamos um TextBox que será usado para exibir o texto “Hello World!”; para que este seja mostrado na tela da aplicação, usamos o trecho de código Display.getDisplay(this).setCurrent(tbox).

Quando criamos uma aplicação, devemos implementar os métodos startApp, pauseApp, e destroyApp. O primeiro, startApp, deve conter o código necessário para iniciar a aplicação; pauseApp é usado para aplicações que possam ser pausadas (pode-se, por exemplo, salvar o contexto da aplicação); destroyApp é chamado quando a aplicação é encerrada.

Agora que já temos uma noção de como devemos implementar uma aplicação Java ME, vamos incrementar um pouco nosso exemplo inicial. Para possuir interação com o usuário, nossa classe irá implementar a interface CommandListener que possui um único método (que deve ser implementado), commandAction. Esse método define as ações que serão realizadas para cada comando. Os comandos são objetos do tipo Command.

O código abaixo é uma modificação do exemplo anterior para introdução de comandos. Introduzimos o comando sair.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox; 
  
public class HelloWorld extends MIDlet implements CommandListener{  
    private TextBox tbox;  
    private Command sair;

    public HelloWorld() {  
        tbox = new TextBox("Hello world", "Hello World!", 25, 0);
        sair = new Command("Sair", Command.EXIT, 1);
        tbox.addCommand(sair);
        tbox.setCommandListener(this);
    }  
 
    protected void startApp() {  
        Display.getDisplay(this).setCurrent(tbox);  
    }  
 
    public void commandAction(Command cmd, Displayable display) {
    	if (cmd == sair){
    		destroyApp(false);
    		notifyDestroyed();
    	}
	}  
   
    protected void pauseApp() {}  
    protected void destroyApp(boolean bool) {}
}

Note que usamos o construtor Command que recebe três parâmetros. O primeiro parâmetro, do tipo String, indica o nome do comando que será exibido na aplicação. O segundo parâmetro, do tipo inteiro, indica o tipo de comando que será criado. As seguintes constantes são definidas: Command.BACK, Command.CANCEL, Command.EXIT, Command.HELP, Command.ITEM, Command.OK, Command.SCREEN e Command.STOP. O terceiro parâmetro indica a prioridade do comando. Note, também, que, para encerrar a aplicação (no método commandAction), foi invocado o método notifyDestroyed, além de destroyApp, para notificar o término da aplicação e para que a KVM (K Virtual Machine – uma JVM para dispositivos móveis) possa encerrá-la.

Veja agora esse exemplo.

Ao rodar esse aplicativo, deverá ser exibido na tela algo semelhante à Figura 1.


Figura 1 – Exemplo de tela para o exemplo “ExemploCadastro”.

Como forma de exercício, tente entender e modificar esse exemplo.