450 likes | 581 Views
Пламен Желязов Eternity Logic. Java 2 Micro Edition Разработване на приложения за мобилни телефони. За какво ще говорим?. Какво е Java Какво e CLDC и MIDP Преглед на достъпни API Какво е Мидлет LCDUI – Класове и възможности Други важни класове Примерна програма. Какво е Java?.
E N D
Пламен Желязов Eternity Logic Java 2 Micro EditionРазработване на приложенияза мобилни телефони
За какво ще говорим? • Какво е Java • Какво e CLDC и MIDP • Преглед на достъпни API • Какво е Мидлет • LCDUI – Класове и възможности • Други важни класове • Примерна програма
Какво е Java? • Езикът Java • Java editions • Standard Edition (J2SE) • Enterprise Edition (J2EE) • Micro Edition (J2ME) • Java Community Process (JCP) • JSR – Java Specification Request
Структура на J2ME • CDC – Connected Device Configuration • CLDC – Connected Limited Device Configuration • Java Card Technology
CLDC Technology (1/3) • Connected Limited Device Configuration (CLDC); JSR 30, JSR 139 • Mobile Information Device Profile (MIDP); JSR 37, JSR 118 • Information Module Profile, (IMP); JSR 195
CLDC Technology (2/3) • Java Technology for the Wireless Industry, (JTWI); JSR 185 • Mobile Media API (MMAPI); JSR 135 • File Connection and PIM API (JSR 75) • Location API for J2ME; JSR 179 • SIP API for J2ME; JSR 180
CLDC Technology (3/3) • Security and Trust Services API for J2ME (SATA); JSR-177 • Mobile 3D Graphics; JSR-184 • J2ME Web Services APIs (WSA), JSR-172 • Bluetooth API JSR-82 • J2ME Content Handler API (CHAPI) JSR 211
CLDC Версии • CLDC 1.0 (JSR 30) • java.lang • java.util • java.io • javax.microedition.io • CLDC 1.1 (JSR 139) • floating point операции • Поддръжка на weak reference • Подобрения в нишките
MIDP 1.0 • MIDP 1.0 (JSR 37) • javax.microedition.lcdui • javax.microedition.lcdui.game • javax.microedition.media • javax.microedition.midlet • javax.microedition.rms
MIDP 2.0 • MIDP 2.0 (JSR 118) • Enhanced user interface • Enhanced multimedia/gaming • Better connectivity (unbound connections) • OTA (over the air) provisioning • Better security
Видове устройства • MIDP 1.0 / CLDC 1.0 • Nokia, Motorola, Siemens, LG, SE и други. • MIDP 2.0 / CLDC 1.0 • Новите устройства на Nokia ser. 40, Nokia ser. 60, Siemens 65x, Motorola, SE, и други. • MIDP 2.0 / CLDC 1.1 • Нови устройства от Nokia ser. 60, ser. 80, ser. 90, Siemens 65x, 75x, SE и други.
Optional Packages (1/2) • Mobile Media API (MMAPI); JSR 135 • Mobile 3D Graphics; JSR-184 • J2ME Web Services APIs, (WSA); JSR 172 • Bluetooth API (JSR-82) • Location API for J2ME; JSR 179
Optional Packages (2/2) • SIP API for J2ME; JSR 180 • Security and Trust Services (SATSA); JSR-177 • File Connection and PIM API (JSR 75)
API fragmentation Проблемът: Твърде много възможни комбинации: • Различни размери на екрана и брой цветове • Различни медийни формати • Connectivity features (sms/ssl/udp) • Vendor specific API (Nokia, Siemens и др.)
Решение? • Разработка на отделни версии на критичните сегменти код • Използване на “условна компилация” (j2mepolish, jpp и други). • Когато е възможно – използване на най-ниска версия на API.
JTWI(JSR 185) • Java Technology for Wireless Industry: • Стандартизация на минимален набор от API с цел избягване на фрагментацията: • CLDC 1.0 (JSR 30) или CLDC 1.1 (JRS 139) • MIDP 2.0 (JSR 118), WMA 1.1 (JSR 120), MMAPI (JSR 135) • Поддържа се от най-новите устройства на всички големи производители.
Какво е Midlet Suite Приложение, написано според MIDP спецификацията :) • Съдържа един или повече наследници на javax.microedition.midlet.MIDlet • class файловете са преминали процес на верификация • Class-файловете са пакетирани в JAR • JAD файл с допълнителна информация
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class HelloWorldMidlet extends MIDlet { public HelloWorldMidlet() { super(); } protected void startApp() throws MIDletStateChangeException { } protected void pauseApp() { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } } Как изглежда кода?
JADJava Application Descriptor Съдържа информация за Midlet Suite • Списък с мидлетите • Версия на CLDC и MIDP • Производител • Адрес за инсталация • Размер на JAR файла
Примерен JAD файл (1/2) MIDlet-1: Hello World,/icon1.png,HelloWorldMidlet MIDlet-2: Hello World Canvas,/icon2.png,HelloWorldCanvas MIDlet-Name: Lecture Midlet Suite MIDlet-Description: This is just Demo MIDlet-Jar-URL: http://eternity-logic.com/j2me/Lecture.jar MIDlet-Jar-Size: 5247 MIDlet-Data-Size: 1024 MIDlet-Version: 1.0.0 MIDlet-Vendor: Eternity Logic MicroEdition-Profile: MIDP-1.0 MicroEdition-Configuration: CLDC-1.0
Примерен JAD файл (2/2) MIDlet-Info-URL: http://eternity-logic.com/info/ MIDlet-Install-Notify: http://eternity-logic.com/midlet_install.jsp?name=HelloWorld MIDlet-Delete-Notify: http://eternity-logic.com/midlet_uninstall.jsp?name=HelloWorld MIDlet-Delete-Confirm: Are you shure? MIDlet-Permissions: javax.microedition.io.Connector.http Property1: Value1 Property2: Value2
Displayable Canvas Screen Form List TextBox Alert Преглед на LCDUI javax.microedition.lcdui classes • java.lang.Object • Displayable • Display • AlertType • Command • Font • Graphics • Image • Item • Ticker • Item • ChoiceGroup • CustomItem • DateField • Gauge • ImageItem • Spacer • StringItem • TextField Interfaces • Choice • ChoiceGroup, List • CommandListener • ItemCommandListener • ItemStateListener
Hello World ! public class HelloWorldMidlet extends MIDlet implements CommandListener { Form helloForm = new Form ("Demo"); Command cmdExit = new Command ("Exit",Command.EXIT,0); protected void startApp() throws MIDletStateChangeException { helloForm.append("Hello World!"); helloForm.addCommand(cmdExit); helloForm.setCommandListener(this); Display.getDisplay(this).setCurrent(helloForm); } public void commandAction(Command cmd, Displayable displ) { if (displ==helloForm && cmd==cmdExit) { Display.getDisplay(this).setCurrent(null); notifyDestroyed(); } } }
Класът StringItem mainForm.append("This is a simple label"); item = new StringItem("This is a StringItem label: ", "This is the StringItems text"); mainForm.append(item); item = new StringItem("Short label: ", "text"); mainForm.append(item); item = new StringItem("Hyper-Link ", "hyperlink", Item.HYPERLINK); mainForm.append(item); item = new StringItem("Button ", "Button", Item.BUTTON); mainForm.append(item);
Класът Item Базов клас за всички класове, чиитоинстанции могат да се добавят във форма По важни методи: • getMinimumHeight(), getMinimumWidth() , getPreferredHeight(), getPreferredWidth(),setPreferredSize() • notifyStateChanged() • AddCommand (), removeCommand (), setDefaultCommand (), setItemCommandListener • notifyStateChanged()
Класът Form Контейнер за Item subclasses. Методи: • append(Image img) , append(Item item), append(String str), set(int itemNum, Item item) • delete(int itemNum), deleteAll() • Item get(int itemNum) • getHeight(), getWidth() • setItemStateListener(ItemStateListener iListener)
The Layout (1/3) • Не може да се разположи Item на конкретни координати. • Елементите се показват по техния ред, в зависимост от имплементацията • Елементите се разползагат в “Редове” • Покзаването може да се управлява чрез метода setLayout () на класа Item • Алгоритъмът за разползагане разчита на т.нар. Current Layout
LAYOUT_NEWLINE_BEFORE LAYOUT_NEWLINE_AFTER LAYOUT_SHRINK LAYOUT_VSHRINK LAYOUT_EXPAND LAYOUT_VEXPAND LAYOUT_2 The Layout (2/3) • LAYOUT_DEFAULT • LAYOUT_LEFT • LAYOUT_RIGHT • LAYOUT_CENTER • LAYOUT_TOP • LAYOUT_BOTTOM • LAYOUT_VCENTER
Класът TextField Constructor: TextField(String label, String text, int maxSize, int constraints) Sample: new TextField("Any Character", "", 15, TextField.ANY); new TextField("E-Mail", "", 15, TextField.EMAILADDR); new TextField("Number", "", 15, TextField.NUMERIC); new TextField("Decimal", "", 15, TextField.DECIMAL); new TextField("Phone", "", 15,TextField.PHONENUMBER); new TextField("Password", "", 15, TextField.PASSWORD); new TextField("URL", "", 15, TextField.URL);
Класът ChoiceGroup (1/2) String[] sa = {"Option A", "Option B", "Option C", "Option D"}; Image img = Image.createImage (“/pic.img”); form.append(new ChoiceGroup( "Exclusive", ChoiceGroup.EXCLUSIVE, sa, img)); form.append(new ChoiceGroup( "Multiple", ChoiceGroup.MULTIPLE, sa,img)); form.append(new ChoiceGroup( "Pop-Up", ChoiceGroup.POPUP, sa,img));
Класът Canvas –директен достъп до екрана • Наследниците на Canvas имплементи-рат метод protected void paint(Graphics g) • paint () не се вика директно – извиква се repaint () • За директен достъп до екрана се използва параметъра (Graphics g)
Canvased Hello World! protected void paint(Graphics g) { g.drawLine(5,5,30,30); g.drawString("Hello World!", getWidth()/2, getHeight()/2, Graphics.TOP | Graphics.HCENTER); }
CustomItemСъздаване на собствени контроли • За създаване на собствени контроли се наследява класа javax.microedition.lcdui.CustomItem • Задължително се имплементира void paint(Graphics g, int w, int h); • Незадължително • traverse, traverseOut, keyPressed, keyReleased, keyRepeated и други.
Други UI класове (Screen) • List – Аналог на ChoiceGroup, но се показва на цял екран • Alert – Показва съобщение на екрана (info, warning, error и др.) • TextBox – Аналог на TextField и също се показва на цял екран
Други интересни възможности (RMS) • RMS – Record Memory Store • javax.microedition.rms.RecordStore • Позволява записване на информация върху мобилното устройство • Представлява номерирано множество от записи byte [] • Всеки запис се чете или записва наведнъж • Записите могат да се филтрират, търсят и сравняват по дадени признаци
Вход/Изход • Пакетът javax.microedition.io • javax.microedition.io.Connector – factory за създаване на Connection обекти • Connection – Базов интерфейс за вход/изход • Поддържат се HttpConnection, HttpsConnection, SocketConnection, StreamConnection, UDPDatagramConnection
Пример за HTTP Вход HttpConnection httpcon = (HttpConnection) Connector.open(“http://fun.bg”); InputStream is = httpcon.openInputStream(); byte [] buff = new byte[128]; int count = -1; while ((count = is.read(buff))!=-1) { String text = new String (buff,count); form.append(text); }
Демонстрация:Да направим един Midlet • Weather Midlet – показва метеороло-гичните условия в даден град • Използваме web service предоставен от http://webservicex.net • Ще направим заявка, ще изтеглим, обработим и визуализираме резултата
Формат на заявката и данните HTTP Get Request: webservicex.net/globalweather.asmx/GetWeather? CountryName=Bulgaria&CityName=Sofia
Формат на отговора Response: <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://www.webserviceX.NET"> <CurrentWeather> <Location> Sofia Observ. , Bulgaria (LBSF) 42-39N 023-23E 595M </Location> <Time> Nov 29, 2005 - 04:00 AM EST / 2005.11.29 0900 UTC </Time> <Wind>Variable at 2 MPH (2 KT)</Wind> <Visibility>4 mile(s)</Visibility> <SkyConditions>mostly clear</SkyConditions> <Temperature>48 F (9 C)</Temperature> <DewPoint>41 F (5 C)</DewPoint> <RelativeHumidity>75%</RelativeHumidity> <Pressure>29.97 in. Hg (1015 hPa)</Pressure> <Status>Success</Status> </CurrentWeather> </string>
Да напишем кода • Ще използваме Eclipse • Плъгинът EclipseME ще автоматизира част от работата • За емулатор – WTK 2.2 на Sun Microsystems
Благодаря Ви за вниманието! Имате ли въпроси? That’s all folks!