Post on 12-Jan-2016
description
Java 2 Micro EditionРазработване на приложения
за мобилни телефони
Пламен ЖелязовEternity Logic
За какво ще говорим?
● Какво е 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.
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)
Поддържа се от най-новите устройства на всички големи производители.
JTWI(JSR 185)
Какво е Midlet Suite
Приложение, написано според MIDP спецификацията :)
● Съдържа един или повече наследници на javax.microedition.midlet.MIDlet
● class файловете са преминали процес на верификация
● Class-файловете са пакетирани в JAR ● JAD файл с допълнителна информация
Жизнен цикъл на Midlet
Как изглежда кода?
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,HelloWorldMidletMIDlet-2: Hello World
Canvas,/icon2.png,HelloWorldCanvasMIDlet-Name: Lecture Midlet SuiteMIDlet-Description: This is just DemoMIDlet-Jar-URL: http://eternity-logic.com/j2me/Lecture.jarMIDlet-Jar-Size: 5247MIDlet-Data-Size: 1024
MIDlet-Version: 1.0.0MIDlet-Vendor: Eternity LogicMicroEdition-Profile: MIDP-1.0MicroEdition-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: Value1Property2: Value2
Преглед на LCDUI
➔ java.lang.Object➔ Displayable➔ Display➔ AlertType➔ Command➔ Font➔ Graphics➔ Image➔ Item➔ Ticker
➔ Displayable➔ Canvas➔ Screen
➔ Form➔ List➔ TextBox➔ Alert
➔ Item➔ ChoiceGroup➔ CustomItem➔ DateField➔ Gauge➔ ImageItem➔ Spacer➔ StringItem➔ TextField
javax.microedition.lcdui classes
➔ Choice• ChoiceGroup, List
➔ CommandListener➔ ItemCommandListener ➔ ItemStateListener
Interfaces
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
The Layout (2/3)
● LAYOUT_DEFAULT
● LAYOUT_LEFT
● LAYOUT_RIGHT
● LAYOUT_CENTER
● LAYOUT_TOP
● LAYOUT_BOTTOM
● LAYOUT_VCENTER
● LAYOUT_NEWLINE_BEFORE
● LAYOUT_NEWLINE_AFTER
● LAYOUT_SHRINK
● LAYOUT_VSHRINK
● LAYOUT_EXPAND
● LAYOUT_VEXPAND
● LAYOUT_2
Класът 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!
Благодаря Ви за вниманието!
Имате ли въпроси?