Programowanie w języku Java Wykład 12: Java Platform, Micro Edition (Java ME) Konfiguracje Standard dla pewnych grup urządzeń Connected Limited Devices Configuration (CLDC) procesor 16-bitowy, 192kB RAM telefony komórkowe, notesy elektroniczne, itp. Connected Device Configuration (CDC) procesor 32-bitowy, 2MB RAM palmtopy, smartfony Programowanie w języku Java 2 1
Profile Standard API dla pewnej grupy urządzeń w ramach danej konfiguracji: MIDP (Mobile Information Device Profile) CLDC uproszczone GUI (dla LCD), midlety Foundation Profile CDC bez GUI, standardowe klasy Javy Personal Basis Profile CDC xlet Personal Profile CDC aplety i AWT Programowanie w języku Java 3 Struktura J2ME Programowanie w języku Java 4 2
Tworzenie aplikacji w CLDC Programowanie w języku Java 5 Biblioteki CLDC java.lang, java.lang.ref typy, stringi, math, wątki, system java.io podstawowe strumienie (brak ObjectStream, Gzip, ZIP) java.util calendar, date, proste kontenery javax.microedition.io connector Programowanie w języku Java 6 3
Profil MIDP CDLC + GUI Dodatkowe biblioteki: javax.microedition.lcdui, javax.microedition.lcdui.game GUI javax.microedition.media, javax.microedition.media.control media player javax.microedition.midlet środowisko aplikacji Programowanie w języku Java 7 Profil MIDP midlety rozszerzają klasę MIDlet. Stany midletu: paused: stan początkowy, po wywołaniu stopapp() active: po wywołaniu startapp() destroyed: po wywołaniu destroyapp() Programowanie w języku Java 8 4
Przykład 1 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class FirstMIDlet extends MIDlet implements CommandListener { private Command exitcommand; private Command infocommand; private Command buycommand; private Display display; public FirstMIDlet() { display = Display.getDisplay(this); exitcommand = new Command("Exit", Command.SCREEN, 1); infocommand = new Command("Info",Command.SCREEN, 2); buycommand = new Command("Buy", Command.SCREEN, 2); public void startapp() { TextBox t = new TextBox ("FirstMIDlet", "Welcome to MIDP Programming", 256, 0); t.addcommand(exitcommand); t.addcommand(infocommand); t.addcommand(buycommand); t.setcommandlistener(this); display.setcurrent(t); public void pauseapp() { public void destroyapp(boolean unconditional) { public void commandaction(command c, Displayable s) { if (c == exitcommand) { destroyapp(false); notifydestroyed(); Programowanie w języku Java 9 Przykład 2 import java.io.*; import javax.microedition.io.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class FirstExample extends MIDlet { private Display display; String url = "http://www.javacourses.com/hello.txt"; public FirstExample() { display = Display.getDisplay(this); public void startapp() { getviastreamconnection(url); catch (IOException e) { System.out.println("IOException " + e); e.printstacktrace(); public void pauseapp() { public void destroyapp(boolean unconditional) { void getviastreamconnection(string url) throws IOException { StreamConnection c = null; InputStream s = null; StringBuffer b = new StringBuffer(); TextBox t = null; c = (StreamConnection)Connector.open(url); s = c.openinputstream(); int ch; while((ch = s.read())!= -1) { b.append((char) ch); System.out.println(b.toString()); t=new TextBox("hello...", b.tostring(),1024,0); finally { if(s!= null) { s.close(); if(c!= null) { c.close(); display.setcurrent(t); Programowanie w języku Java 10 5
Pakiet opcjonalny WMA... import javax.microedition.io.*; import javax.wireless.messaging.*;... MessageConnection conn = null; String url = "sms://+417034967891"; conn = (MessageConnection) Connector.open( url ); TextMessage msg = conn.newmessage( conn.text_message ); msg.setpayloadtext( "Please call me!" ); conn.send( msg ); catch( Exception e ){ // obsługa błędów finally { if( conn!= null ){ conn.close(); catch( Exception e ){... Programowanie w języku Java 11 Pakiet MMAPI... import java.io.*; import javax.microedition.media.*;... Player p = Manager.createPlayer( "http://somesite.com/music.mp3" ); p.start(); catch( IOException ioe ){ catch( MediaException me ){... Programowanie w języku Java 12 6
Konfiguracja CDC pełna implementacja Javy i JVM pełna zgodność z CLDC pakiety opcjonalne: RMI JDBC Web Services AGUI (zaawansowana grafika) Security Programowanie w języku Java 13 Foundation Profile dla urządzeń o ograniczonych zasobach, np. drukarki sieciowe, routery, bez grafiki, GUI wszystkie pakiety Javy (bez AWT) + CDLC Programowanie w języku Java 14 7
Personal Basis Profile Foundation Profile + ograniczone GUI (AWT bez Button, Panel itp.), JavaBeans, RMI xlety: java.microedition.xlet, java.microedition.xlet.ixc, przykładowe zastosowania: interaktywna TV, kamery itp. Programowanie w języku Java 15 Personal Profile pełne GUI (AWT) aplety zastosowania: zaawansowane PDA, wbudowane przegladarki internetowe Programowanie w języku Java 16 8
Xlety import javax.microedition.xlet.*; public class BasicXlet implements Xlet { private XletContext context; public BasicXlet() { public void initxlet( XletContext context ) throws XletStateChangeException { this.context = context; public void destroyxlet( boolean unconditional ) throws XletStateChangeException { public void pausexlet(){ public void startxlet() throws XletStateChangeException { Programowanie w języku Java 17 Stany xletu loaded: xlet jest załadowany i konstruktor jest wykonany paused: xlet zainicjowany (metoda initxlet() jest wykonana) i zatrzymany (metoda pausexlet()), active: xlet działa (aktywowany metodą startxlet()) destroyed: xlet jest zniszczony (metoda destroyxlet()) Programowanie w języku Java 18 9
Przykład xletu (zegar) Programowanie w języku Java 19 Przykład xletu (zegar), cd. import javax.microedition.xlet.*; import java.util.*; import java.awt.*; import java.awt.event.*; public class ClockXlet implements Xlet, ActionListener { TextField display; MyClock clock; Button pausebutton = new Button("Pause"); Button stopbutton = new Button("Stop"); Button resumebutton = new Button("Resume"); XletContext context; public void initxlet(xletcontext ctx) throws XletStateChangeException { Container c; context = ctx; c = ctx.getcontainer(); catch (UnavailableContainerException e) { throw new XletStateChangeException( e.getmessage()); display = new TextField(30); clock = new MyClock(display); pausebutton.addactionlistener(this); resumebutton.addactionlistener(this); resumebutton.setenabled(false); stopbutton.addactionlistener(this); c.setsize(200, 200); c.setvisible(true); c.add(display); c.add(pausebutton); c.add(resumebutton); c.add(stopbutton); clock.start(); public void startxlet() { clock.setpaused(false); resumebutton.setenabled(false); pausebutton.setenabled(true); Programowanie w języku Java 20 10
Przykład xletu (zegar), cd. public void pausexlet() { clock.setpaused(true); resumebutton.setenabled(true); pausebutton.setenabled(false); public void destroyxlet(boolean unconditional) { clock.setstopped(true); public void actionperformed(actionevent e) { if (e.getsource() == stopbutton) { clock.setstopped(true); context.notifydestroyed(); else if (e.getsource() == pausebutton) { clock.setpaused(true); resumebutton.setenabled(true); pausebutton.setenabled(false); context.notifypaused(); else if (e.getsource() == resumebutton) { context.resumerequest(); class MyClock extends Thread { boolean paused, stopped; TextField display; public MyClock(TextField t) { display = t; String gettime() { Calendar rightnow = Calendar.getInstance(); String hour = String.valueOf(rightNow.get( Calendar.HOUR_OF_DAY)); String min = String.valueOf(rightNow.get( Calendar.MINUTE)); if (min.length() == 1) { min = "0" + min; String sec = String.valueOf(rightNow.get( Calendar.SECOND)); if (sec.length() == 1) { sec = "0" + sec; return hour + ":" + min + ":" + sec; Programowanie w języku Java 21 Przykład xletu (zegar), cd. public synchronized boolean isstopped() { return stopped; public synchronized void setstopped(boolean value) { stopped = value; notifyall(); public synchronized boolean ispaused() { return paused; public synchronized void setpaused(boolean value) { paused = value; notifyall(); public void run() { while (!isstopped()) { if (!ispaused()) { Thread.sleep(1); display.settext(gettime()); else { synchronized (this) { wait(); catch (InterruptedException e) { Programowanie w języku Java 22 11
Przykład xletu (komunikacja) import java.rmi.*; import javax.microedition.xlet.*; import javax.microedition.xlet.ixc.*; public class RunOnceXlet extends BasicXlet { private static final String NAME = "RunOnceXlet.activator"; private boolean removebinding = false; public RunOnceXlet(){ public void initxlet( XletContext context ) throws XletStateChangeException { IxcRegistry registry = IxcRegistry.getRegistry( context ); RemoteInterface remote = new RemoteInterfaceImpl(); while( true ){ registry.bind( NAME, remote ); removebinding = true; break; catch( AlreadyBoundException abe ){ remote =(RemoteInterface) registry.lookup( NAME ); String[] args = (String[]) context.getxletproperty( XletContext.ARGS ); remote.activateagain( args ); throw new XletStateChangeException( "Already running" ); catch( NotBoundException nbe ){ catch( RemoteException e ){ System.out.println( "Registry error:" ); e.printstacktrace(); super.initxlet( context ); Programowanie w języku Java 23 Przykład xletu, cd. public void exit(){ if( removebinding ){ IxcRegistry registry = IxcRegistry.getRegistry( getcontext() ); registry.unbind( NAME ); catch( NotBoundException e ){ catch( RemoteException e ){ super.exit(); public interface RemoteInterface extends Remote { void activateagain( String[] args ) throws RemoteException; private class RemoteInterfaceImpl implements RemoteInterface { public RemoteInterfaceImpl() throws RemoteException { public void activateagain( String[] args ) throws RemoteException { System.out.println( "[RemoteInterfaceImpl] Activation request" ); Programowanie w języku Java 24 12
Narzędzia Sun Java Wireless Toolkit, NetBeans Mobility Pack Nokia Developer's Suite for J2ME, Siemens Wireless Java SDK, Sony Ericsson SDK for the Java(TM) ME Platform J2ME Polish Programowanie w języku Java 25 Koniec Programowanie w języku Java 26 13