490 likes | 564 Views
16 a 18 de Junho – Anhembi – SP/SP. MIDP 3.0: O Futuro do Java ME. Por. Marlon Luz e Luiz Anjos. AGENDA. Introdução Interface de Usuário Categoria de MIDlets Biblioteca Compartilhada Comunicação Inter-MIDlet MIDlets Concorrentes Eventos Persistência. Introdução.
E N D
16 a 18 de Junho – Anhembi – SP/SP MIDP 3.0: O Futuro do Java ME Por Marlon Luz e Luiz Anjos
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Introdução • MIDP 1.0 Setembro – 2000 • MIDP 2.0 Novembro – 2002 • MIDP 3.0 ?
Introdução • Formação Inicial – Março 2005 • Final Approval Ballot – Maio 2006 • 61 Empresas • 10 Contribuidores individuais
Introdução • Requisitos
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Interface de Usuário • Command • Display • File Selector • Menu • Notificações • Tabbed Pane
Interface de Usuário • Command • Localização exata • Habilitado/Desabilitado • Suporte à imagens • Mutável
Interface de Usuário • Display • Display secundário • Display.getDisplays(…) • Características para um display secundário (SUPPORTS_COMMANDS, INPUT_EVENTS, FORMS, TICKER, TITLE, ALERTS, LISTS, TEXTBOXES, FILESELECTORS, TABBEDPANES)
Interface de Usuário • Display • Estado sobre o hardware (ENABLED, DISABLED, ABSENT) • Estado sobre o display (foreground, background, visible) • Suporte a orientação paisagem
Interface de Usuário • File Selector • Objetos Command default (OK, CANCEL) • Não permite novos Commands • Modos LOAD, SAVE e DIRECTORY • getDirectory(), getFile(), setFilterExtensions(String extensions)
Interface de Usuário • Menu
Interface de Usuário • Menu • Container visual para objetos Command • Usado com a localização exata de um Command • Choice.IMPLICIT • Pode conter sub-menus • CommandListener do objeto Displayable
Interface de Usuário • Menu Menu m, sm1, sm2; Command cmd1, cmd2, cmd3; m = new Menu(“Top Menu", "", menupict.gif); sm1 = new Menu("Submenu 1", “", menupict.gif); sm2 = new Menu("Submenu 2", “", menupict.gif); cmd1 = new Command(“First",”", Command.ITEM, 1); cmd2 = new Command(“Second",””, Command.ITEM, 1); cmd3 = new Command("Third",”", Command.ITEM, 1); m.append(cmd1); m.append(sm1); sm1.append(cmd2); sm1.append(sm2); sm2.append(cmd3);
Interface de Usuário • Notificações • NotificationManager / Notification • MIDlet não controla UI • Dependente da implementação • post() para registrar notificações
Interface de Usuário • Notificações Notification n=NotificationManager.createNotification(nl); n.setLabel("Mensagem não lida (1)"); n.setIcon("resources/mail1.jpg"); n.post();
Interface de Usuário • Tabbed Pane • Objetos Screen separados por abas • List e Form • Objetos Command (Tab e seu conteúdo)
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Categoria de MIDlets • Screen Saver • Auto Start • Idle Screen
Categoria de MIDlets • Screen Saver • Aplicação executada automaticamente • Device no estado de “Idle” • Identificação baseado em atributo • MIDlet-Category-n: ScreenSaver • Ativação e desativação baseados em eventos • Usuário ciente do processo de atualização
Categoria de MIDlets • Auto Start • “Power up” do device • Identificação baseada em atributo / permissão • MIDlet-Category-n: autostart • Tentativa para reiniciar o MIDlet (AMS) • javax.microedition.midlet.AutoStartPermission
Categoria de MIDlets • Idle Screen • Adiciona conteúdo para a tela de “Idle”
Categoria de MIDlets • Idle Screen • Identificação baseada em atributo • MIDlet-Category-n: IdleScreen • IdleItem como elemento de UI • IdleItem, subclasse de CustomItem • Display.setIdleItem(idleItem)
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Biblioteca Compartilhada • LIBlet
Biblioteca Compartilhada • LIBlet • Componente de Sofware • Não possui um contexto próprio • Atributos definidos nos arquivos JAD e JAR • Empacotado em um arquivo JAR • Dependências via atributo Dependency-<n>
Biblioteca Compartilhada • LIBlet • Dependência circular
IMS MIDlet Poc LIBlet JSR 281 Biblioteca Compartilhada • LIBlet
Biblioteca Compartilhada • MIDlet IMSMIDlet JAD MIDlet-1: IMSMIDlet, icon.png, IMSMIDlet MIDlet-Name: IP Multimedia App MIDlet-Version: 1.0 MIDlet-Vendor: Multi Sys MIDlet-Jar-Size: 12123 Dependency-1: microedition.ims; JCP; 1.0+; standard Dependency-2: PocLib; Poc Sys, Inc.; 1.1.2; liblet LIBlet-Dependency-JAD-URL-2: http://www.pocsys.com/liblets/poclib.jad LIBlet-Dependency-Jar-SHA1-2: 501A202E919B9C98343FAD6F46842412F7A0A783
Biblioteca Compartilhada • LIBlet PocLib JAD LIBlet-Name: PocLib LIBlet-Version: 1.1.2 LIBlet-Vendor: Poc Sys, Inc. LIBlet-Jar-Size: 12123 LIBlet-Jar-URL: http://www.pocsys.com/liblets/poclib.jar
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Comunicação Inter-MIDlet • Protocolo IMC • Conexão assíncrona • Cliente e Servidor • MIDlet UID (nome + vendedor + versão) • IMCConnection / IMCServerConnection • Permite Push Registry
Comunicação Inter-MIDlet IMCConnection conn = (IMCConnection)Connector.open( "imc:// *:com.foo.services.barServer:1.0;authmode=false"); try { DataOutputStream request = conn.openDataOutputStream(); // escreve dados ... request.flush(); DataInputStream response = conn.openDataInputStream(); // recupera dados ... } finally { conn.close(); }
Comunicação Inter-MIDlet IMCServerConnection serverConn = (IMCServerConnection)Connector.open( "imc://:com.foo.barServer:1.0;authmode=false;); while(true) { IMCConnection conn = (IMCConnection) serverConn.acceptAndOpen(); try { String requestedVersion = conn.getRequestedServerVersion(); DataInputStream requestData = conn.openDataInputStream(); DataOutputStream responseData = conn.openDataOutputStream(); // faz a leitura de dados a partir da inpustream int requestType = requestData.readInt(); ... // trata a requisição ... // escreve a resposta para output stream responseData.writeUTF(“Olá, eu sou barServer"); responseData.close(); } finally { conn.close(); } }
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
MIDlets Concorrentes • Características • Implementação DEVE suportar que aplicações executem simultaneamente • Dados estáticos não são compartilhados • Manipulação de erros • 1 MIDlet, 1 instância
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Eventos • Características • Mudanças no estado do sistema • Comunicação Aplicação x Aplicação • EventManager, EventData, EventPermission, EventDataListener
Eventos • Características • AUDIO_OUTPUT, BATTERY_CHARGING, BATTERY_LEVEL, BODY_OPEN, IDLE_SCREEN_MODE, SCREENSAVER_MODE, SYSTEM_STATE,VOICE_CALL • Aplicações executadas automaticamente (1 instância) • Registro estático / dinâmico para aplicações
Eventos • Consultando um evento de sistema EventManager ssm = EventManager.getInstance(this); EventData battery = null; try { battery = ssm.getCurrent(BATTERY_LEVEL); } catch (SecurityException e) { .. } int batteryLevel = battery.getInt();
Eventos • Adicionando um EventListener EventData battery; boolean authmode = false; EventManager ssm = EventManager.getInstance(this); ssm.addEventListener(BATTERY_LEVEL, this, authmode, 10, 20);
Eventos • Manipulando um evento handleEvent(EventData event) { String eventName = event.getName(); int batteryLevel; if (eventName.equals(BATTERY_LEVEL)) { batteryLevel = event.getInt(); } }
Eventos • Registro estático (App) MIDlet-Name: PowerManagement MIDlet-Version: 1.0.1 MIDlet-Vendor: FictionalCo MIDlet-1: PowerManager, /pwrmgt.png, com.fictionalco.PowerMgr MIDlet-Event-Launch-1: com.fictionalco.PowerMgr;authmode=false; BATTERY_LEVEL=5,100 MicroEdition-Profile: MIDP-3.0 MicroEdition-Configuration: CLDC-1.1 MIDlet-Jar-URL: http://www.fictionalco.com/SysUtils.jar
Eventos • Registro dinâmico (App) EventData battery; boolean authmode = false; EventManager ssm = EventManager.getInstance(this); try { ssm.registerApplication(BATTERY_LEVEL, "com.fictionalco.PowerMgr", authmode, 0, 10); } catch (SecurityException e) { .. }
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Persistência • RMS • Segurança • Algorítimo: AES 128-bit • RMS Provisioning • Arquivos standalone / JAR da aplicação (MIDlet - LIBlet) • Persistent-Data-URL-1: data.rms overwrite encryptLocally • Persistent-Data-URL-2: http://vendor.com/gamedata/coolgame.rms • Importação e Exportação • Tags
AGENDA • Introdução • Interface de Usuário • Categoria de MIDlets • Biblioteca Compartilhada • Comunicação Inter-MIDlet • MIDlets Concorrentes • Eventos • Persistência
Outras Mudanças • Interface de usuário • Imagens Animadas • Splash Screen • Table Layout • TextInput • Font (TrueType) • Segurança • Autorização de acesso em nível de aplicação • Network • IPV6 • Binding para adaptador de rede em nível de app • PUT e DELETE
MIDP 3.0: O futuro do Java ME • Luiz Anjos – anjos.luiz@gmail.com • Marlon Luz – marlon.luz@lightmobile.com.br