Java-Kurs: J2ME Programmierung von Embedded Devices mit der Java 2 Plattform, Micro Edition David Vogler [email protected] Steinbeis-Transferzentrum Softwaretechnik j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.1 Übersicht Java 2 Plattform, Micro Edition (J2ME) MIDlets Struktur eines MIDlets Grafische Oberfläche Speichern von Daten Netzwerkzugriff über HTTP Vorbesprechung der Laborübung Palm OS Plattform - Entwicklungsprozess Kompilieren und Installieren im Emulator j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.2 Javakurs: J2ME J2ME - CLDC - MIDP j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.3 Java 2 Plattformen Server & Enterprise Computer Optionale Pakete Java 2 Enterprise Edition (J2EE) Desktop Computer Optionale Pakete Java 2 Standard Edition (J2SE) High−End Consumer Geräte Low−End Consumer Geräte Smart− Cards Persönliches Profil Java Virtual Machine Foundation Profil MIDP CDC CLDC Java Card APIs KVM CardVM Java 2 Micro Edition (J2ME) j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.4 Java 2 MicroEdition Hierarchischer Aufbau der Micro Edition Profil(e) CLDC { CLDC Bibliotheken Virtuelle Maschine Host Betriebssystem j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.5 Java 2 MicroEdition J2ME als Untermenge + Erweiterungen zu J2SE Java Standard Edition Java Micro Edition MIDP CLDC j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.6 J2ME - CLDC Connected Limited Device Configuration 160 bis 512 Kilobytes Hauptspeicher verfügbar 16-bit oder 32-bit Prozessor geringer Stromverbrauch, oft batteriebetrieben Verbindung zu einem Netz, oft schnurlose Verbindungen, die unterbrochen werden können und auf eine Bandbreite von 9600 kBit/s beschränkt sind j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.7 J2ME - MIDP Mobile Information Device Profile Memory: 128 KB nichtflüchtiger Speicher für MIDP Komponenten 8 KB nichtflüchtiger Speicher für Daten der Anwendungen 32 KB flüchtiger Speicher für die Virtual Machine Display: Bildschirmgröße: 96x54 Farbtiefe: 1-bit Pixel Shape: annähernd 1:1 j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.8 J2ME - MIDP Mobile Information Device Profile Eingabe: Einer oder mehrere der folgenden Eingabemechanismen: „einhändiges” Keypad „beidhändige” Tastatur Touch-Screen Netz-Verbindungen: Zwei-Wege-Verbindung Wireless wird möglicherweise unterbrochen limitierte Bandbreite (9600 kBit/s) j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.9 J2ME - MIDP MIDP Spezifikation Die MIDP-Spezifikation umfasst folgende Bereiche: User Interface Unterstützung: Limited Connected Device User Interface (LCDUI) Netzwerk-Unterstützung (basierend auf HTTP) Persistente Datenspeicherung: Record Management System (RMS) Verschiedene Klassen wie Timer und Exceptions j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.10 Javakurs: J2ME MIDlets Life-Cycle User Interface Kommandos Command Listener Record Management System j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.11 Life-Cycle Konstruktor: Initialisierung der Anwendung Erzeugen von Screens und Objekten für den Programmstart Erster Bildschirm für den Benutzer startApp(): Wird vom Application-Manager aufgerufen Macht Screen via Display.setCurrent() sichtbar Freigesetzte Ressourcen von pauseApp() beachten! pauseApp(): Unbenutzte Ressourcen freigeben! destroyApp(): Alle Ressourcen freigeben Alle Threads stoppen j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.12 Zustandsübergänge new PhoneBook() pauseApp() Paused Active startApp() destroyApp() Destroyed destroyApp() j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.13 User Interface Klassenhierarchie Display 0..1 Displayable Canvas Alert Screen List TextBox Form 0..n Item StringItem ImageItem TextField DateField ChoiceGroup Gauge j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.14 User Interface Screen Klassen: List: Auswahlliste mit vordefinierten Werten TextBox: Texteingabe-Feld Alert: Informationsanzeige (Text/Bild), zeitlich begrenzt Form: Container für unterschiedliche UI-Elemente: StringItem: Strings ImageItem: Bilder (PNG-Format) TextField: Texteingabe DateField: Zeit- und Datumsanzeige Gauge: Grafische Darstellung von Werten ChoiceGroup: Einzel- oder Mehrfachauswahl j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.15 Kommandos Kommandos und Kommandotypen MIDP Anwendungen definieren Commands: Werden einem screen hinzugefügt: Displayable.addCommand() Das Command-Objekt hat drei Parameter: Label: Bezeichner für den Anwender CommandType: Typ des Kommandos. Priority: Anordnung auf dem Display j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.16 Aktionen Command Listener Anwendungs-Handling der Kommandos über Listener-Modell Jedes Displayable-Objekt hat einen einzelnen Listener Wird ein Command gewählt, so wird der Listener aufgerufen Listener werden registriert: Displayable.setCommandListener() Objekt muss das Interface CommandListener und die Methode commandAction() implementieren j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.17 Hello World package j2mekurs; import javax.microedition.midlet .∗; import javax.microedition. lcdui .∗; public class HelloWorld extends MIDlet implements CommandListener { private Command exitCommand; private TextBox tb; public HelloWorld() { exitCommand = new Command("Exit", Command.EXIT, 1); tb = new TextBox("Hello MIDlet", "Hello, World!" , 15, 0); tb .addCommand(exitCommand); tb .setCommandListener(this); } ... j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.18 Hello World ... protected void startApp() { Display.getDisplay(this ). setCurrent(tb ); } protected void pauseApp() {} protected void destroyApp(boolean u) {} public void commandAction(Command c, Displayable d) { if ( c == exitCommand) { destroyApp(false); notifyDestroyed (); } } } j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.19 List Beispiel List list = new List("Border Style", Choice.EXCLUSIVE) list .append("None", null); list .append("Plain", null ); list .append("Fancy", null); // Kommando hinzufuegen list .addCommand(backCommand); list .addCommand(okCommand); ... public void commandAction(Command cmd, Displayable d) { if ( cmd == okCommand) { int i = ( List )d.getSelectedIndex(); // Index des ausgewaehlten Listenelements benutzen } else if ( cmd == backCommand) { // " back" Kommando abarbeiten } } j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.20 RecordStores recordId 1 recordId 5 recordId 10 recordId 2 RecordStore j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.21 Umgang mit RecordStores RecordStores werden über einen Bezeichner angesprochen: openRecordStore(RSName, true) Methoden für RecordStores: getName(): liefert Name des RecordStores getNumRecords(): liefert Anzahl der Records getSize(): Anzahl Bytes im RecordStore getSizeAvailable(): Verfügbarer Platz auf dem Palm getNextRecordId(): recordId für den nächsten Record getVersion(): Version des RecordStore. +1 bei jedem Zugriff getLastModified(): System.currentTimeMillis des letzten Zugriffs Methoden für Records: addRecord(): byte array, offset und Länge als Parameter deleteRecord(): Löschen über recordId getRecordSize(): Länge eines Records getRecord(): liefert byte array über recordId setRecord(): Überschreiben eines Records j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.22 Javakurs: J2ME Laborvorbesprechung j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.23 Palm OS Plattform Palm Vx Kennzeichen: 8 MB Hauptspeicher Dragonball 68xxx Prozessor Taktfrequenz 30 MHz Infrarot-Schnittstelle serielle Schnittstelle j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.24 PhoneBookMIDlet Hauptmenü Neuer Eintrag Telefonverzeichnis Listen und Kommandos Textfelder Schreiben ins RMS Listen Lesen aus dem RMS j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.25 Entwicklungsablauf Entwicklungs-Workstation runtime verifier PhoneBook.java javac interpreter PhoneBook.class preverifier PhoneBook.class Ziel-Plattform (KVM runtime) j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.26 JAR Manifest/Application Deskriptor JAR-Manifest: Informationen, wie die JAR-Datei aufgebaut ist name-value Paare für MIDlet Attribute Application Deskriptor: Zusätzliche MIDlet-Informationen MIDlet-Jar-Size und MIDlet-Jar-URL vorgeschrieben helloworld.jad: MIDlet−Name: HelloWorld MIDlet−Version: 1.0 MIDlet−Vendor: STZ Softwaretechnik MIDlet−Description: HelloWorld for J2ME devices. MicroEdition−Profile: MIDP−1.0 MicroEdition−Configuration: CLDC−1.0 MIDlet−1: helloworld, helloworld.png, helloworld.HelloWorldMIDlet MIDlet−Jar−URL: helloworld.jar MIDlet−Jar−Size: 1397 j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.27 Javakurs: J2ME Literatur und Quellen im Internet j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.28 Literatur/Internet Buchempfehlung: Programming Wireless Devices with the Java 2 Platform, Micro Edition, Roger Riggs, Antero Taivalsaari und Mark VandenBrink. Addison-Wesley, Juni 2001. ISBN: 0-201-74627-1 URLs: J2ME: http://java.sun.com/j2me/ Palm OS: http://www.palmos.com/ j2mekurs.tex – Java-Kurs: J2ME – David Vogler – 13/3/2004 – 11:30 – p.29