Java 2 Platform, Micro Edition () Alcione de Paiva DPI Granbery Partes deste material foram adaptadas de Mauro Nacif Masha Gutkhen Keren Gazit 2006 1
Conteúdo O que é? conceitos básicos Configurações (CLDC, CDC) Profiles (MIDP) MIDlet, MIDlet Suite Classes básicas da API Uso e instalação Exemplos Exercícios 2
Introdução Dispositivos de informação inteligentes são uma necessidade em nossa moderna. Tais dispositivos podem ser: Telefones celulares smart cards PDAs Palmtops Dispositivos eletrônicos em geral Estes dispositivos tendem a ser direcionados para um propósito específico, com recurso limitado, conectados em rede. 3
Motivações Years to Reach 25% Market Penetration 40 35 30 Years 25 20 15 10 5 0 Telephone PC Cellular Internet Mobile internet Category => penetração de 25% do mercado da Internet móvel em quatro anos (Forrester) 4
Requisitos de ambiente É necessário um ambiente adaptado para dispositivos com recursos limitados As limitações são: Memória extremamente limitada Tamanho de tela pequena Métodos de entrada alternativos Processadores lentos 5
Qual é a solução? Devido à grande demanda a Sun decidiu desenvolver uma edição especial de Java: (Java 2 Micro Edition). 6
7
Penetração da Tecnologia Java Developers.sun.com (February 14-17, 2005) 110 operadoras no mundo permitem deployments em Java Usados em mais de 400 modelos de mais de 40 fabricantes diferentes Usada em mais de 750 milhões de smartcards. 8
Penetração da Tecnologia Java Enterprise Developer News (Tuesday, April 12, 2005) O desenvolvimento em cresceu 33% em apenas seis meses É mais efetivo em termos de custo o desenvolvimento em uma vez que não é necessário reescrever a aplicação para dispositivos diferentes. 9
Edições de Java Dispositivos diferentes têm exigências diferentes e expectativas diferentes de Java. Uma plataforma (solução) não pode abarcar todos os segmentos do mercado (servidor web, vídeo games etc.) Usuários/desenvolvedores querem flexibilidade. 10
Edições de Java A Plataforma Java 2 é dividida em três edições. Cada edição fornece um ambiente completo para executar aplicações baseadas em java, inclusive a máquina virtual Java (VM) e classes de tempo de execução. As três edições abordam tipos diferentes de aplicações que executam em tipos diferentes de dispositivos. 11
Edições de Java Plataforma Java 2 Java2 Standard Edition (J2SE ) Java2 Enterprise Edition (J2EE ) Aplicações desktop & Aplicações workstation Aplicações empresariais de alto desempenho Java2 Micro Edition ( ) Dispositivos com Limitações de memória e processamento 12
Edições de Java Cada edição define conjuntos diferentes de bibliotecas de classe. Existem milhares de classes básicas de J2SE, ocupando 10-20 megabytes de espaço. fornece um número J2EE menor de classes. J2SE 13
PersonalJava e EmbeddedJava não é a primeira tentativa de adaptar Java para ambientes restritos. PersonalJava Usa as classes básicas de Java 1.1 com algumas características de Java 2. A implementação ainda exige para 2 megabytes de memória e um processador rápido para executar. 14
PersonalJava e EmbeddedJava EmbeddedJava Cada comportamento da JVM e das classes runtime são opcionais o implementador pode escolher exatamente que classes e métodos são requeridos. Perda da portabilidade. 15
Profile Plataforma mínima requerida para um grupo de dispositivos Profile Libraries Atende necessidades específicas de uma certa família de dispositivos Java Language Pacotes opcionais Java Virtual Machine Configuration Configuration Profiles Conceitos básicos Sistema operacional 16
Conceitos básicos J2EE J2SE PDA Profile Mobile Internet dispositiv o Other Profile Standard Library CLDC Person Profile Enterprise Services CDC Foundatio n Profile Application Server JavaCard CLDC Core API CLDC Core API JavaCard API KVM JCRE Java Language JVM (HotSpot) CVM 17
Conceitos básicos Java Card Class file(s) Cerca de 50K de memória Três componentes: Runtime environment Converter JCVM, JCRE, JC API 2 diferentes VMs: Conversor Interpretador On-card installer Interpreter CAP files Smart card Off-card installation program CAD PC ou workstation 18
Conceitos básicos JavaTV Applications & Applets Baseado em J2SE VM no receptor de TV & executa byte code Aplicações sobdemanda Application layer Java TV API Java Platform Java technology layer Real Time OS Device Drivers Digital TV Receiver RTOS layer Hardware layer 19
Conceitos básicos está baseada em 3 conceitos básicos: Configurations Profiles Pacotes opcionais 20
Configurações Uma configuration é um ambiente Java completo, consistindo de: Uma Java virtual machine (VM) para executar Java bytecode Código nativo para interagir com o sistema subjacente Um conjunto de classes básicas Java de tempo de execução Para usar uma configuration, um dispositivo deve atender alguns requerimentos mínimos. 21
Configurações O conjunto de classes básicas e pequeno e deve ser expandido com classes adicionais fornecidas pelo profiles ou pelo implementador da configuration. Configurations não define classes de interface com o usuário. 22
Configurações Configuration CLDC CDC Connected Limited Device Configuration Connected Device Configuration 23
CLDC vs. CDC CLDC Para dispositivos muito limitados 160-512 KB de memória total Processador de 16-bit ou 32-bit Baixo consumo de energia, com possível uso de bateria Conectividade com largura de banda limitada CDC 2 MB ou mais de memória Processador de 32bit Conectividade com banda larga, com o uso freqüente de TCP/IP 24
CLDC vs. CDC - VM Características ausentes na CLDC VM: Tipos de Ponto flutuante (1.0) Finalização de objetos JNI ou reflection Thread groups ou daemon threads Class loaders para usuário O CDC suporta uma máquina virtual Java 2 completa Mudanças na verificação/ pre-verificação 25
KVM e CVM KVM - Java virtual machines para o CLDC CVM - Java virtual machines para o CDC Escritas para trabalhar especificamente em ambientes limitados e para serem facilmente portadas para diferentes plataformas. 26
CLDC vs. CDC J2SE Subset CLDC inclui classes da: CDC inclui 17 pacotes java.lang java.io java.util Somente classes selecionadas de cada pacote foram incluídas. 27
CLDC vs. CDC J2SE Subset J2SE CDC CLDC 28
Lidando com I/O J2SE inclui várias classes para realizar I/O. Existe um número grande de classes I/O e elas tendem a encapsular modelos de I/O que não são necessariamente encontrados em todos os dispositivos. Por exemplo, alguns dispositivos handheld não possuem sistemas de arquivo. Suporte a Socket, também não é universal. 29
Lidando com I/O em CLDC CLDC define um conjunto novo de APIs para I/O chamado de Generic Connection Framework. O GCF, parte do novo pacote javax.microedition.io, define interfaces para os diferentes tipos de I/O que são possíveis. O CLDC não define, de fato, qualquer implementação de I/O. Isto fica a cargo do profiles e/ou do fabricante do dispositivo. 30
GCF - exemplo import java.io.*; import javax.microedition.io.*; StreamConnection conn = null; InputStream is = null; String url = "socket://somewhere.com:8909"; try { conn = (StreamConnection) Connector.open( url ); is = conn.openinputstream();... // etc. etc. } 31
Lidando com I/O em CDC Uma vez que CDC é um superconjunto do CLDC, ele inclui o GCF. CDC também requer suporte GCF para dois tipos específicos de conexões: arquivos e datagramas. A razão: CDC inclui as classes dos pacotes java.io e java.net. 32
Conceitos básicos está baseada em 3 conceitos básicos: Configurations Profiles Pacotes opcionais 33
Profiles Adiciona classes específicas do domínio para uma configuration: Para adicionar funcionalidade ausentes Para suportar usos específicos do dispositivo A maioria de profiles define classes de interface com o usuário para construir aplicações interativas. Para usar um profile, o dispositivo deve atender um mínimo de requisitos da configuration e do profile. 34
Profiles Profile MIDP Mobile Information device PDAP Personal Digital Assistant Profile FP Foundation Profile PBP PP Personal Basis Profile Personal Profile 35
MIDP MID Profile MIDP é direcionada para uma classes de dispositivos conhecidos como mobile information devices (MIDs). Características Mínimas do MIDs: Memória suficiente para executar aplicações MIDP Visor com pelo menos 96 X 56 pixels, monocromático ou colorido Um keypad, teclado, ou tela sensível ao toque Capacidade de rede sem fio bi-direcional 36
MIDP - Especificação Existem duas versões de MIDP: MIDP 1.0 lançado em Setembro de 2000. Muitos dispositivos disponíveis no mercado suportam esta versão. MIDP 2.0 lançado em Dezembro de 2002. Grande parte dos dispositivos o suportam. 37
MIDP - Especificação O MIDP adiciona APIs às APIs básicas definidas pelo CLDC. As novas características incluem: Suporte para gerência do ciclo de vida da aplicação de modo similar aos applets no J2SE. Armazenamento persistente de dados. Conectividade baseada no HTTP no GCF. Suporte simples às interface com o usuário, com flexibilidade suficiente para construção de jogos e aplicações de negócio. 38
MIDP - Especificação A especificação MIDP 2.0 inclui novas APIs em relação a versão 1.0, sendo as principais: classe responsável por lidar com push registry (um MIDlet responder a um evento externo sem estar ativo). javax.microedition.lcdui.game pacote responsável por estender as capacidades do MIDP para jogos 2D, lidando com layers, sprites e transparências. javax.microedition.io.pushregistry 39
MIDP - Especificação Outros avanços da MIDP 2.0: Ampliação da capacidade de interface com o usuário. Suporte a mídia (wav) Ampliação da capacidade de conectividade (HTTPS, datagram, sockets, server sockets e comunicação com a porta serial) Suporte Over-the-air (OTA) instalação automática pelo ar. 40
MIDP Limitações das aplicações Memória é um recurso particularmente escasso. Os primeiros celulares Motorola habilitados para limitavam o tamanho de uma aplicação a 50K. 41
Conceitos básicos está baseada em 3 conceitos básicos: Configurations Profiles Pacotes opcionais 42
Pacotes opcionais Conjunto de APIs para suportar comportamentos adicionais comuns. Possui dependências específicas com uma configuration particular e/ou um ou mais profiles. Exemplos de pacotes opcionais : RMI Bluetooth JDBC 43
Pacotes opcionais JCP APIs suportadas no Wireless Toolkit JSR API Name JSR 139 CLDC 1.1 Connected Limited Device Configuration JSR 118 MIDP 2.0 Mobile Information Device Profile JSR 185 JTWI 1.0 Java Technology for the Wireless Industry JSR 205 WMA 2.0 Wireless Messaging API JSR 135 MMAPI 1.1 Mobile Media API JSR 75 PIM and File PDA Optional Packages for the Platform JSR 82 Bluetooth and OBEX Java APIs for Bluetooth JSR 172 Web Services Specification JSR 184 3D Graphics Mobile 3D Graphics API for 44
Em resumo Configuration, profile e pacotes opcionais devem ser selecionados. profiles baseados em CDC tornam o desenvolvimento mais simples, mas não é adequado para dispositivos low-end. profiles baseados em CLDC tornam o desenvolvimento mais difícil, especialmente quando é necessário diminuir o tamanho de uma aplicação para executar em muitos dispositivos. 45
46
MIDlets o coração de Do mesmo modo que os Applets e os Servlets as aplicações MIDP são executadas em um ambiente. As aplicação são denominadas de MIDlet, a qual é uma aplicação MID Profile. 47
MIDlets o coração de Toda aplicação deve estender a classe javax.microedition.midlet.midlet para permitir que o programa gerente de aplicação (AMS): controle o MIDlet. Seja capaz de acessar as propriedades do descritor da aplicação. Notificar e requisitar mudanças de estado. 48
MIDlets o coração de A classe que estende a classe MIDlet é a classe principal da aplicação. A classe MIDlet define métodos abstratos que devem ser implementados pela subclasse (por exemplo: startapp(), destroyapp(), notifydestroyed()). 49
MIDlets o coração de 50
MIDlet Suite Um ou mais MIDlets são empacotados juntos em uma MIDlet suite, composta de: Arquivo JAR (Java archive) Arquivo JAD (Java Application Descriptor) Todas as classes definidas pelo usuário e recursos requeridos pelos MIDlets na suite devem estar no arquivo JAR. 51
MIDlet Suite O arquivo JAR file deve também incluir um manifest que descreve os MIDlets na suite. O descritor da aplicação (JAD) contém informação similar, e é usado por dispositivos para obter informação sobre uma MIDlet suite sem ter que baixar e instalar o MIDlet suite primeiro. 52
Criando um MIDlet 53
Criando um MIDlet Importando pacotes específicos do MIDP import javax.microedition.lcdui.*; import javax.microedition.midlet.*; 54
Criando um MIDlet Extends MIDlet Implements CommandListener public class HelloMIDlet extends MIDlet implements CommandListener { 55
Criando um MIDlet Criando um form, adicionando Commands public HelloMIDlet() { mmainform = new Form("HelloMIDlet"); mmainform.append(new StringItem(null, "Hello, Seminar Software Design!")); mmainform.addcommand(new Command("Exit", Command.EXIT, 0)); mmainform.setcommandlistener(this); } 56
Exemplos de classes da API MIDP MIDlet Form Command CommandListener ItemCommandListener Item 57
Exemplos de classes da API MIDlet Base class Form Command CommandListener ItemCommandListener Item 58
MIDlet class API protected abstract void startapp() protected abstract void pauseapp() protected abstract void destroyapp(boolean unconditional) public final String getappproperty(string key) public final void notifydestroyed() 59
Exemplos de classes da API MIDlet Form Command CommandListener ItemCommandListener Item 60
Classe Form Um Form é uma Screen (tela) que contém uma mistura arbitrária de itens: imagens, campos de texto read-only, campos de texto editáveis, campos de data editáveis, medidores, grupos de escolha e itens adaptados. De modo geral, qualquer subclasse da classe Item pode estar contida em um form. A implementação lida com o layout, navegação e rolamento (scrolling). 61
Classe Form API Gerência de Item public int append(item item) public Item get(int itemnum) Layout public void setitemstatelistener(itemstate Listener ilistener) 62
Exemplos de classes da API MIDlet Form Command CommandListener ItemCommandListener Item 63
Classe Command A classe Command representa o significado de uma ação. Objetos Command estão presentes na interface com o usuário. A ação é, de fato, implementada em um objeto CommandListener. O objeto CommandListener é associado com um objeto Displayable ou um Item. Uma vez que o Comando é acionado, o CommandListener é invocado e a ação é realizada. 64
Classe Command Command label public String getlabel() Command type public int getcommandtype() Command priority public int getpriority() 65
Classe Command tipo Label prioridade new Command( Compre", Command.ITEM, 1); new Command("Info", Command.ITEM, 1); new Command( voltar", Command.BACK, 1); 66
Classe Command Tipo BACK CANCEL EXIT HELP ITEM OK SCREEN STOP Comando navigacional para retornar à tela anterior. Comando padrão de cancelamento. Comando padrão de saída da aplicação. Comando para solicitação de ajuda on-line. Comando relacionado com itens na tela ou elementos de escolha. Comando padrão de resposta positiva a um dialogo. Especifica um comando definido pela aplicação que pertence à tela corrente. Comando para parar o processo em execução no momento. 67
Classe Command Prioridade A aplicação usa o valor de prioridade para descrever a importância deste comando relativamente a outros comandos na mesma tela. Valores de prioridade são inteiros, onde um número menor indica maior importância. Tipicamente, a implementação escolhe a colocação de um comando primeiro baseado no tipo de comando e então comandos semelhantes em lugares baseado em uma ordem de prioridade. Isto poderia significar que o comando com a prioridade mais alta é colocado de forma que usuário pode ativá-lo diretamente e o comando com mais baixa prioridade é colocado em um menu. 68
classe CommandListener API O objeto é um listener para Commands que estão associados à Displayable. public void commandaction(command c, Displayable d) 69
classe ItemCommandListener API Quando um command (associado a um Item) é invocado, a aplicação é notificada por meio da chamada ao método commandaction() de um objeto ItemCommandListener que foi associado ao Item. public void commandaction(command c, Item item) 70
Exemplos de classes da API MIDlet Form Command CommandListener ItemCommandListener Item 71
Classe Item Uma superclasse para componentes que podem ser adicionados a um Form. Todos os objetos Item possuem um campo label Escolha o layout, tamanho e aparência do Item Associe Commands 72
Classe Item API public void setdefaultcommand(command cmd) public void setitemcommandlistener(itemcommandlistener listener) public void notifystatechanged() public int getpreferredwidth() 73
Iniciando Passo 1: Baixe Wireless Toolkit da sun: http://java.sun.com/products/j2mewtoolkit/d ownload-2_2.html Passo 2: Instale J2SE SDK Passo 3: Instale o Toolkit. 74
Após a instalação. Atalhos estão disponíveis no menu iniciar. Novos diretórios são criados 75
Usando KToolbar 76
Criando uma nova Aplicação Clique New Project. Entre o nome do projeto e o nome da MIDlet. Novos diretórios serão criados automaticamente. 77
Onde colocar os arquivos? /apps/{proj} fontes, recursos, e arquivos binários /apps/{proj}/bin JAR, JAD, arquivos manifest descompactados. /apps/{proj}/lib Bibliotecas de classes externas, (JAR ou ZIP) para um projeto específico /apps/{proj}/res Arquivos de recursos /apps/{proj}/src Arquivos fonte /apps/lib Bibliotecas de classes externas, (JAR ou ZIP) para todos projetos KToolbar. 78
Depois? Escolha a plataforma Escreva seu código grave Build (Compilar + Preverify) execute 79
Distribuição para dispositivos reais Crie um pacote Coloque o pacote em algum lugar da Internet. Atualize o arquivo.jad Download a aplicação para o celular Execute 80
Exemplos OlaMundo Ola2 Envio de mensagem e registro Push Comunicação HTTP 81
Exemplo: OlaMundo import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class OlaMundoMIDlet extends MIDlet implements CommandListener { private Command exitcommand; // The exit command private Display display; // The display for this MIDlet Comando de tela para sair public OlaMundoMIDlet() { display = Display.getDisplay(this); exitcommand = new Command( Sair", Command.SCREEN, 2); } 82
Exemplo: OlaMundo public void startapp() { TextBox t = new TextBox("Ola Mundo", "Ola mundo!", 256, 0); t.addcommand(exitcommand); Cria a caixa de texto t.setcommandlistener(this); Relaciona o comando com o texto display.setcurrent(t); } Define quem vai escutar o comando public void pauseapp() { } Mostra a tela public void destroyapp(boolean unconditional) { } public void commandaction(command c, Displayable s) { if (c == exitcommand) { destroyapp(false); notifydestroyed(); Implementa a saída da } aplicação } } Se verdadeiro o MIDlet deve liberar todos os recursos. Se falso o MIDlet pode lançar MIDletStateChangeException para indicar que não quer ser destruído neste momento. 83
Exemplo: OlaMundo Criando o projeto no WTK 84
Exemplo: OlaMundo Criando o projeto no WTK Edite o código fonte e o grave em {toolkit}\apps\olamundo\src\olamundo.java Build Execute 85
Exemplo: OlaMundo Simulando o OTA (Over The Air) para deployment 86
Exemplo: OlaMundo Simulando o OTA (Over The Air) para deployment 87
Exemplo: OlaMundo Simulando o OTA (Over The Air) para deployment 88
Exemplo: OlaMundo Simulando o OTA (Over The Air) para deployment 89
Exemplo: OlaMundo Simulando o OTA (Over The Air) para deployment 90
Exemplo: OlaMundo Simulando o OTA (Over The Air) para deployment 91
Exemplo: OlaMundo Simulando o OTA (Over The Air) para deployment 92
Exemplo: OlaMundo (outra versão) import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class OlaMundoMIDlet extends MIDlet implements CommandListener { public void startapp() { Display display = Display.getDisplay(this); Form mainform = new Form("OlaMundoMIDlet"); mainform.append("ola Mundo!"); Command exitcommand = new Command("Exit", Command.EXIT, 0); mainform.addcommand(exitcommand); mainform.setcommandlistener(this); display.setcurrent(mainform); } 93
Exemplo: OlaMundo public void pauseapp() { } public void destroyapp(boolean unconditional) { } public void commandaction(command c, Displayable s) { if (c.getcommandtype() == Command.EXIT ) { notifydestroyed(); } } } 94
Exemplo: OlaMundo no NetBeans Mobile Edition Novo Projeto 95
Exemplo: OlaMundo no NetBeans Mobile Edition Desmarque o Create Hello MIDlet 96
Exemplo: OlaMundo no NetBeans Mobile Edition Pressione Finish 97
Exemplo: OlaMundo no NetBeans Mobile Edition Selecione New File 98
Exemplo: OlaMundo no NetBeans Mobile Edition Pressione Finish 99
Exemplo: OlaMundo no NetBeans Mobile Edition Copie o conteúdo da transparência para o MIDLet Execute o projeto 100
Exemplos OlaMundo Ola2 Envio de mensagem e registro Push Comunicação HTTP 101
Exemplo: Ola2 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; // Ola que pergunta o nome do usuário public class Ola2Midlet extends MIDlet implements CommandListener { private Command exitcommand = new Command("Sair", Command.EXIT, 1); private Command okcommand = new Command("OK", Command.OK, 1); private Form mainform; private Display display; public Ola2Midlet() { mainform = new Form("Ola"); } 102
Exemplo: Ola2 public void startapp() { display = Display.getDisplay(this); mainform.append( new TextField("Entre com seu nome", "", 15, TextField.ANY)); mainform.addcommand(exitcommand); mainform.addcommand(okcommand); display.setcurrent(mainform); mainform.setcommandlistener(this); Indica o tipo do TextField: ANY, DECIMAL, EMAILADDR, INITIAL_CAPS_SENTENCE, INITIAL_CAPS_WORD, NON_PREDICTIVE, NUMERIC, PHONENUMBER, PASSWORD, SENSITIVE, UNEDITABLE, URL } public void pauseapp() { } protected void destroyapp(boolean unconditional) { } 103
Exemplo: Ola2 public void commandaction(command c, Displayable s) { if (c == exitcommand) { destroyapp(false); notifydestroyed(); } else if (c == okcommand) { TextField t = (TextField)mainForm.get(0); mainform.append( new TextField("", "Ola "+ t.getstring(), 15, TextField.ANY)); } } } 104
Exemplos OlaMundo Ola2 Envio de mensagem e registro Push Comunicação HTTP 105
Exemplos: Envio de mensagens O Wireless Toolkit suporta a Wireless Messaging API (WMA) com um ambiente sofisticado de simulação. WMA 1.1 (JSR 120) permite que os MIDlets enviem e recebam mensagens SMS (Short Message Service) ou CBS (Cell Broadcast Service). WMA 2.0 (JSR 205) também inclui suporte para mensagens MMS (Multimedia Message Service). 106
Exemplos: Envio de mensagens No entanto, para se beneficiar completamente do uso de mensagens, seria útil que a aplicação pudesse ser despertada automaticamente, a partir da chegada de uma mensagem ou de um outro evento, como um evento de timer. Este é o conceito capturado pelo registro push, especificado pelo na MIDP 2.0 (JSR 118). 107
Exemplos: Envio de mensagens Deste modo poderemos ter aplicações que recebem e tratam os dados automaticamente, como por exemplo uma aplicação que gera um gráfico das ações da bolsa. Ou uma aplicação que atualiza automaticamente um roteiro de visitas para trabalhadores na rua, em função da chegada de pedidos. 108
Exemplos: Envio de mensagens 109
Exemplos: Envio de mensagens 110
Exemplos: Envio de mensagens O registro de uma aplicação para ser acordada por tempo ou por mensagens pode ser dinâmico ou estático. Dinâmico em tempo de execução, por meio de chamadas a métodos: registerconnection(string connection, String midlet, String filter) registeralarm(string midlet, long time) Estático pela definição no arquivo JAD MIDlet-Push-<n>: <ConnectionURL>,<MIDletClassName>, <AllowedSender> MIDlet-Push-2: socket://:100, corej2me.newslink, * 111
Exemplos: Envio de mensagens Neste exemplo faremos um MIDLet que é ativado automaticamente pela chegada de uma mensagem sms, e que exibe seu conteúdo no display. O registro será estático. 112
Exemplos: Envio de mensagens import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import javax.wireless.messaging.*; import java.io.ioexception; public class PushTeste extends MIDlet implements CommandListener { private Display display; private Command cmexit; private Alert alertamen; int porta = 1000; MessageConnection conexao = null; // Conexao para receber a mensagem Message mensagem; 113
Exemplos: Envio de mensagens public void pauseapp() { } public void destroyapp(boolean unconditional) { } public PushTeste() { display = Display.getDisplay(this); alertamen = new Alert("Mensagem recebida!"); alertamen.settimeout(alert.forever); cmexit = new Command("Sair", Command.EXIT, 1); alertamen.addcommand(cmexit); alertamen.setcommandlistener(this); } 114
Exemplos: Envio de mensagens public void startapp() { String connectlist[]; connectlist = PushRegistry.listConnections(true); if (connectlist == null connectlist.length == 0) { // iniciado pelo usuario, sair destroyapp(false); notifydestroyed(); } else { // iniciado por conexao try { conexao = (MessageConnection) Connector.open("sms://:" + porta); mensagem = conexao.receive(); if(mensagem!= null && mensagem instanceof TextMessage) { alertamen.settitle("enviado por: " + mensagem.getaddress()); alertamen.setstring(((textmessage)mensagem).getpayloadtext()); display.setcurrent(alertamen); } } 115
Exemplos: Envio de mensagens catch(ioexception e) { System.out.println("Exceção!"); } } } public void commandaction(command c, Displayable s) { if (c == cmexit) { destroyapp(false); notifydestroyed(); } } } 116
Exemplos: Envio de mensagens Teste e Instalação Registro estático (alteração no JAD) 117
Exemplos: Envio de mensagens Teste e Instalação Inserindo permissões 118
Exemplos: Envio de mensagens Teste e Instalação Criando o pacote Executando via OTA Enviando mensagens por meio do WMA console 119
Exemplos: Envio de mensagens Teste e Instalação Criando o pacote Executando via OTA Enviando mensagens por meio do WMA console 120
Exemplos: Envio de mensagens Teste e Instalação Criando o pacote Executando via OTA Enviando mensagens por meio do WMA console 121
Exemplos: Envio de mensagens Teste e Instalação Criando o pacote Executando via OTA Enviando mensagens por meio do WMA console 122
Exemplos: Envio de mensagens Teste e Instalação Criando o pacote Executando via OTA Enviando mensagens por meio do WMA console 123
Exemplos OlaMundo Ola2 Envio de mensagem e registro Push Comunicação HTTP 124
Exemplos: comunicação HTTP Os MIDlets podem comunicar por meio do protocolo HTTP Neste exemplo o MIDlet faz uma conexão com um Servlet e recebe a contagem de quantas vezes o Servlet foi requisitado 125
Exemplos: comunicação HTTP O Servlet import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class HitServlet extends HttpServlet { private int mcount; public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String message = "Hits: " + ++mcount; response.setcontenttype("text/plain"); response.setcontentlength(message.length()); response.getwriter().println(message); } } 126
Exemplos: comunicação HTTP O arquivo web.xml <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>bob</servlet-name> <servlet-class>hitservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>bob</servlet-name> <url-pattern>/hits</url-pattern> </servlet-mapping> </web-app> 127
Exemplos: comunicação HTTP A instalação 128
Exemplos: comunicação HTTP O MIDlet import java.io.*; import javax.microedition.io.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class HitMIDlet extends MIDlet implements CommandListener { private Display mdisplay; private Form mmainform; private StringItem mmessageitem; private Command mexitcommand, mconnectcommand; public void pauseapp() {} public void destroyapp(boolean unconditional) {} 129
Exemplos: comunicação HTTP O MIDlet public void startapp() { mdisplay = Display.getDisplay(this); mdisplay.setcurrent(mmainform); } public HitMIDlet() { mmainform = new Form("HitMIDlet"); mmessageitem = new StringItem(null, ""); mexitcommand = new Command("Exit", Command.EXIT, 0); mconnectcommand = new Command("Connect", Command.SCREEN, 0); mmainform.append(mmessageitem); mmainform.addcommand(mexitcommand); mmainform.addcommand(mconnectcommand); mmainform.setcommandlistener(this); } 130
Exemplos: comunicação HTTP O MIDlet public void commandaction(command c, Displayable s) { if (c == mexitcommand) notifydestroyed(); else if (c == mconnectcommand) { Form waitform = new Form("Waiting..."); mdisplay.setcurrent(waitform); Thread t = new Thread() { public void run() { connect(); } }; t.start(); } } 131
Exemplos: comunicação HTTP O MIDlet private void connect() { HttpConnection hc = null; InputStream in = null; String url = getappproperty("hitmidlet.url"); try { hc = (HttpConnection)Connector.open(url); in = hc.openinputstream(); int contentlength = (int)hc.getlength(); byte[] raw = new byte[contentlength]; int length = in.read(raw); in.close(); hc.close(); 132
Exemplos: comunicação HTTP O MIDlet String s = new String(raw, 0, length); mmessageitem.settext(s); } catch (IOException ioe) { mmessageitem.settext(ioe.tostring()); } mdisplay.setcurrent(mmainform); } } 133
Exemplos: comunicação HTTP A configuração 134
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Fazer um MIDLet onde o usuário digite uma temperatura em Fahrenheit e o programa transforme para o equivalente em celcius. C = (F-32)*5/9 135
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Novo Projeto 136
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Novo MIDLet visual 137
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Novo MIDLet visual 138
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans 139
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Criar dois formulários e alterar os nomes 140
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Inserir comandos para a navegação e execução 141
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Criar a navegação 142
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Desenhar as telas 143
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Desenhar as telas 144
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Desenhar as telas 145
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Inserir o código para conversão Colocar o código aqui 146
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Inserir o código para conversão 147
Exemplo:Desenvolvimento de uma aplicação visualmente pelo NetBeans Resultado 148
e Web Services O que é um Web Services É uma aplicação que existe em um ambiente distribuído, como a Internet. Um Web service aceita uma requisição, realiza a função requisitada e retorna uma resposta. Tanto a requisiçao quanto a pergunta, usualmente, são registradas em um documento XML (SOAP), e enviada sobre um protocolo de rede, como o HTTP. É uma nova forma de RPC. 149
e Web Services O que é um Web Services A codificação XML para as mensagens obedecem a especificação SOAP. SOAP: Simple Object Access Protocol. Um protocolo leve com o objetivo de trocar informação estruturada em um ambiente descentralizado e distribuído. Ele provê, por meio de XML, um meio de construir mensagens que podem ser trocadas sobre uma variedade de protocolos. 150
e Web Services Universal Description, Discovery, and Integration 151
e Web Services Java fornece uma api para manipular mensagens SOAP: JAX-RPC. JAX-RPC é uma tecnologia para construir Web services e clientes que usam chamadas remotas a procedimentos e XML. Com JAX-RPC, o desenvolvedor não precisa lidar com SOAP. JAX-RPC cria uma camada que elimina esta complexidade. 152
e Web Services No lado do servidor, o desenvolvedor especifica procedimentos remotos por meio da definição de métodos e interfaces Java. O desenvolvedor também codifica uma ou mais classes que implementam esses métodos. No lado cliente uma proxy é criada (um objeto local representando o serviço) o programa cliente invoca os método da proxy. 153
e Web Services WS-I Basic Profile Provê Compatibilidade Requer: HTTP binding for SOAP HTTP posts WSDL 1.1 RPC/literal ou document/literal 154
e Web Services WSA (Web Services API) JSR 172: Web Services API (WSA) Estende plataforma para suporte a WS através de duas características: Remote Service Invocation XML parsing 155
e Web Services WSA (Web Services API) Requer Conformidade ao WS-I Basic Profile. Suporta SOAP 1.1 156
e Web Services WSA não suporta: SOAP Message Attachments Message Handlers Bibliotecas para service end points UDDI (Universal Description, Discovery and Integration) 157
e Web Services WSA 158
e Web Services WSA 159
e Web Services Exemplo: Primeiramente desenvolveremos um WS, que será acessado posteriormente por uma aplicação. 160
e Web Services Exemplo: Passo: Criar uma aplicação Web 161
e Web Services Exemplo: Passo: Criar uma aplicação Web 162
e Web Services Exemplo: Passo: Criar um Web service 163
e Web Services Exemplo: Passo: Criar um Web service 164
e Web Services Exemplo: Passo: Adicionar um serviço 165
e Web Services Exemplo: Passo: Adicionar um serviço 166
e Web Services Exemplo: Passo: Adicionar um serviço 167
e Web Services Exemplo: Passo: testar o serviço 168
e Web Services Exemplo: Passo: Criar uma aplicação movel 169
e Web Services Exemplo: Passo: Criar uma aplicação movel 170
e Web Services Exemplo: Passo: Criar uma aplicação movel 171
e Web Services Exemplo: Passo: criar o cliente do Web Service 172
Apêndice A: Tópicos adicionais Persistência Comunicação via Bluetooth JXTA - P2P WiFi 173
Apêndice B: Ambientes de desenvolvimento Netbeans com Mobility Pack (Gratuito) Nokia Carbide (pago) Sun Java Wireless Toolkit (Gratuito) EclipseME (Gratuito) Motorola SDK (http://www.motocoder.com/motorola) 174
Apêndice C: Links Nokia - www.forum.nokia.com Sun - http://java.sun.com/javame/ http://www.jasonlam604.com/ Motorola (http://www.motocoder.com/motorola) 175
FIM 176