Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso,...

80
Jornada de Cursos - J2ME Aula 6 – MIDP 2.0

Transcript of Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso,...

Page 1: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Jornada de Cursos - J2ME

Aula 6 – MIDP 2.0

Page 2: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Pausa para reflexão

"Sem esforço não há progresso, mas com esforço também não há progresso”

Ryotan Tokuda, Mestre Zen

Page 3: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Agenda• MIDP 2.0 Technical Overview• MIDP Desenvolvimento e Deployment• API´s• Wireless Messaging API• Práticas de programação

Page 4: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Technical Overview

Page 5: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

APIs de MIDP 1.0• Modelo de aplicação:

• Javax.microedition.midlet• Persistência

• Javax.microedition.rms• Rede

• Javax.microedition.io.HTTPConnection• Interface gráfica

• Javax.microedition.lcdui• IO e pacotes util de CLDC

• Java.lang• Java.io• Java.util

Page 6: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

MIDP 2.0• Objetivos de MIDP 2.0

• Compatibilidade com MIDP 1.0• Foco contínuo em telefones com poucos recursos• Usar informação dos deployments MIDP 1.0 para

criar um modelo mais aprimorado• Foco em aplicações core necessárias a todos os

dispositivos e aplicações

Page 7: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

MIDP 2.0 - Novas características• Novos protocolos de rede

• HTTPS, Comm, Datagram, SSL, Socket, ServerSocket• Nota: Somente HTTP e HTTPS são requeridos pela

especificação• Funcionalidade Push

• Possibilidade de iniciar um MIDlet em resposta a uma mensagem

• OTA• Game API• UI melhorada• platformRequest

Page 8: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Requisitos mínimos• Display:

• Tamanho de tela: 96x54• Profundidade de display: 1 bit• Pixel aspect ratio: 1:1

• Input• One or two handed keyboard, touch screen

• Memória:• 256 kb de memória não-volátil• 8 kb para dados persistentes• 128 kb de memória volátil

Page 9: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Requisitos (cont.)• Rede:

• Two-way• Wireless• Possibilidade de intermitência, com uma banda

limitada• Som

• Pode tocar tons, via HW ou SW

Page 10: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Desenvolvimento e Deployment

Page 11: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Verificação de classfiles em CLDC

Page 12: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Passos1. Escreva sua aplicação2. Compile-a3. Use o preverifier4. Empacote-a

1. Assine o JAR (só em MIDP 2.0)5. Crie o descritor6. Publique a suite MIDlet7. Instale via OTA

Page 13: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Prática recomendada: OTA• MIDP 1.0 deixou não especificado OTA• MIDP expert group lançou OTA para clarificar

detalhes• Requisito core em MIDP 2.0

Page 14: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

OTA

Page 15: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

OTA

Page 16: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

OTA

Page 17: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

OTA

Page 18: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Versões• Agora que temos MIDP 1.0 e 2.0, é preciso

saber a versão que estamos trabalhando• System.getProperty(“MicroEdition-Profile”)

• Por default, o JAM não instalará MIDP 2.0 em aparelhos MIDP 1.0

Page 19: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

MIDP 2.0 APIs

Page 20: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

MIDP 2.0 APIs• Segurança e segurança em rede• Push API• Media APIs• APIs de interface gráfica• Game API

Page 21: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Segurança

Page 22: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Riscos de segurança inclusos• Aplicações usando o dinheiro do usuário sem

permissão• Mensagens SMS podem custar 10 centavas por

mensagem, e com 7 mensagens: 1k de dados• Informações privadas sendo expostas

• Contatos• DOS potenciais, códigos maliciosos, etc

Page 23: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Modelo de segurança do MIDP 2.0• MIDlet suites requerem segurança• Cada MIDlet suite está atrelada a um único

domínio de proteção contendo as permissões• Restrições da API a funções fundamentais• Extensível a APIs desenvolvidas

independentemente (WMA, MMAPI, etc)

Page 24: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Tipos de permissão• Permissões Allowed

• Sem prompt para verificar se é válido• Permissões de usuário

• Garantidas com aprovação do usuário• Usuário escolhe a frequência de prompt:

• Blanket – válido até o usuário configurar o contrário• Session – válido para uma invocação• Oneshot – válido para uma chamada da API

• Um datagrama sendo enviado

Page 25: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Dois tipos de domínio de proteção• Untrusted domains

• Sandbox, como MIDP 1.0• Tipicamente, dispositivo pergunta ao usuário por

acesso• Trusted domains

• Dispositivo tem mecanismo para validar a suite• Pode permitir acesso sem prompt• Geralmente implementado usando criptografia de

chave pública para assinar o JAR

Page 26: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Modelo de segurança

Page 27: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Modelo de segurança – Cont.

Page 28: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Trusted signed applications• Descritor de aplicação inclui:

• Assinatura do JAR• Certificados necessários para verificar assinatura• Permissões requeridas pela aplicação

• Dispositivo autentica assinatura• Usando chave pública raiz do dispositivos• Cercado pelo domínio de proteção

Page 29: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Permissões no WTK• Atributos MIDlet-Permissions eMIDlet-Permissions-optdo painel Projetc | Settings

Page 30: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Assinando MIDlets• Assinar com keytool, JADtool e MEKeytool

pode ser complexo• WTK oferece assinar MIDlets via GUI

• Cria um par de chaves e um alias• Crie o certificado• Adicione um certificado de par de chaves ao JAD• Assine o JAR e adicione a assinatura ao JAD

Page 31: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Segurança em rede• HTTP e HTTPS necessários para MIDP 2.0• Datagrama – pouco overhead, mas inseguro• Socket – streams confiáveis• Socket seguro – stream confiável sobre

SSL/TLS• Conexão a porta serial• Wireless Messaging – WMAPI

Page 32: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Segurança em MIDP 2.0• HTTPConnection e HTTPSConnection• Possibilidade de utilizar sockets puros

(SecureConnection)• MIDP 2.0 define a interface SecurityInfo para

informações detalhadas

Page 33: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

SecureConnection• Define uma conexão com sockets seguros• Uma conexão segura é estabelecida com

Connector.open() quando “SSL” é especificadoNa URI, por exemplo:

Connector.open(“ssl://host.com:70”);• A implementação escolhe entre:

• Protocolo TLS versão 1.0• Protocolo SSL versão 3.0

Page 34: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

SecurityInfo• Define os métodos para acessar informação

numa conexão segura• Oferece o certificado, protocolo, versão, suite

de cifragem, etc. Uso:SecureConnection sc = (SecureConnection)

Connector.open(“ssl://host.com:70”);SecurityInfo info = sc.getSecurityInfo();System.out.print(“Protocol ” + info.getProtocolName);...

Page 35: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Push (ou AutoLaunch)

Page 36: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Aplicação de rede• Não é possível criar MIDlets do tipo servidor

• Limitações de plataforma:• Sem multi-threading• Sem processos daemon

• Limitações de recursos computacionais• Segurança

• Solução – conexão offline ao servidor• Confia num proxy para cuidar da primeira

invocação• Conexão inbound

Page 37: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

PushRegistry• MIDP 2.0 define um mecanismo de push

• MIDlets podem ser acordados por eventos externos• Push Registry é manuseado pelo AMS• Duas maneiras de se registrar:

• Estática: MIDlet-Push-<n> no JAD• Dinâmica: PushRegistry.registerConnection()

Page 38: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Esquema geral

Page 39: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

MMAPI

Page 40: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

MMAPI em MIDP 2.0• MIDP 2.0 Media API é um subconjunto da

Mobile Media API (JSR 135)• Somente Sons

• Pacotes:• javax.microedition.media• java.microedition.media.control

Page 41: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Áudio em MIDP 2.0• Implementações têm que suportar geração de

tons e WAV• Tipos adicionais são opcionais

• Para geração de tons:• Manager.playTone();

• Para playback de algum som em formato WAV, crie um objeto Player

• O objeto Player tem os métodos start/stop/pause

Page 42: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Exemplos de código• Geração de tons:

try{Manager.playTone( ToneControl.C4 , // nota

5000, //ms100); //volume

} catch(MediaException mee) {}• Playback com looping

try{Player p = Manager.createPlayer(http://myMusicServer/music.wav);p.setLoopCount(5);p.start();

} ...

Page 43: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Exercício• Crie um MIDlet que toca associa um som a cada

tecla. Pode ser wav, midi, etc.

Page 44: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Interface Gráfica

Page 45: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Interface com o usuário• Popup ChoiceGroup

• Novo tipo: POPUP• Alerts podem ter comandos• Comandos podem ser associados a Item• Layout para Item• Custom Items• Classe Spacer

Page 46: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Items• É possível setar tamanhos esperados• Comandos agora podem ser associados a Items

• ItemCommandListener• Default command

• SetDefaultCommand• Custom Items

• A coqueluche de MIDP 2.0• Sobrecarrega o método paint

• Layout• Várias opções de layout

Page 47: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Exercício• Crie um custom item que cada vez que é

selecionado, realiza um tipo de pintura diferente. Ex.: uma seta que pisca de vermelho e azul

Page 48: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Game API

Page 49: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Game API• Conjunto com 5 classes que simplificam o

desenvolvimento de jogos 2D• GameCanvas• Layer• Sprite• TiledLayer• LayerManager

• Provêem 2 importantes funcionalidades• GameCanvas• Estruturação do jogo em camadas

Page 50: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

GameCanvas• Subclasse de Canvas• Fornece offscreen buffer

• Somente 1 classe extende de GameCanvas• Armazena o estado de pressionamento das teclas,

podendo serem consultados a qualquer momentoint keyState = getKeyStates();

if ((keyState & LEFT_PRESSED) != 0) { sprite.move(-1, 0); }

Page 51: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Loop de jogo com Canvaspublic class MicroTankCanvas extends Canvas implements Runnable {

public void run() { while (true) {

// Update the game state. repaint();

// Delay one time step. }

}

public void paint(Graphics g) { // Painting code goes here.

}

protected void keyPressed(int keyCode) { // Respond to key presses here.

}}

Page 52: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Loop de jogo com GameCanvaspublic class MicroTankCanvas extends GameCanvas implements Runnable {

public void run() { Graphics g = getGraphics();while (true) {

// Update the game state. int keyState = getKeyStates();// Respond to key presses here.// Painting code goes here. flushGraphics(); // Delay one time step.

}}

}

Page 53: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Exercício• Crie uma aplicacao que consiste de um cursor e

é possível movimentá-lo.

Page 54: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Layer• Representa um elemento visual do jogo• Possui posição relativa à tela (x,y) além de

dimensões (largura, altura)• Método paint a ser implementado• Em um dado momento pode estar visível ou

não

Page 55: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Layer - Métodos• int getHeight()• int getWidth()• int getX()• int getY()• paint(Graphics g)• setVisible(boolean visible)

Page 56: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

TiledLayer

Page 57: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

TiledLayer – cont.

Page 58: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

TiledLayer - métodos• TiledLayer (int columns, int rows,

Image image, int tileWidth, int tileHeight) • int getCell (int col, int row) • paint (Graphics g) • setCell (int col, int row, int tileIndex)

Page 59: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

LayerManager• Gerencia uma série de layers• Define a ordem na qual os layers são

renderizados e em qual região da tela• Simplifica o processo de renderização• Define regiões em relação ao eixo-z

Page 60: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

LayerManager – cont.

Page 61: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

LayerManager - métodos• void append (Layer l) • Layer getLayerAt (int index) • void insert (Layer l, int index) • paint (Graphics g, int x, int y) • setViewWindow (int x, int y, int width,

int height)

Page 62: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Sprite• Elemento visual do jogo que pode ser

renderizado a partir de um ou mais frames• Possui métodos para rotação, colisão e

animação• Pixel de referência

Page 63: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Pixel de Referência

Page 64: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Exercício• Utilize as classes TiledLayer e Sprite para criar

o efeito de um jogo de tanque.• Lembre-se que já vimos como é o loop de um jogo

simples• Os sprites e as figuras do tiled layer vão ser

fornecidos.

Page 65: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

PlatformRequest• javax.microedition.midlet.MIDlet.platformRequest()• Facilidade para acessar serviços externos:

• Numeros• Suites MIDlet em enderecos http

• Método não-bloqueante• Não enfileira chamadas• Ex.:

• platformRequest(“http://www.cin.ufpe.br/~ela/jornada/myGame.jad”);

• platformRequest(“+358-555-1234567”);

Page 66: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Suporte no WTK• Adiciona ao system.config

• com.sun.midp.midlet.platformRequestCommand: “ENDERECO DO BROWSER”

Page 67: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Wireless Messaging API

Page 68: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Wireless Messaging API – JSR 120• Acesso padrão a mensages• WMA foi desenhada para rodar em qualquer

configuração• Endereça as seguintes tecnologias:

• Short Message Service – SMS• Cell Broadcast Service – CBS

• Suporta mensagens multimidia, incluindo sons, imagens e texto

Page 69: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Wireless Messaging API – JSR 120• Baseada no Generic Connection Framework• Design da funcionalidade é parecida com

UDPDatagramConnection• Já que existem diferenças entre mensagens e

datagramas, WMA interfaces definidas em javax.wireless.messaging

• Dois modos de receber mensagens• Usando o metodo receive

• Bloqueia a Thread atual• Definindo um MessageListener

Page 70: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

MessageListener• Implementa o ouvinte para receber objetos

mensagem• Define um único método

notifyIncomingMessage(), que é invocado cada vez que uma mensagem chega

• Para se registrar para mensagens, use o método MessageConnection.setListener()

Page 71: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Boas práticas

Page 72: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Boas práticas• Cuidado com exceções de segurança• Design para rede de um modo assíncrono• Use uma thread para ler• Use uma thread para escrever• Registro para autolaunch

Page 73: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Exceções de segurança• Não use getMessage(),o usuário não quer ver isso• Ofereça uma sugestão• Use imagens• Espere pela confirmaçãodo usuário

Page 74: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Desenhe para threads• I/O blocks numa threadSeparada• Exceções de I/O • Feche as conexões

Page 75: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Usando uma thread para ler• Mantenha thread ativa• Até ser mandado umstop• Ou ocorrer uma exceção

Page 76: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Use threads para enfileirar escritas• Use o open connection• Enfileire os dados a seremescritos• Use uma thread separadapara escrever

Page 77: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Usando uma thread para escrita• No método run, enfileireas chamadas• Desenfileire os dadosa serem escritos• Crie um datagrama parae mande-o

Page 78: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Checando autolaunch• Pegue uma lista das conexões ativas• Abra as conexões ativas• Manuseie I/O normalmente

Page 79: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Referências• Core J2ME• Site da Sun• Wireless Programming with J2ME: Cracking the

code, ISBN: 0-7645-4885-9

Page 80: Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso, mas com esforço também não há progresso” Ryotan TokudaRyotan.

Agora que acabou

"Sem esforço não há progresso, mas com esforço também não há progresso”

Ryotan Tokuda, Mestre Zen

Alguém finalmente entendeu o que danado é isso????