Fejlett Webes Technolgik II Bilicki Vilmos 2002 10
Fejlett Webes Technológiák II. Bilicki Vilmos 2002. 10. 07
A mai előadás tartalma: l MIDP (Mobile Information Device Profile) • • • Célok, Követelmények Architektúra MIDP könyvtárak: • Rendszer • Időzítők • Hálózatkezelés • Tartós Tárolás • Alkalmazások • Felhasználói interfész
Célok, Követelmények l Követelmények: • Képernyő 96 x 54 • 1 bit színmélység • 128 kbyte nem illékony a MIDP komponensek • • • számára 8 kbyte nem illékony az alkalmazás adatok számára 32 kbyte a Java runtime számára Kétirányú hálózatkezelés
Hatókör: l l l Alkalmazások (a MIDP alkalmazás szemantikája, hogyan futtatjuk) Felhasználói felület UI (kijelző, bevitel) Állandó tár Hálózatkezelés Időzítők
Architektúra
MIDP könyvtárak l l l Rendszer (System Functions) Időzítők (Timers) Hálózatkezelés (Networking) Tartós Tárolás (Persistent Storage) Alkalmazások (Applications) Felhasználói interfész (User Interface)
Rendszer (System Funtions) l l l CLDC-n alapul System properties: • microedition. locale • microedition. profiles (a MIDP verzió) • a jelenlegi beállítás • nyelvkód-ORSZÁGKÓD (en-US, fr-FR, hu-HU) Erőforrások: • java. lang. Class get. Resource. As. Stream(String name) System. exit (MIDlet. notify. Destroyed) Runtime. exit (MIDlet. notify. Destroyed)
Időzítők (Timers) I. l l l Osztályai: • java. util. Timer. Task segítségével egy párhuzamos szálat indíthatunk mely adott időközönként lefuttatja a run metódust az alosztályt a Timer. Task osztályból kell származtatnunk meg kell valósítanunk a run metódust amikor példányosítjuk akkor létrehozunk egy új szálat is, melyet a schedule metódus segítségével elindítjuk A Timer objektumokat egy háttér szál menedzseli (az egyes feladatoknak rövideknek kell lenniük)
Időzítők (Timers) II. l Metódusok: • public void schedule (Timer. Task task, Date • • first. Time, long period) – nem veszi figyelembe a csúszást (animáció) public void schedule. At. Fixed. Rate (Timer. Task task, Date first. Time, long period) – megpróbálja kiküszöbölni a csúszást (hálózati időzítések) public boolean cancel ()
Időzítők (Timers) III. l az időzítésre megadhatunk konkrét időpontot is: Calendar calendar = Calendar. get. Instance(); calendar. set(Calendar. HOUR_OF_DAY, 23); calendar. set(Calendar. MINUTE, 1); calendar. set(Calendar. SECOND, 0); Date time = calendar. get. Time(); timer = new Timer(); timer. schedule(new Remind. Task(), time);
Időzítők (Timers) IV. import java. util. Timer; import java. util. Timer. Task; public class Reminder { Timer timer; public Reminder(int seconds) { timer = new Timer(); timer. schedule(new Remind. Task() , seconds*1000); } class Remind. Task extends Timer. Task { public void run() { System. out. println("Time's up!"); } } public static void main(String args[]) { System. out. println("About to schedule task. "); new Reminder(5); System. out. println("Task scheduled. "); } }
Időzítők (Timers) V. class Remind. Task extends Timer. Task import java. util. Timer; { import java. util. Timer. Task; int num. Warning. Beeps = 3; public void run() public class Annoying. Beep { { if (num. Warning. Beeps > 0) Timer timer; { public Annoying. Beep() System. out. println("Beep!"); { num. Warning. Beeps--; } timer = new Timer(); else { timer. schedule(new Remind. Task(), System. out. println("Time's up!"); 0, 1*1000); System. exit(0); } }}} public static void main(String args[]) { System. out. println("About to schedule task. "); new Annoying. Beep(); System. out. println("Task scheduled. "); } }
Hálózatkezelés I. l l l Generic. Connection framework HTTP protokoll egy része használható Transzparens szolgáltatást kell nyújtania (nem kell tudnunk arról, hogy esetleg nem IP hálózatot is használunk)
Hálózatkezelés II.
HTTP kapcsolat I. l l l HTTP 1. 1 • • • HEAD GET POST • javax. microedition. io • public interface Http. Connection extends javax. microedition. io. Content. Connection Osztályok: Intefészek: • set. Request. Method • set. Request. Property
HTTP kapcsolat II. Http. Connection open. Connection() throws IOException { Http. Connection result; result = (Http. Connection) Connector. open(servlet. Url); result. set. Request. Property("User-Agent", System. get. Property("microedition. profiles")); result. set. Request. Property("Content-Type", "application/binary"); result. set. Request. Method(Http. Connection. POST); return result; }
HTTP kapcsolat III. Data. Output. Stream open. Data. Output. Stream(Http. Connection conn) throws Application. Exception { try { return conn. open. Data. Output. Stream(); } catch (IOException ioe) { throw new Application. Exception(Error. Constants. CANNOT_CONNE CT); } }
HTTP kapcsolat IV. try { conn = open. Connection(); out = open. Data. Output. Stream(conn); out. write. Int(Message. Constants. CREATE_USER); out. write. UTF(c. get. Username()); out. write. UTF(c. get. Password()); out. write. UTF(zip. Code); out. write. UTF(credit. Card. Number); out. close(); in = open. Data. Input. Stream(conn); } catch (IOException ioe) { throw new Application. Exception(Error. Constants. CANNOT_CONNECT); } finally { close. All(conn, out, in); }
Tartós Tárolás l l javax. microedition. rms Record Management Store (RMS) • • Max 8 kbyte A MIDletek futtatása között is megőrzik az értéküket Minden MIDlet-nek saját RMS A neve max. 32 unicode karakter (egyedinek kell lennie) Egymás RMS-ét elérhetik (nincs zárolás, a programozónak kell gondoskodnia erről) Módosítási idő Verzió
Rekordok l Bájt tömb • Egyedi id: • record. Id (elsődleges kulcs, az első 1, …) • Módosítás: • Data. Input. Stream • Data. Output. Stream • Byte. Array. Input. Stream
Fontosabb metódusok l l l l public static Record. Store open. Record. Store (String record. Store. Name, boolean create. If. Necessary) public void close. Record. Store () public int add. Record (byte[] data, int offset, int num. Bytes) public void set. Record (int record. Id, byte[] new. Data, int offset, int num. Bytes) public void delete. Record (int record. Id) public int get. Num. Records () public int get. Size. Available ()
Record store példa try { bout = new Byte. Array. Output. Stream(); dout = new Data. Output. Stream(bout); dout. write. UTF(c. get. Username()); dout. write. UTF(c. get. Password()); byte[] record = bout. to. Byte. Array(); record. Store. add. Record(record, 0, record. length); }
Rekord szűrés I. try { Record. Filter rf = new Record. Filter() { public boolean matches(byte[] candidate) { return candidate[0] == MOVIES_TYPE; } }; Record. Enumeration re = listings. Record. Store. enumerate. Records(rf, null, false); int record. Id = 0;
Rekord szűrés II. int record. Id = 0; if (re. num. Records() > 0) { record. Id = re. next. Record. Id(); byte[] record = listings. Record. Store. get. Record(record. Id); in = new Byte. Array. Input. Stream(record, 5, record. length-5); din = new Data. Input. Stream(in); result = Movie. List. Model. from. Stream(din); if (!result. is. Expired()) { return result; } }
Rekord szűrés III. public static Movie. List. Model from. Stream(Data. Input. Stream in) throws IOException { long expiry. Date = in. read. Long(); Movie[] movies = new Movie[in. read. Int()]; for (int i = 0; i != movies. length; i++) { movies[i] = Movie. from. Stream(in); } return new Movie. List. Model(expiry. Date, movies); }
Alkalmazások l MIDlet csomag: • • • Futtató környezet (MIDlet osztályból származik) Csomagolás (egy JAR fájlban egy vagy több midlet) Alkalmazás leíró (. jad ) • Alkalmazás életciklus (MIDlet osztályból származik) • • • MIDlet-Name MIDlet-Version MIDlet-Vendor MIDlet-Jar-URL MIDlet-Jar-Size • • • Paused Active Destroyed
Minta JAD fájl MIDlet-Name: Card. Games MIDlet-Version: 1. 1. 9 MIDlet-Vendor: Cards. RUS MIDlet-Jar-URL: http: //www. cardsrus. com/games/cardga mes. jar MIDlet-Jar-Size: 7378 MIDlet-Data-Size: 256
import javax. microedition. midlet. *; import javax. microedition. lcdui. *; public class Hello. Vilag 1 extends MIDlet implements Command. Listener { public Hello. Vilag 1() { } protected void pause. App() { } protected void start. App() throws MIDlet. State. Change. Exception { } protected void destroy. App(boolean p 0) throws MIDlet. State. Change. Exception { } public void command. Action(Command p 0, Displayable p 1) { } }
Felhasználói interfész l l l javax. microedition. lcdui Felső szintű (high level) • • Készülék független Nincs sok beleszólás a kinézetbe Alsó szintű (low level) • • Jobban kihasználja a készülékek képességeit Teljes hozzáférés a képernyőhöz Egyszerű események is használhatóak Elérhetjük a az egyes beviteli elemeket
Osztály hierarchia l Képernyő (screen) • • Eseménykezelés Képernyőkezelés egyszerre csak egy lehet belőle látható Három típus: • Display. set. Current() • Képernyő (komplex elemek: List, Text Box) • Általános képernyő (Form, itt lehet 2 szövegmező …) • Alacsony szintű elemekkel foglalkozó képernyők
Elemek I. l l l l Alert - Figyelmeztető képernyő mely egy adott ideig várakozik mielőtt egy másik képernyőre váltana Alert. Type - A figyelmeztetés típusa Canvas – Az alacsony szintű grafika alposztálya Choice. Group – A Form elembe helyezhető válaszható elmeket magában foglaló elem Command – Egy esemény szemanitkus leírására szolgál Date. Field – A Form elemen elhelyezhető dátum beviteli mező Display – A képernyőkezelőt képviseli Displayable – Olyan objektum mely kihelyezhető a képernyőre
Elemek II. l l l Font – A betűk paraméterei Form – Több elemet magába foglaló elem Gauge - Grafikon Graphics - segítségével rajzolhatunk 2 D-ben Image – Kép adatai tartalmazza Image. Item – A kép megjelenítését definiálja Form vagy Alert elmen
Elemek III. l l l l Item – A Form vagy Alert elemekhez adható elemek ősosztálya List - Lista Screen – A magas szintű grafikai elemek ősosztálya String. Item – Karakterlácot tartalmazó elem Text. Box – Szöveg bevitele kiírása Text. Field – A Form elemre elhelyezhető szőveg kiírására szolgáló elem Ticker – Gördülő szöveget tartalmazó elem
Eseménykezelés l l Absztrakt parancsok • • • Command – Displayable objektum add. Command Néhány alapértelmezett parancs már fenn lehet Label, Command. Type, Priority void command. Action(Command c, Displayable d); void item. State. Changed(Item item); • • • public void key. Pressed(int key. Code); public void key. Released(int key. Code); public void key. Repeated(int key. Code); Alacsony szintű események paint() hívások run() metódus hívások
Eseménykezelés class Tetris. Canvas extends Canvas { int left. Key, right. Key, down. Key, rotate. Key; void init () { left. Key = get. Key. Code(LEFT); right. Key = get. Key. Code(RIGHT); down. Key = get. Key. Code(DOWN); rotate. Key = get. Key. Code(FIRE); } public void key. Pressed(int key. Code) { if (key. Code == left. Key) { move. Block. Left(); } else if (key. Code = right. Key) {. . . }}}
package minta; import javax. microedition. midlet. *; import javax. microedition. lcdui. *; public class Helo. Vilag extends MIDlet implements Command. Listener { public Helo. Vilag() { } protected void pause. App() { } protected void start. App() throws MIDlet. State. Change. Exception { Displayable current = Display. get. Display(this). get. Current(); if(current == null) { Kepernyo kepernyo = new Kepernyo("Minta", "Tartalom", this); Display. get. Display(this). set. Current(kepernyo); } } Eseménykezelés
public void command. Action(Command p 0, Displayable p 1) { } protected void destroy. App(boolean p 0) throws MIDlet. State. Change. Exception { } void exit. Requested() { try{ destroy. App(false); notify. Destroyed(); } catch(MIDlet. State. Change. Exception e) { } } }
package minta; import javax. microedition. lcdui. *; public class Kepernyo extends Text. Box implements Command. Listener { private final Helo. Vilag midlet; private final Command exit. Command; public Kepernyo(String cim, String tartalom, Helo. Vilag midlet) { super( cim, tartalom, 256, 0); this. midlet = midlet; exit. Command = new Command("Kilep", Command. EXIT, 1); add. Command(exit. Command); set. Command. Listener(this); } public void command. Action(Command c, Displayable p 1) { if (c == exit. Command) { midlet. exit. Requested(); } } } Alacsony szintű grafika
Eredmény
Forrás l Mobile Information Device Profile (JSR-37) JCP Specification Java 2 Platform, Micro Edition, 1. 0 a (http: //jcp. org/about. Java/communityprocess/final/jsr 0 37/index. html )
- Slides: 40