Java ME Introdução Rui Rossi dos Santos ruirossi@ruirossi.pro.br Mediador: Rui Rossi dos Santos Slide 1
Fundamentos Edições do Java JSE JEE JME JSE JEE MIDP Nível de Perfil CDC CLDC Nível de Configuração Máquina Virtual Java KVM JME Mediador: Rui Rossi dos Santos Slide 2
Fundamentos Máquina Virtual Java - Função Mediador: Rui Rossi dos Santos Slide 3
Fundamentos Máquina Virtual KVM (Kilo Virtual Machine) Implementação de referência para dispositivos limitados. Recursos requeridos: Memória: 40 a 80 kilobytes. Memória dinâmica (heap): 20 a 40 kilobytes. Processador: 16 bits de 25 MHz de frequencia. Mediador: Rui Rossi dos Santos Slide 4
Fundamentos Configuração Define uma plataforma para um grupo de dispositivos similares. Capacidade de memória similar. Capacidade de processamento similar. Está vinculada à uma máquina virtual. Define as bibliotecas que estarão disponíveis. Mediador: Rui Rossi dos Santos Slide 5
Configurações válidas: Fundamentos CDC (Connected Device Configuration) Para dispositivos mais potentes Requisitos mínimos: 512 KB de memória para execução do Java 256 KB para memória de trabalho Conectividade de rede com largura de banda alta CLDC (Connected Limited Device Configuration) Para dispositivos com recursos mais restritos Requisitos mínimos: 128 KB de memória para execução do Java 32 KB para memória de trabalho Interface restrita com o usuário Autonomia de alimentação baixa (geralmente bateria) Conectividade de rede com largura de banda baixa Mediador: Rui Rossi dos Santos Slide 6
Fundamentos Perfil (profile): É uma extensão de uma configuração. Acrescenta bibliotecas úteis à um subgrupo de dispositivos. Mediador: Rui Rossi dos Santos Slide 7
Fundamentos Perfil MIDP: A sigla: Mobile Information Device Profile Perfil de dispositivo de informação móvel Perfil ideal para smartphones, PDA s e similares. Contempla todos os recursos da configuração CLDC Acrescenta bibliotecas: Pacote javax.microedition.midlet (suporte à aplicações MIDP) Pacote javax.microedition.lcdui (interface gráfica) Pacote javax.microedition.rms (suporte à persistência de registros) Mediador: Rui Rossi dos Santos Slide 8
Arquitetura Genérica do JME: Fundamentos Perfil Configuração Máquina Virtual Java Sistema Operacional Hospedeiro Mediador: Rui Rossi dos Santos Slide 9
Arquitetura do Perfil MIDP: Fundamentos MIDP (Bibliotecas Adicionais) CLDC (Bibliotecas Básicas) KVM Sistema Operacional Hospedeiro Mediador: Rui Rossi dos Santos Slide 10
Conceito de MIDlet Fundamentos das MIDlets Aplicativo Java executável em dispositivo móvel do tipo MIDP Arquitetura subjacente exigida: Máquina Virtual: KVM Configuração: CLDC Perfil: MIDP Mediador: Rui Rossi dos Santos Slide 11
Fundamentos das MIDlets Ciclo de vida / construtor Pausada / destroyapp( ) / startapp( ) / pauseapp( ) Ativa / destroyapp( ) Mediador: Rui Rossi dos Santos Slide 12
Fundamentos das MIDlets A classe javax.microedition.midlet.midlet Representa um aplicativo para MIDP Construtor: O construtor é protegido. Deve ser utilizado somente nas subclasses. Uma MIDlet não deve criar outras MIDlets. Uma MIDlet deve ser criada pelo software gerenciador de aplicativos do dispositivo. Mediador: Rui Rossi dos Santos Slide 13
Fundamentos das MIDlets A classe javax.microedition.midlet.midlet Métodos invocados na mudança de estado: startapp( ): quando a MIDlet entra no estado Ativa. pauseapp( ): quando a MIDlet entra no estado Pausada. destroyapp( ): quando a MIDlet entra no estado Destruída. Assinaturas dos métodos: protected abstract void startapp( ) protected abstract void pauseapp( ) protected abstract void destroyapp(boolean unconditional) true indica que todos os recursos devem ser liberados false indica que a midlet não quer ser destruída Nesse caso, uma MIDletStateChangeException é disparada. Mediador: Rui Rossi dos Santos Slide 14
Ambiente de Desenvolvimento Instalar o JSE SDK (jdk-6u23-windows-i586.exe) Instalar o JME SDK (sun_java_me_sdk-3_0-win.exe) Mediador: Rui Rossi dos Santos Slide 15
Passo 1: criação do projeto File > New Project Primeiro Exemplo com JME SDK Passo 2: escolha do tipo de projeto Categorie: Java ME SDK Projects: MIDP Application Passo 3: configurações do projeto Project Name: AloMundo Project Location: C:\DADM\JME Marcar opções: Set as Main Project Create Hello MIDlet Passo 4: seleção da plataforma Emulator Platform: CLDC Java(TM) Micro Edition SDK 3.0 Device: ClamshellCldcPhone1 Device Configuration: CLDC-1.1 Device Profile: MIDP-2.0 Mediador: Rui Rossi dos Santos Slide 16
Primeiro Exemplo com JME SDK Passo 5: ajustar e comentar o código Inserir comentário em português Alterar os textos para o português Passo 6: executar o projeto Menu Run > Run Main Project (F6) Passo 7: testar a aplicação Setas de direção Controles Teclado Passo 8: trocar o emulador Clique com botão inverso no projeto Properties > Platform > Device Escolha: DefaultCldcPhone1 Mediador: Rui Rossi dos Santos Slide 17
Dados do projeto: Segundo Exemplo com JME SDK Nome: ExemploDois Desmarcar opção Create Hello MIDlet Criar uma MIDlet Nome: FormMIDlet Pacote: br.pro.ruirossi Acrescentar um formulário Seguir o modelo ao lado Campos: classe TextField Mediador: Rui Rossi dos Santos Slide 18
Formulário Classe: javax.microedition.lcdui.form java.lang.object extended byjavax.microedition.lcdui.displayable extended byjavax.microedition.lcdui.screen extended byjavax.microedition.lcdui.form Pode abrigar diferentes tipos de componentes visuais. Mediador: Rui Rossi dos Santos Slide 19
Formulário Classe: javax.microedition.lcdui.form Métodos e construtores: Form (String title): cria um formulário vazio. int append (Item item): permite acrescentar um componente e retorna o índice atribuído a ele. void delete (int itemnum): exclui o item da posição especificada. void deleteall( ): exclui todos os itens do formulário. Item get (int itemnum): retorna o item da posição especificada. void insert (int itemnum, Item item): insere o item antes da posição especificada. void set (int itemnum, Item item): substitui o item da posição especificada. int size( ): retorna o número de itens do formulário. Mediador: Rui Rossi dos Santos Slide 20
Formulário Classe: javax.microedition.lcdui.form Métodos herdados de Displayable: void addcommand(command cmd): vincula um comando a determinada tela ou componente. void removecommand(command cmd): desvincula um comando de determinada tela ou componente. void setcommandlistener(commandlistener l): define um ouvinte para os comandos de uma tela ou componente. Mediador: Rui Rossi dos Santos Slide 21
Campo de Texto Classe: javax.microedition.lcdui.textfield java.lang.object extended byjavax.microedition.lcdui.item extended byjavax.microedition.lcdui.textfield É um campo de texto editável. Pode ser inserido em um formulário. Mediador: Rui Rossi dos Santos Slide 22
Campo de Texto Classe: javax.microedition.lcdui.textfield Métodos e construtores: TextField(String label, String text, int maxsize, int constraints): cria um novo campo de texto com o rótulo, texto inicial, tamanho máximo em caracteres e restrições especificados. Obs.: as restrições são especificadas através de um dos seguintes atributos estáticos e constantes dessa mesma classe: ANY, EMAILADDR, NUMERIC, PHONENUMBER, URL e DECIMAL. Mediador: Rui Rossi dos Santos Slide 23
Dados do projeto: Exemplo: Cadastro de Pessoa Nome: CadPessoa Desmarcar opção Create Hello MIDlet Criar uma MIDlet Nome: CadPessoaMIDlet Pacote: br.pro.ruirossi Acrescentar um formulário Seguir o modelo ao lado Campos: classe TextField Mediador: Rui Rossi dos Santos Slide 24
Evento de Comando Interface: javax.microedition.lcdui.commandlistener Deve ser realizada pelos ouvintes de eventos de comando. Método: public void commandaction(command c, Displayable d): método executado quando um evento de comando ocorrer no formulário ou componente monitorado. Mediador: Rui Rossi dos Santos Slide 25
Comando Classe: javax.microedition.lcdui.command Encapsula informações sobre um evento de comando. Um botão no software vinculado a uma tecla do dispositivo. Mapeamento de comandos para teclas depende do dispositivo. Mediador: Rui Rossi dos Santos Slide 26
Comando Classe: javax.microedition.lcdui.command Métodos e construtores: Command (String label, int commandtype, int priority): cria um comando com o rótulo, tipo e prioridade especificados. int getcommandtype(): retorna o tipo do comando. String getlabel(): retorna o rótulo do comando. int getpriority(): retorna a prioridade do comando. Mediador: Rui Rossi dos Santos Slide 27
Comando Classe: javax.microedition.lcdui.command O tipo de um comando indica a intenção de mapeá-lo para uma tecla específica do dispositivo. Atributos utilizados para especificar o tipo do comando: BACK CANCEL EXIT HELP ITEM OK SCREEN STOP Mediador: Rui Rossi dos Santos Slide 28
Comando Classe: javax.microedition.lcdui.command A prioridade de um comando indica a sua importância relativa a outros comandos da mesma tela. Quanto menos o número, maior a prioridade. Primeiro a disposição dos comandos é feita com base em seu tipo e depois são agrupados com base na prioridade. Mediador: Rui Rossi dos Santos Slide 29
Mensagens Classe: javax.microedition.lcdui.alert Métodos e construtores: Alert(String title, String alerttext, Image alertimage, AlertType alerttype): cria uma nova mensagem com o título, texto, imagem e tipo especificados. public void settimeout(int time): define o tempo pelo qual a mensagem será exibida. Deve ser um valor em milissegundos ou o atributo FOREVER da própria classe Alert. Obs.: o tipo de uma mensagem é especificado através de um dos seguintes atributos estáticos e constantes da classe AlertType: ALARM, CONFIRMATION, ERROR, INFO, WARNING. Mediador: Rui Rossi dos Santos Slide 30
Exemplo: Teste de IMC Nome do projeto: ExemploIMC Mediador: Rui Rossi dos Santos Slide 31
Exemplo: Teste de IMC Estrutura: MIDlet Form ComandoMidlet midlet FrmTesteIMC TesteIMC CommandListener Mediador: Rui Rossi dos Santos Slide 32
Papéis: Exemplo: Teste de IMC TesteIMC: regras de negócio FrmTesteIMC: interface gráfica ComandoMidlet: aplicação FrmTesteIMC - - - nome peso altura : String : double : double TesteIMC TesteIMC () getnome () getpeso () getaltura () setnome (String nome) setpeso (double peso) setpeso (String peso) setaltura (double altura) setaltura (String altura) getimc () getcategoria () : String : double : double : void : void : void : void : void : double : String - - - - - - - midlet tfnome tfpeso tfaltura cmdcalcular cmdlimpar cmdsair : ComandoMidlet : TextField : TextField : TextField : Command : Command : Command FrmTesteIMC (ComandoMidlet midlet) commandaction (Command c, Displayable d) : void - display : Display ComandoMidlet ComandoMidlet () startapp () pauseapp () destroyapp (boolean unconditional) : void : void : void Mediador: Rui Rossi dos Santos Slide 33
Descrição do exemplo: Exemplo: Teste de IMC O usuário deve informar três dados: seu nome completo, seu peso e sua altura. Deve haver três comandos disponíveis: Resultado: deve produzir uma mensagem contendo os três dados informados, o IMC do usuário e a categoria correspondente. Limpar: deve eliminar o conteúdo dos três campos do formulário. Sair: deve encerrar a aplicação. Se o comando Resultado for pressionado e se algum dado inválido tiver sido informado, deve ser exibida uma mensagem de erro indicando a regra que foi violada. As regras para a validação dos dados são as seguintes: Nome: deve ser um texto de 5 a 50 caracteres, ser composto de um nome e de pelo menos um sobrenome e cada parte desse texto deve ter ao menos 2 caracteres. Peso: deve ser um número decimal de 0,5 a 500 kilogramas. Altura: deve ser um número decimal de 0,2 a 3 metros. Mediador: Rui Rossi dos Santos Slide 34
Descrição do exemplo: Exemplo: Teste de IMC A fórmula para calcular o IMC é a que segue: IMC = P / A 2 Onde: P = Peso A = Altura A tabela abaixo indica como mapear determinado IMC para a sua categoria correspondente. IMC Até 18,4 De 18,5 a 24,9 De 25,0 a 29,9 De 30,0 a 34,9 De 35,0 a 39,9 Acima de 40,0 Categoria Abaixo do peso Peso normal Sobrepeso Obesidade Grau I Obesidade Grau II Obesidade Grau III Mediador: Rui Rossi dos Santos Slide 35
Exercício 1: Cadastro de Cliente Nome do projeto: CadCliente MIDlet: CadClienteMIDlet O formulário deve ter os campos: Nome (até 40 caracteres) Logradouro (até 30 caracteres) Número (até 5 dígitos) Cidade (até 40 caracteres) Estado (2 letras) CPF (11 dígitos) Adicione 2 comandos: Sair: fechar o aplicativo. Limpar: limpar todos os campos. Mediador: Rui Rossi dos Santos Slide 36
Exercício 2: Cadastro de Contatos Nome do projeto: CadContato Funcionamento da aplicação: O cadastro de cada contato deve ser composto por três dados: seu nome completo, seu e-mail e seu telefone. Deve haver cinco comandos disponíveis: Gravar: deve acionar a gravação de um cadastro. Excluir: deve acionar a exclusão de um cadastro. Relatório: deve exibir a lista de todos os cadastros gravados. Limpar: deve eliminar o conteúdo dos três campos do formulário. Sair: deve encerrar a aplicação. Mediador: Rui Rossi dos Santos Slide 37
Exercício 2: Cadastro de Contatos Operação: gravar um novo cadastro Para gravar o cadastro de um contato, deve ser informados três dados: seu nome completo, seu e-mail e seu telefone. Deve ser exibida uma mensagem para confirmar a gravação do cadastro contendo todos os dados informados. Se algum dado inválido tiver sido informado, deve ser exibida uma mensagem de erro indicando a regra que foi violada. Não deve ser permitida a gravação de dois contatos com o mesmo nome. Mediador: Rui Rossi dos Santos Slide 38
Exercício 2: Cadastro de Contatos Operação: gravar um novo cadastro As regras para a validação dos dados são as seguintes: Nome: deve ser um texto de 5 a 50 caracteres, ser composto de um nome e de pelo menos um sobrenome e cada parte desse texto deve ter ao menos 2 caracteres. E-mail: deve ser um texto de 5 a 50 caracteres, ser composto de pelo menos duas partes separadas por um @, cada parte desse texto deve ter ao menos 2 caracteres e não pode haver espaços. Telefone: deve ser composto por 10 dígitos. Mediador: Rui Rossi dos Santos Slide 39
Exercício 2: Cadastro de Contatos Operação: excluir um cadastro Para excluir o cadastro de um contato, deve ser informado o seu nome completo. A aplicação não deve fazer distinção entre caracteres minúsculos e caracteres maiúsculos. Deve ser exibida uma mensagem para confirmar a exclusão do contato com o seu nome completo. Se não houver um cadastro com o nome informado, deve ser exibida uma mensagem de erro. Mediador: Rui Rossi dos Santos Slide 40
Exercício 2: Cadastro de Contatos Operação: exibir o relatório de contatos Para exibir o relatório dos contatos registrados, basta acionar o comando Relatório. Esses registros devem ser apresentados através de uma mensagem. Mediador: Rui Rossi dos Santos Slide 41
Exercício 2: Cadastro de Contatos Essa aplicação deve ter a estrutura de componentes abaixo MIDlet Form Contato 0..* contatos ContatoMidlet midlet FrmContato CommandListener Banco Mediador: Rui Rossi dos Santos Slide 42
Papéis: Exercício 2: Cadastro de Contatos Contato: encapsulamento e validação dos dados dos contatos. Banco: repositório de objetos onde serão gravados os contatos. FrmContato: interface gráfica do cadastro de contatos. ContatoMidlet: representa a aplicação MIDP. - - - nome email fone : String : String : String Contato Contato () getnome () getemail () getfone () setnome (String nome) setemail (String email) setfone (String fone) tostring () equals (Object obj) hashcode () : String : String : String : void : void : void : String : boolean : int - - - - - - - - - midlet tfnome tfemail tffone cmdgravar cmdexcluir cmdrelatorio cmdlimpar cmdsair FrmContato : ContatoMidlet : TextField : TextField : TextField : Command : Command : Command : Command : Command FrmContato (ContatoMidlet midlet) commandaction (Command c, Displayable d) : void - contatos : Vector Banco getcontatos () incluircontato (Contato contato) excluircontato (Contato contato) listarcontatos () : Vector : void : void : String - display : Display ContatoMidlet ContatoMidlet () startapp () pauseapp () destroyapp (boolean unconditional) : void : void : void Mediador: Rui Rossi dos Santos Slide 43
Referências MUCHOW, John W. J2ME: tecnologia e MIDP. São Paulo: Pearson Makron Books, 2004. Mediador: Rui Rossi dos Santos Slide 44