Mobileszközök programozása Java nyelven

Szabványos könyvtárak: a mag

Szabványos könyvtárak felépítése (CLDC, MIDP és JSR-ek)

A mellékelt kép mutatja, hogyan épül fel a Java. A kékkel jelölt rész a mag, a sárga színt azok a JSR-ek kapták, amelyek elvileg minden napjainkban működő készüléken elérhetőek (jelen dokumentumban ezeket nevezzük gyűjtőnéven kiegészítő szabványos könyvtáraknak). A szürke szín azon JSR-eket jelöli, amelyek meglétét ellenőrizni kell.

Felépítés

A CLDC-re és MIDP-re épülő alkalmazásokat a KVM, vagyis a Kilobyte Virtual Machine futtatja. A KVM tulajdonképpen a JVM kilobyte-os nagyságrendre lecsökkentett memóriaigényű változata.
Az alábbi ábra a Java ME alkalmazások magjának rétegeit muatatja:
A J2ME alkalmazások felépítése

Object - minden objektum őse

Minden programozó által készített osztály az Object ősosztályból származik, így örökli abból a következő metódusokat.

További információk

javax.microedition.lcdui

A Java SE platformon használt elemek (AWT, Swing) a korlátozott erőforrások következtében nem használhatók. A felhasználói felület elemei az lcdui csomagon belül helyezkednek el, számos olyan lehetőséget kínálva, melyek könnyebbé teszik mobil készülékekre szánt programok fejlesztését.

Alapvetően két típusú felületkezelést különböztetünk meg. Az első típus adatok kezelésére alkalmas szoftverek fejlesztésekor nyújt segítséget. Ebben az esetben az elemek űrlapokba szervezve kerülnek megjelenítésre.(lcdui.Screen) A másik típust grafikus programok (pl. játékok) megalkotásakor vehetjük igénybe. (lcdui.Canvas)

Egy absztrakt osztályból származnak a kijelzőn megjeleníthető képernyők. Ez az úgynevezett Displayable osztály, amely alkalmas a képernyő egységes kezelésére. A Displayable osztály és az ebből származtatott osztályok halmaza a javax.microedition.lcdui csomagban helyezkednek el.

Displayable osztály

A Displayable osztály fontosabb műveletei:

A Display.setCurrent művelettel válthatunk az aktuálisan megjelenített képernyők között. Egyidejűleg csak egyetlen képernyő használhatja a kijelzőt. A Java ME ebből a szempontból is eltérően viselkedik a számítógépen megszokott felhasználói felülettől.

Az adatcentrikus alkalmazások elemei a Screen osztályból származtatott képernyők, míg a grafikus programokhoz a Canvas osztály használata a nélkülözhetetlen. Az utóbbiból kifejezetten a játékok számára, a MIDP 2.0-ban már létrehoztak egy GameCanvas nevű osztályt.

List

Listaszerű megjelenítést tesz lehetővé a teljes kijelzőn. A megjelenített listaelemekből lehet választani. A választásoknak és így a listáknak is három típusa létezik, melyet létrehozáskor a konstruktorban tudunk megadni.

Listák csak speciális értékek megjelenítésére alkalmasak. Ebben az esetben az érték egy szöveg, amelyhez csatolható egy ikon is. Amennyiben a szöveghez tartozó ikonkép használatát nem kívánjuk igénybe venni, úgy NULL értéket kell megadnunk a szöveg mellett.

List típusú objektumot úgy hozhatunk létre, hogy megadjuk a lista nevét és típusát, majd ezeken túl meghatározzuk a lista elemeit szövegek és képek tömbjének segítségével.

A List osztály fontosabb műveletei:

TextBox

Lehetőséget nyújt a felhasználó számára, hogy a telefonokon szokásos módon megadható legyen egy szöveg. Az objektum létrehozásakor be kell állítanunk, hogy mekkora legyen a maximálisan bevihető szöveg mérete. Ezt az értéket használat során nem léphetjük át. A konstruktor paraméterei a következők: képernyő címe, kezdeti szöveg, maximális szöveghossz és a tartalom jellegének a megszorítása, amely az alább felsorolt értékeket veheti fel.

A felsorolt értékeken kívül megadhatók még módosító értékek is, például hogy szerkeszthető-e a tartalom, vagy a beviteli mező jelszó típusú információt fog-e tartalmazni.

Az osztály fontosabb műveletei:

Alert

Bizonyos adatok, információk, figyelmeztetések megjelenítését teszi lehetővé a felhasználók számára, mielőtt másik képernyőre váltanának. A felhívás vagy a setTimeOut-tal beállított ideig maradna kijelzőn, vagy pedig "véglegesen". (Utóbbi használatának támogatását nem minden telefon támogatja. A régebbi típusok esetén kivételt dobhat az alkalmazás.)

Eltérő típusai lehetnek: riasztás (ALARM), megerősítés (CONFIRMATION), hiba (ERROR), információ (INFO) és figyelmeztetés (WARNING). A konstansokat az AlertType osztály foglalja magában. Az üzenetek szövegét és címét a konstruktorban adhatjuk meg.

Form

Az objektum lehetőséget biztosít űrlapszerűen elhelyezett adatbeviteli elemek együttes megjelenítésére és kezelésére. A formok szabadon összeválogatott elemeket tartalmazhatnak. A megvalósítás felelős az elemek elhelyezkedéséért, bejárásukért és szükség esetén a képernyő görgetéséért is.

Az összes formbeli elem az Item absztrakt osztályból származik, ez az osztály adja meg a közös viselkedésüket. A leggyakrabban használt beviteli elemek a rendelkezésünkre állnak, mivel ezeket előre megvalósították, de speciális esetekben saját magunk is létrehozhatunk újakat a CustomItem osztályból leszármaztatva.

Item osztály

Az elemeket vagy a létrehozásukkor helyezzük el a formra, vagy pedig utólag vesszük fel őket az append művelettel. Az első esetben a konstruktor paramétere a cím mellett az elemeket tartalmazó tömb, míg a második esetben elegendő csak a form címét megadni a konstruktorban.

A Form osztály fontosabb műveletei:

ChoiceGroup

Ezzel a vezérlővel választható elemek egy halmazát jeleníthetjük meg egy formon belül. Különböző választási módok léteznek: kizáró (EXCUSIVE), többszörös (MULTIPLE), illetve MIDP 2.0-től kezdődően a kizáró választás módja POPUP is lehet. (Ekkor az összes elem csak a vezérlő aktivizálásakor jelenik meg.)

A konstruktorban megadásra kell hogy kerüljön a vezérlő neve és a választás módja, amit kiegészíthet az elemek és ikonok tömbje. A listáknál megismert módon az elemek itt is csak szövegek lehetnek.

A ChoiceGroup osztály fontosabb műveletei:

DateField

Egy olyan szerkeszthető objektum, amelyben időt és dátumot jeleníthetünk meg. A komponens képes a dátumot és az idő külön-külön (DATE, TIME), illetve együttesen is kezelni, (DATE_TIME) a megfelelő konstans konstruktorbeli használatával. A konstruktor első paramétere a komponens címkéje.

Az időpontot beállítani, illetve lekérdezni a Date típust használó setDate és getDate műveletekkel van lehetőség.

Gauge

Egy zárt intervallumba eső egész szám bevitelére és megjelenítésére alkalmas komponens, amely egy folyamatjelzőhöz hasonlóan mutatja az értékeket. Az intervallum alsó határa zérus, míg a felső érték beállítható. Létrehozható a komponensből interaktív és nem interaktív. Az első esetben a felhasználó maga is beállíthatja az objektum értékét, míg a másodikban az eszköz csak a megjelenítést szolgálja és a módosítás nem megvalósítható.

A konstruktor első paramétere a komponens címkéje, a második az interaktivitást beállító logikai érték (ha igaz, akkor interaktív, ha hamis akkor nem), a harmadik a maximális érték, és a negyedik az aktuális érték. Az aktuális érték lekérdezésére és beállítására a getValue és setValue műveletek alkalmasak.

ImageItem

Formon belüli képmegjelenítésre szolgáló komponens. Az osztály konstansai segítségével szabályozható a kép elhelyezési módja.(layout) A komponensben a képhez felvehető felirat, illetve olyan alternatív felirat, amely akkor kerül megjelenítésre, ha a kép megjelenítése nem megvalósítható.

A konstruktorban a címek, a kép, az elhelyezési mód és az alternatív felirat adhatók meg. A MIDP 2.0-tól kezdődően lehetőség van egy ötödik paraméter megadására is, amely a megjelenítési módot szabályozza. A megjelenítés típusa lehet sima, hivatkozás illetve gomb.

TextField

A TextBox-ra hasonlító szövegbeviteli komponens, amely nem teljes képernyős megjelenítésű, hanem a formon belül helyezkedik el. Ennek következtében az alkalmazásbeli használata megegyezik a TextBox használatával.

Spacer

Olyan felületi elem, amely nem tartalmaz semmit, kifejezetten a formon belüli elemek egymástól való pozicionálására használatos. Ez az eszköz csak a MIDP 2.0-ás változatától kezdve érhető el. A konstruktorban megadásra kerül az elem szélessége és magassága.

Canvas

Alapot szolgáltat a kijelzőn megjeleníthető alacsony szintű grafikus műveletekhez. Általában ezt az osztályt használjuk, ha az alkalmazásban grafikus képernyőre van szükségünk. A Canvas típusú képernyők használata keverhető a midleten belűl magasabb szintű képernyők használatával. Például egy lista bizonyos elemének kiválasztásával megjelenítésre kerülhet egy Canvas típusú kijelző, majd onnan akár opcionálisan visszatérhetünk a listába.

A Canvas objektum lehetőséget nyújt a telefon beviteli eszközén végrehajtott események figyelésére. Előre rögzített konstansokat tartalmaz a gombok identifikálására illetve azok átalakítására. A keyPressed és keyReleased műveletekkel valósítható meg a mobil telefon gombjainak lenyomásának és felengedésének a figyelése. A műveletek paramétere a gomb azonosító kódja, amelyet az osztály konstansaival azonosíthatunk. A getGameAction művelettel hajthatjuk végre az úgynevezett játék gombok (kurzor, tűz) konvertálását.

Az osztály tartalmaz egy absztrakt paint függvényt, amelyet a leszármaztatott konkrét osztályokban meg kell valósítani. Ezek a megvalósított példányok lesznek felelősek a konkrét megjelenítésért. Amikor a képernyőt, vagy annak egy bizonyos területét meg szeretnénk jeleníteni, akkor ez a függvény kerül meghívásra. Ezt a hatást a repaint művelet meghívásával érhetjük el, ugyanis a nyelv a paint művelet közvetlen hívását nem teszi lehetővé.

A paint műveletnek egy Graphics objektum paramétere van, amire a konkrét kirajzolás megtörténik. Egy Canvas típusú elem kirajzolását csakis a paint művelettel valósíthatjuk meg. Nem lehet a művelet paramétereként kapott objektumot tárolni, és arra a későbbiek folyamán hivatkozni. Az objektum hatóköre maga a művelet, ugyanis a művelet végrehajtása után a grafikus objektumon műveletek nem értelmezettek.

Egy Graphics típusú objektum hasonló lehetőségekkel bír, mint a Java SE-ben. Tehát megvalósítható egyszerű alakzatok kirajzolása, kitöltése, képek és szövegek megjelenítése. Beállítható az aktuális vonalstílus, betűtípus és szín is. Természetesen a megadható jellemzők száma a Java SE-ben választhatókéhoz képest jóval alacsonyabb.

A MIDP 2.0-ás verziójának bevezetésével megalkották a GameCanvas osztályt, amely a Canvas osztály kiterjesztése, játékok támogatása céljából. Olyan lehetőségeket kínál mint például háttér (off-screen) grafikus puffer a rajzolások gyorsítására. Létrehoztak ezen kívül egy Sprite nevű osztályt is, amely különböző alakzatok képernyőn történő kezelésére alkalmas. Ennek segítségével lehetőség nyílik animált elemek megjelenítésére is.

További információk

javax.microedition.io

Az MIDP könyvtárban található csomag, mely a hálózati kommunikációhoz nyújt támogatást. Az interfész által definiált osztályok lehetővé teszik többek között a HTTP és a HTTPS, a TCP/IP, valamint az UDP protokollokon alapuló kommunikációt. Ezen osztályok segítségével a programozó komoly technológiai támogatást kap a webes információ cseréhez, ami számtalan új lehetőséget kínál.

A programozó a fantáziáját használva széles körben hasznosíthatja ezeket a technológiákat:

A kapcsolati interfészek hierarchiája

A javax.microedition.io csomag kapcsolati interfészeinek hierarchiája


Látható, hogy a csomag tervezői szofisztikált módon definiáltak interfészeket, melyekhez a stabil megoldásokat is elkészítették, ám mégis nyitva hagyták a lehetőségek újabb protokollok implementálására vagy meglévő implementációk lecserélésére.

Példányosítás

Ehhez a szövevényes hierarchiához definiált a Connector statikus Factory (Gyártó) osztály, amely metódusai különböző szignatúrákkal nyújtanak lehetőséget Connection ősosztálybeli objektumpéldányok előállítására. Fontos, hogy a kívánt altípus meghatározásához a típuskényszerítés (castolás) eszközét kell használnunk.
HttpConnection connection = (HttpConnection) Connector.open("http://www.nyelvek.inf.elte.hu");

int responseCode = connection.getResponseCode();
if (rc != HttpConnection.OK) {
throw new IOException("HTTP response code: " + responseCode);
}

InputStream input1 = connection.openInputStream();
DataInputDataStream input2 = connection.openDataInputStream();
.
.
.
A HTTP kapcsolat sikeres megnyitását követően példányosíthatunk magunknak java.io-beli InpuStream vagy DataInputStream objektumokat, amelyek hozzáférést biztosítanak az adatokhoz. (A választott adatfolyam típusa függ attól, hogy milyen az adatfolyamokra vonatkozó szolgáltatásokat szeretnénk igénybe venni, mert míg az InputStream a szekvenciális inputhoz hasonlít, addig az DataInputStream módot ad az adatfolyam típusos feldolgozására.
A hasonló módon példányosítható kapcsolatok:
További információk

java.lang

Az alapvető, rendszerszintű szolgáltatások gyűjteménye. A beépített típusok és matematikai műveleteken felül két fontosabb osztálya a System és a Thread.
A System nyújtotta szolgáltatások:


A Thread nyújtotta szolgáltatások (a szokásos szálkezelés):
További információk

java.util

Alapvető adatszerkezetek (szegényes) gyűjteménye, lehetővé teszi a felsorolási típus kezelését (Enumerator).

További információk