Přez půl stoleti se počítače rozvíjejí a derou se do života každého člověka. Tento vývoj se s časem ještě více zrychluje. Na počátku velké jak několik fotbalových stadionů postupně menší a menší a dnes není složitějších elektrického přístroje, který by v sobě neměl malého příbuzného tého rostoucí rodiny. Od dob, kdy měly k počítačům přístup jen privilegovaní a vyvolení uplynulo mnoho času a s tím jak postupně zmenšovali velikost se zvyšoval jejich počet a měnily se také skupiny lidí, které s nimi pracovali. Už kolem sálových počítačů se kromě programátorů a správců začaly točit lidé, kteří se řadili do skupiny tzv. uživatelů. Tato skupina čim dál víc rostla a čim dál víc se snižovala její odbornost. Že dnes už uživatele ani neví, kdy a jak pracují s počitačem. Jeden z hlavních kroků bylo rozšíření myšlenky osobních počítačů. Tato myšlenka nezůstávala na dlouho jen teorii. Úkolu se chopilo mnoho firem, mezi které patřily IBM, Apple a další. Na pozadí vývoje osobních počítačů však probíhala i další vlna šíření a tou bylo a je postupné využívání počítačových technologii i v ostatních typech elektronickych zařízní. Tím myslím především využívání mikroprocesorů ve spotřební elektronice, elektroinstalci automobilu, speciálních zářízeních jako jsou telefoní ustředny...
Tak nám začalo vznikat mnoho poměrně různorodých začízení, jejichž řízení byvá většinou dáno programem.K takovým nam navíc v poslední době začínají příbývat i takzvaná "mobilní zařízení". Mezi ně patří různé typy kapesních počítačů, palmtopů(počítačů do dlaně), handheldů, diárů, a v neposlední řadě mobilních telefonů s různými funkcemi, které nemají už s telefonováním mnoho společného.
Hlavně na poslední podmonžinu je zaměřen následující text. Jak už jsem naznačil, můžeme v uvedeném výčtu vidět dvě množiny. První je ta, na které je programování přirozenou záležitostí. A ta druhá je možina zažízení, u které je pro nezkušeného problém představit si běžící program a už vůbec program vytvářet. Prostředek, který tyto dvě skupiny sjednocuje a vytváří jednotné prostředí je programovací jazyk Java. S pomocí Javy, můžete vytvářet programy na téměř jakýkoliv typ programovatelného hardwaru, který Javu podporuje. A na dalších stránkách bude ukázáno jak toho v praxi dosáhnou na moderních typech mobilních telefonů.
O Javě se často mluví jako o programovacím jazyku 2. poloviny devadesátých let 20.století. Je tomu tak asi proto, protože v této době zážívají mobilní zařízení opravdový boom. V našich středoevropských českých podmínkách to můžeme vidět, na příkladu vznikajících a rychle se rozrůstajících mobilních sítí. Přestože v těchto dobách ještě nejsou dostupná prakticky žádná mobilní zařízení, které by Javu přímo implemntovali, mluví se ale, že tomu tak jednou bude a java poběží na každe ledničce, pračce, televizi, nebo mobilním telefonu. Přenositelnost Javových programů se tedy dá ukázat jen na ruzných platformách osobních počítačů. Vývoj Javy, ale začal o něco dříve. V už prosinci roku 1990 byl sestaven splečností Sun Microsystems tým, který se měl zabývat mýšlenkou jaká bude další vlna počítačů. Výsledkem práce toho týmu na tzv. Green projectu byla první inkarnace Javy, která se původně jmenovala Oak(dub). S původní myšlenkou, aby Java byla jazyk pro programování hardwarově odlišných zařízení, která se dochovala dodnes, byl vytvořen první prototyp, na kterém java běžela. Byl to Star7(*7), handheld, který měl mnoho hardwarových vymožeností, které ani dnes některa obdobná zařízení nemají(dotyková obrazovka, PCMCIA slot, radio networking, flash RAM souborový system,..).
Obr.1:Vzhled a prostředí prvního Java Handheldu Star7
V letě roku 1992, po osmnáctiměsíční práci týmu 13 lidí na Green projektu, byla uvedena první demoverze. Green projekt během teto doby přerušil všechny oficiální kontakty na Sun Microsystems a stal se nezávislý. Nastal čas hledat trh, na kterém by se produkt a vysledky Green projektu ujaly. Projekt byla ale tak revoluční a nový a všemu ostatnímu nepodobný, že se muselo nejprve nalézt nějaké medium, s kterým bude pracovat. Samozřejmě najperspektivnější možností se stal Internet, jehož popularita jako media pro šíření textu, grafiky a videa pomocí HTML, se zvětšovala den co den. Další práce na Javě se tedy zaměřily pro spolupráci v prostředí Internetu. Team projektu se zvětšil postupne až na 70 zaměstnanců, přestěhoval se z anonimních kancelaří do reprezentativních prostor a přejmenoval se na FirstPerson. První implemetnací Javy v prostředí Internetu se stal od roku 1993 klon už hotového webového prohlížeče Mosaic(kodovým označením "WebRunner",podle filmu BladeRunner), později přejmenovaný na HotJava.
V té době se o Javu začal opět zajímat Sun. Z počátku týmu poskytl svoje připojení na Internet, protože o Javu byl takový zájem, že původní připojení serveru, ze kterého si uživatele stahovali Javu(včetně zdrojového kódu) bylo plně zatíženo. V roce 1995 veřejně podpořil Javovou technologii. A v podstatě o pár hodin poté navrhla týmu možnost implementace ve vlastním prohlížeči společnost Netscape.
Postupně se Java rozšířila a vzniklo mnoho technologii, které se často skrývají za různými zkratkami, často začínajícími písmenem J.
Zde je jen několik málo, které jsou důležité, nebo se zdají býti zajímave ve vztahu k téma tu následujícího textu:
Java je poměrně nový programovací jazyk, v porovnání například s C/C++,nebo Pascalem/Object Pascalem, které se v součastné době hodně v praxi používají. Měla proto tu možnost učit se ze zkušeností generací programátorů s nedostatky starších programovacích jazyků. V následujícím bude uvedeno stručně odpověď na otázku: "Co je Java z hlediska programátora?"
Java je jednoduchý programovací jazyk. Jednoduchý v takovém smyslu, že programátor, který prošel školou Cčka, nebo C++, případně má zkušenost s jiným programovacím jazykem, který má syntaxí blýzko Cčku, jako je PHP, nebo JavaScript, nemá problém se jeho zakladní konstrukce naučit. A jednoduchý, protože obsahuje poměrně menší množinu konstrukcí než obrovité Cčko/C++. Ve zkratce řečeno, Java je C++ okrájené o mnoho zbytečných aspektů a konstrukcí, které byly často náchylné k programátorským chybám a obohacené o nové, které v C++ chyběly, nebo se neobratně formulovaly. Podstatným rysem Javy je, že na rozdíl od C/C++ nepoužívá ukazatele. Ty jsou při programování v C/C++ vždy zdrojem mnoha chyb. Java práci s ukazateli, která je nezbytná, například při dynamické alokaci paměti skrývá. Ale je nutné o tomto přístupu vědět například při předávaní parametru, kdy některé parametry předáva odkazem(referenci), a některé hodnotou(hlavně základní neobjektové nestrukturovane datové typy). A pro práci s pamětí používá garbage collector, který dokáže odstraňovat kusy paměti na které už neexistuje žádná reference. Dále java ostraňuje například struktury a unie, příkaz goto, přetěžování operátorů, nebo mnohovásobnou dědičnost. Přez svoji jednoduchost, má Java silné vyjadřovací možnosti a navíc programátorovi práci usnadňuje.
Java je objektově orientovaný. Java přebírá mnoho objektových konstrukcí z C++, ale učí se také od SmallTalku, nebo Simuly. Více méně to znamená, že v Javě je všechno objekt, mající data a implementující operace jako metody nad nimy. I základní datové typy mají svoje objektové obálky.
Java je distribuovaná. Toto je zájímavá vlastnost, která, jak bylo výše popsáno, vyplývá z toho, že byla navržena pro práci na síťi. V praxi to znamná, že je možné části programu stahovat z např. Internetu jako oddělené kusy. Nejen k tomuto účelu perfektně slouží globální strom balíků tříd, který se zároveň může chápat jako síťová adresa. Interpreter pak se pak snaží několika způsoby najít a nahrát hledaný kus, který může být buď lokální nebo i vzdálený.
O Javě se často mluví jako o robusním programovacím jazyku. Znamená to, že je určena k tvorbě vysoce spolehlivého softwaru. K tomu přispívá jak odstínění práce s pamětí, tak ošetřování tzv. vyjímek, které jsou také z převzaty z C++. Zbytek vlastností uvedu jen výčtem, protože vyplývají z toho co už bylo řečeno. Java je interpretovaná, bezpečná(jistá uroveň bezpečí), výkonná(při použití JIT), přenosná a nezávislá na architektuře.
Javové programy nežijí na rozdíl od Cčka v prázdném jmeném prostoru. Na pozadí, existuje jakýsi hierarchicky uspořádaný strom balíků, podbalíků a tříd. V tomto stromu je zakuklena všechna funkčnost Javy. Velikost stromu a tím množství tříd se různí podle toho, jakou edici Javy používáte, respektive jaké má Vaše runtimové prostředí(interpreter) dostupné knihovny. K jednotlivým třídám pak přistunujete pomocí tečkové notace.
Obr.2:Ukázka hierarchického stromu balíků v Javě
Zde následuje krátký kód v jazyce Java.
Na první pohled vypadá strukturou poměrně odlišně.
Je to tak proto, že Java se snaží být kompletně objektová.
Každý sebemenší program je veřejná třída, stejného jména jako zdrojový soubor.
Vstupní bod programu je verejná statická metoda main
, s parametrem typu pole řetězců.
Je videt, že tato metoda je ekvivalentem hlavní procedury z C/C++.
Je pouze obalena třídou.
import java.lang.*;
public class AhojSvete
{
//konstanty
final static String NOARGV = "Nejsou žádné vstupní parametry.";
final static String HELLO = "Ahoj Světe!";
//toto je hlavní metoda
public static void main(String argv[])
{
//java.lang.System.out je staticky clen
//tridy System reprezentujici standardni vystup
System.out.println( HELLO );
//ukaž vstupní parametry
for(int i = 0;i < argv.length ;i++)
System.out.println(argv[i]);
if(argv.length==0)
//plne kvalifikovane jmeno
java.lang.System.out.println( NOARGV );
}
}
Dalším zajímavým pozorováním je první řádek s klíčovým slovem import
.
Je nutné připomenout, že Java nepřipojuje žídné knihovny. Nepotřebuje je. V jmeném prostoru
každého programu je celá hierarchie baliků a tříd, kterou ma run-time Javy k dispozici.
První řátek slouží pouze jako zkratka. Říká, že všechna jména s předponou
java.lang
se mužou používat bez této předpony.
Vysvětlení přesného významu klíčových slov final, static, nebo public přesahuje tento text
a je lepší se obrátit na nějakou příručku k syntaxi Javy(viz reference)
Co tento zdrojový kód má dělat je myslím zřejmé. Má výpsat na standardní vstup hlášku následkovanou seznamem vstupních parametrů, nebo ohlášením, že žádné nejsou. Co ale dál? Jak program spustit? Nejprve bude potřeba mít nainstalován vývojový balíček J2SDK firmy Sun, nebo některý jiný konkurenční překladač. Druhá možnost většinou znamená obrátit se na produkty jiných, které většinou obsahují kompletní vývojové prostředí(IDE) s vestavěným debugerem, integrovanou nápovědou a editorem kódu, který zvýrazňuje syntaxi. Takový to nástroj většinou není zadarmo. Jde většinou o produkty firmy Borland, Microsoft, ... První možnost je mnohem lepší, protože tak dostanete vše nezbytné, včetně překladače a interpreteru Javy, která splňuje nejpřesněji všechny nejnovější normy a specifikace. A navíc úplně zadarmo. Stahnout J2SDK na www stránkach http://java.sun.com/downloads
Z tohoto balíčku pro nás bude dále důležitý překladač javac
a interpreter
java
. Náš zdrojak s nimy přeložíme a spustíme pomocí příkazů:
javac AhojSvete.java
java AhojSvete
Ahoj Světe!
Nejsou žádné vstupní parametry.
java AhojSvete 1 2 3
Ahoj Světe!
1
2
3
Takže je vidět, že konzolové aplikace se dají v Javě psat uplně normálně, jak jsme na to zviklí z Cčka.
Další druhy aplikací, jako jsou applety, nebo klasické "okení" aplikace, případně MIDlety(ale k tomu se dostaneme), se vytvářejí jednoduše, ale malinko odlišně, než jsme na to zvyklí z Cčka.
Většinou se začne tak, že se vytvoří třída, jako potomek nějaké třídy, jejiž vlastnosti chci aby moje vlastní měla.
To znamená, že když chci okno, zdědím svoji třídu po třídě java.awt.Frame
. V hlavním metodě main
pak vytvoříme instanci této třídy, čímž se nám otevře okno. Většinou je ale nutné, předefinovat některé abstraktní metody, nebo provest nějakou nezbytnou inicializaci.
import java.awt.*;
import java.lang.*;
public class WindowApp extends Frame
{
public static void main(String argv[])
{
window_app w=new window_app();
w.show();
}
}
Další odlišný přístup je v případě appletů. Zde není žádná metoda main.
Je zde však možné přepsat metody init, start, stop, destroy,
případně paint
a ovlivnit tak životní cyklus appletu.
Applety navíc nejsou interpretovány standardním java
interpreterm, ale místo toho jsou spouštěny v internetovém prohlížeči, nebo appletviewerem
, který je součástí J2SDK.
import java.applet.*;
import java.lang.*;
import java.awt.*;
import java.awt.event.*;
public class AppletTest extends Applet implements ActionListener
{
boolean capt_visible=false;
//tato trida odposlouchava udalosti tlacitka
//tato metoda je volana jako reakce na ne
public void actionPerformed(ActionEvent e)
{
capt_visible=true;
repaint();
}
//odpovida vpodstate main
public void init()
{
//vložení tlacitka
Button b = new Button("Pozdrav!");
b.addActionListener(this);
//zvlastní zpusob umistovani komponent definovany tzv layoutem
add( b , BorderLayout.SOUTH);
}
//metoda, ktera prekresluje applet, kdyz je to potreba
public void paint(Graphics gr)
{
if(capt_visible)
gr.drawString("AHOJ SVĚTE",20,50);
}
}
<html>
<body>>
<applet code="AppletTest.class" width=200 height=200>
</applet>
</body>
</html>
Dá se řici, že Java postupně s většími či menšími problémy, mezi které patří např. rychlost, plní, kromě jiného, učel se kterým byla navržena. Důkazem toho je Java2 MicroEdition, která se vedle javových desktopových aplikací, internetových appletů a servletů vrací k rozsáhle množině mobilních zařízení, takových jako byl na počátku Star7. V rámci můžeme vytvářet aplikace pro mobilní telefony, PDA, palmtomy, handheldy, nebo set-top boxy(televize, na které se dá prohlížet Internet). J2ME nijak nemění programování v Javě. Nepřidává nové konstrukce, nové typy, ani nemění syntax. To znamená, že programujete uplně stejně, jako to bylo možné u appletu, nebo aplikaci s uživatelským rozhraním. Jediný velký rozdíl je, že nemůžete používat některé standardní balíky Javy. Přesto J2ME není pouhou podmnožinou J2SE. Definuje totiž některé vlastní balíky tříd, které se dají na některých zařízeních použít například pro výstup, nebo vstup. Dále je nutné připomenout, že J2ME nerozšiřuje předchozí Javové technologie, pro programovaní elektronických zařízení jako byly Personál Java a Embdedded Java. Ty byly založeny na JDK v1.1. A s J2ME nemají nic společného. Tyto technologie, přestávají být podporovány, protože je J2ME ve většině případů plně nahradí. Součástí J2ME není ani JavaCards. Ta tvoří jakýsi doplněk. Je tomu tak, protože není možné implementovat minimální základ J2ME na zařízeních pro které je JavaCards vytvořena. Dokážete si jistě představit, že mít jednu univerzální množinu balíku na všech zařízeních je zbytečné, když na některých nemůže být nikdy použito, například kvůli paměťovým omezením, omezenou velikostí a možnostmi displaye, nebo jeho uplnou absenci, případně, absencí zvukového výstupu, atd. Proto je J2ME ješt dále drobněji rozděleno. A pro všechny zařízení je povinná jen malá část, na které je závisly samotný jazyk, jako jsou objektové obaly datových typů, nebo matematické funkce, atd. J2ME definuje konfigurace a profily, které jednoznačně určují runtimem podorováné třídy. Na Obrazku 3 je videt, jak konfigurace a profily definuji dostupné Java API(třídy).
Obr.3: Organizace API J2ME
Konfigurace(configuration) určuje základní J2ME runtimové prostředí. To zahrnuje jak VM tak podmnožinu tříd z J2SE. Každá konfigurace je určena pro širší rodinu zařízení podle jejich společných vlastností a schopností. V součastnosti existují dvě hlavní konfigurace:
Tato konfigurace je zaměřena na low-endové, zdrojema hodně omezené zařízení s omezenou možností připojení.
V současné době je ve verzi CLDC v1.1.
Srdcem runtimu těchto zařízejí je většinou K Virtual Machine s velmi malou podmnožinou tříd z J2SE.
K VM je nejmenší VM, který se dá srovnávat svými možnostmi se standardním VM z J2SE, přitom se vejde pouze do desítek kilobytu.
Konkrétní cílová zařízení pro tuto platformu jsou především přístroje osazené 16 a 32 bitovými procesory s minimálně 160kb persistentní paměti a alespoň 32kb nepersistentní(dohromady 192kb). Tyto přístroje by meli mít nějaký typ síťového připojení. Ideální příkladem jsou mobilní telefony, obousměrně kominikující pagery a PDAčka nižší třídy.
Tyto zařízení jsou ještě většinou omezena výpočetní silou, provozní dobou, kterou omezuje výdrž baterii, kapacitou síťového připojení.
To vše přímo omezuje typ aplikací, které se pro tyto zařízení dají vytvářet.
Pro tuto konfiguraci se navíc definuje i balík, který není v J2SE a který má nahrazovat některé těžkotonážní třídy z J2SE pro vstup a výstup. Je to balík javax.microedition.io
.
Tento balík je součástí takzvaného GCF(Generic Network Framefork).
GFC je odlehčenou verzí balíků java.net a java.io
, pro systémy s nedostatkém paměti.
java.io | Podmnožina standardních java.io pro práci vstupními a vstupními proudy. |
java.lang | Podmnožina standardních tříd jádra jazyka Java |
java.lang.ref(CLDC v1.1) | Podpora slabých referencí |
java.util | Podmnožina doplňkových tříd(např. generator pseudonahodných čísel) |
javax.microedition.io | Podpora síťování založena na GCF |
Tabulka 1: Balíky CLDC
Konfigurace "Connected Device Configuration" je určena pro zařízení, která nejsou tolik omezena jako ta, která podporují pouze CLCD. Příkladem těchto jsou mobilní telefony výšší třídy, PDAčka, set-top boxy, navigační systémy luxusních automobilů a jiná webově orientovaná zařízení. Tyto přístroje by měli být osazeny 32-bitovými procesory, minimálně 2 MB paměti s možností připojení do sítě. CDC je nadmnožinou CLDC. Obsahuje všechny balíky jako CLDC a přidává další standardní balíky ze J2SE. To podstaně rozšiřuje možnosti pro zkušené programátory v Javě.
Obr.4: Vztah CDC a CLDC
Následující tabulka ukazuje balíky, které přibyli v CDC:
java.lang.reflect | Třídy pro identifikaci a obecnou manipulaci s Javovými třídami |
java.math | Matematické funkce |
java.net | Práce se síťovým rozhraním |
java.security | Podpora bezpečnostiních protokolů |
java.security.cert | Bezpečnostní cerfifikáty |
java.text | Práce s textem, řetězci a jejich formátování |
java.util.jar | Manipulace s JAR archívy |
java.util.zip | Manipulace se ZIP archívy |
Tabulka 2: Rozšiřující balíky CDC
Profily rozšiřují konfiguraci a přídávají k balíkům definovaných konfigurací nové třídy. Jinými slovy řečeno, profily nabízí nové třídy ke specifickému požití na konkrétnějších množinách zařízení, které chyběly v zakladní konfiguraci. Například třídy, které se starají o životní cyklus aplikací, zajišťují uživatelské rozhraní, síťové spojení, nebo specifické funkce hardwaru.
Profily pro zařízení s konfigurací CLDC v součastnosti jsou:
Tyto profily jsou zamřeny na velmi hardwarově omezená zařízení jako jsou PDAčka. Protože samotné CLDC nenabízení žádnou možnost budovat uživatelské rozhraní, je tato funkčnost přenesena až na uroveň těchto profilů. Vztah MIDP a PDAP je stejný jako CLDC a CDC. MIDP je podmnožinou PDAP, jak ukazuje následující obrázek.
Obr.5: Vztah profilů konfigurace CLDC
V nedávné historii byla exisotval pouze jeden profil. Byl to právě profil MIDP verze 1.0. Tato zkratka byla v podstatě synonymem pro celou J2ME. Ale velice rychle díky struktuře návrhu vznikly další profily a konfigurace. A je jisté, že v budoucnosti jich ještě mnoho vznikne, respektive bude standardizováno. MIDP je momentálně podporován předními výrobci mobilních zařízení, jako jsou: Motorola, Nokia, Ericsson, RIM, SprintPCS, Nextel a NTT DoCoMo. Zařízení, které splňuje minimální požadavky specifikace MIDP 2.0, musí splňovat nasledující parametry:
MIDP bylo původně navrženo firmou Motorola, z jejiž návrh posléze vyšla specifikace MIDP 1.0 a z ní po nějaké době MIDP 2.0. Podstatá funkčnost, kterou MIDP přidává ke konfiguraci, je uživatelké rozhraní, podpora životního cyklu aplikace a podpora persistentního ukládání dat. Následující tabulka ukazuje které balíky přidává tento profil.
javax.microedition.lcdui | Třídy uživatelkého rozhraní |
javax.microedition.lcdui.game | Třídy k programování her, přidány v MIDP 2.0 |
javax.microedition.media | Třídy pro práci s multimédii, nové v MIDP 2.0 |
javax.microedition.media.control | Ovládání zvuku,.. |
javax.microedition.midlet | Třída Midlet, implementující životní cyklus aplikace |
javax.microedition.pki | Třídy pracující s veřejnými šofrovacími klíči pro zabespečení spojení, přidáno v MIDP 2.0 |
javax.microedition.rms | Třídy pro persistentní ukládání dat |
Tabulka 3: Balíky přidané profilem MIDP
Profil PDAP rozšiřuje konfiguraci CLDC verze 1.1. A klade na hardwarové vybavení no něco větší nároky, než MIDP:
PDAP rozšiřuje MIDP o dalších pár balíků, které dále rozšiřují možnosti progrmování uživatelského rozhraní, práci se soubory, vystupními porty a navíc API pro manipulavání s applikacemi, které nejsou přímo součástí Javové nadstavy, jako jsou kalendáře, adresáře, diáře a jiné součástí správy osobních informaci(PIM).
java.awt | Podmnožina tříd z java.awt balíku ze J2SE na programování konfrotnějšího uživatelského rozhraní |
java.awt.event | Události pro awt |
java.awt.image | Práce s bitmapami |
java.io | Přidáva hlavně třídu pro výstup na tiskárnu. |
java.lang.reflect | Nové třídy, na kterých jsou jiné závislé. |
java.net | Rozšíření o třídu URL |
java.util | Přibyli nově třídy Event a Locale |
javax.microedition.io | Nové třídy pro práci se soubory a porty |
javax.microedition.pim | Manipulace s PIM |
Tabulka 4: Balíky přidané profilem PDAP
Konfigurace CDC je mnohmem bohatší než CLDC a je zaměřena na handheldy vyšší řídy a na přístroje s větším množstvím paměti(alespoň 2MB) a silnějším procesorem(32-bitový). Množna balíku třid definovaná konfigurací CDC poskytuje jen poměrně nízkoúrovňový přístup k obecným prostředkům a mýšlenka profilů je zde směřována stejným způsobem jako u CLDC. Tzn. profil definuje API k hardwarově specifické rodině zařízení. Navíc zde platí u zmíněných třech profilů stejná množinová závislos, jako u MIDP a PDAP. Nejníž je Foundation Profile, jej rozšiřuje Personal Basis Profile a ten ještě víc Personal Profile. Názorný obrázek neuškodí:
Obr.6: Vztah profilů CDC
Přídává poměrně velkou část tříd z J2SE, např podporu šifrování, síťových protokolů, atd.
Ale je určen pro přístroje, které nemají žádné výstupní zařízení.
Z toho důvodu nepřidává balíky objektů pro práci s uživatelským rozhraním.
Nové balíky jen výčtem:
java.io, java.lang, java.lang.ref,
java.lang.reflect, java.math, java.net,
java.security.*, java.text, java.util,
java.util.jar, java.util.zip, javax.microedition.io
Personal Basis Profile, který už je úrčen pro zařízení s výstupem, rozšiřuje FP hlavně o prvky uživatelského rozhraní(AWT), ale také o podporu
JavaBeans a nového typu aplikačního modelu Xlet.
Nové balíčky:
java.awt.*(ale jen některé), java.beans, java.rmi, javax.microedition.xlet
PP profil přidává už jen těžší prvký uživatelského rozhraní a navíc balíček pro spouštění appletů.
Balíky: java.applet, java.awt
Poslení zajímavou částní ve výčtu standardů J2ME jsou volitelné balíky, které přidávají například speciální API pro ovládání specifického hardware:
javax.bluetooth
přímo pro programování Bluetooth a navíc balík javax.obex
pro práci s rozhraním IrDA.
javax.wireless.messaging
pro zpracování textových nebo binárních zpráv, typicky SMS. Toto API se může přidat ke každé konfiguraci.
javax.microedition.media, javax.microedition.media.control, javax.microedition.protocol
Předchozí popis standardů, měl nastínit problematiku klasifikace mobilních zařízení. Typicky budou na trhu zařízení, které budou podporovat jednu třípísmenou zkratku a druhou ne, nebo budou podporovat vše, ale neco v nižší verzi. Programátorovi mobilních zařízení to napoví, jak mocné aplikace na tom, či kterém zařízení může spust. Například jestli se může z mobilního telefonu Nokia XXXX přímo připojit na SQL databázi,atd. Architektura a návrh J2ME je navržene tak, aby postupem času vznikaly profily a konfigurace pro růzené typy mobilních zařízení. Dá se předpokládat, že Java se stane jednou z hlavních prostředků pro programování rostoucího počtu mobilních technologii.
V poslední době se staly celkem dostupné mobilní telefony podporující Javu. Slovo "Java" se dostalo v okamžiku do podvědomí široké neprogramátorské veřejnosti. Každý musí mít mobil s Javou, abý mohl hrát, hromady v Javě naprogramovaných her, které mu operátorza nemalý peníz pošle na jeho mobil. Ale není se čemu divit, Java bývala od svého oficiálního uvedení společností Sun v roce 1995 vždy dobrým zdrojem příjmů pro firmy i pro jednotlivé programátory. Kdo vládl Javě měl se vždycky líp, přestože Java o něco jednodušší než takové C++. Jestli tento trend bude pokračovat, tak bude znalost psaní aplikací pro mobilní přístroje velkou výhodou. Programování v J2ME je velice jednoduché, nejen kvůli programovaní Javě, ale kvůli poměrně okrájenemu API. Nemusíte tak umět mnoho a na mobil dokážete naprogramovat všechno.
Z předchozí teorie víme, že vytváření aplikací pro zařízení jako jsou mobilní telefony je prace nad konfigurací CLCD a nad jejím profilem MIDP. Podle profilu se takovýmto programům říká často MIDLety. Kromě toho se tak řadí mezi speciální Javové aplikace jako jsou Applety, nebo Servlety. Z předchozího textu máme přibližnou představu jak vyvýjet aplikace v Javě. Jak je tomu tedy u MIDletů. Proces vývoje se celkem v mnohém podobá vývoji appletů, přesto jsou tu důležité rozdíly.
Vývoj MIDletové aplikace probíhá většinou v následujících krocích:
Je vidět, že vývoj aplikace probíhá převážně mimo zařízení, kde má být na konci použita. Tím vzniká otázka, jaké softwarové prostředky jsou potřeba, kromě standardní Javy k vývojí MIDletů, například na klasickém PC. Jediné co potřebujete je stáhnout si balík J2ME ze webových stránek společnosti Sun. Jinou alternativou k tomu jsou různé komerční i volně dostpné prostředky a vývojová prostředí. Ale protože nad Javu spravuje především společnost Sun, jsou její produkty nejrozumnější volbou. Balíček j2me_wireless_toolkit existuje jak ve verzích pro operační system MS Windows, tak pro Unix/Linux. Obsahem tohoto balíku jsou rozšiřující balíky, které nejsou součástí J2SE, dále pak emulátor, preverifikátor, profiler, dokumentace k J2ME API, několik ukázkových aplikací a nakonec visuální nástroj pro správu projektů ktoolbar. Ktoolbar má usnadňit a zrychlit vývoj a sestavování aplikací, ale je možné se bez něho obejít.
Než začneme psat konkrétní kód, je nutné si povědět něco o tom, jak standardní MIDlet a v jakém prostředí se pohybuje. MIDlet stejně jako applet je velice specifická aplikace. Byl tak pro něj vytvořen speciální aplikační model. Aplikační modely jsou v Javě celkem čtyři.
První jsme si ukázaly hned na začátku. Je to jednoduchý systémem nijak nekontrolovaný, ale hodně používaný v obecném programování. Je ho životní začne nahráním do paměti a zavoláním metody main a jeho život skončí opuštěním metody main a ukončením všech podtreadů. Charakteristické je, že systém neměl žádnou možnost do něj po spužtění regulerně zasahovat.
Aplety uplatňovali jinou filozofii. Protože se nespouštěli jako samostatné aplikace, ale byly závislé na kontextu, do kterého bylý vsazeny. Museli přizpůsobit svůj životní cyklus tomu, že je kdykoliv může někdo zastavit, nebo ukočit. Na takovou situaci měli umět reagovat. Proto jsou u Appletů definovány čtyři stavy:
init(), start(), stop(), destroy()
.
První se na řadu dostává stav loaded a kód konstruktoru.
Potom applet okamžitě přejde do stavu stopped a proběhned kód init().
Tato metoda je se spouští pouze jednou za život appletu.
Pak se přesune do stavu started, kdy se zobrazí v okně prohlížeče a je vykonán kód start()
Následně může applet přecházet ze stavu started do stoped, kdy proběhne stop() a nazpět spouštěnim start().
Když je applet kontextem zrušen, například přechodem na jinou stránku, applet se ocitá ve stavu destroyed a volá se metoda destroy().
Třetím aplikačním modelem je právě MIDlet. Existuje ještě jeden, tzv. Xlet, který se používá na mobilních zařízeních vyšší třídy s podporou Personal Profilu. MIDlet definuje tři důležité stavy svého životního cyklu:
MIDlet se vytvoří velice podobně jako applet,
tzn. děděním ze třídy javax.microedition.midlet.MIDlet
.
Tato třída zajišťuje životní cyklus celého MIDletu.
Obsahuje metody, které korespondují se stavy životního cyklu:
resumeRequest()
.
notifyPaused()
, ale pak se nevyvolá pauseApp.
Uvnitř pauseApp je vhodné umístit kód, který uvolní tolik systémových prostředků, kolik je možné.
MIDlet bude v paměti čekat na převedení do stavu active, nebo na ukončení.
V prvním případě se bude opět volat metoda startApp()
, v druhém metoda destroyApp()
.
notifyDestroyed()
, destroyApp se nevolá.
MIDlet může navíc požadavek AMS na ukončení odepřít nastavením parametru unconditional na false.
To způsobí vyjímku MIDletStateChangeException.
Tyto metody jsou navíc v třídě MIDlet
defonovány jako abstraktní, takže je programátor musí ve svém MIDletu předefinovat.
Poslední metodou, kterou jsem nezmínil a souvisí s životem MIDletu je getAppProperty(String key), která dokáže číst vlastnosti a parametrý související s MIDletem.
Tyto parametry jsou definovány v takzvaném deskriptoru aplikace a manifestu.
O nich se ještě zmíním.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class BasicMIDlet extends MIDlet
{
public BasicMIDlet()
{
}
public void startApp()
{
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
}
Zdroj 5: Základní konstrukce MIDletu
Třídy, které umožňují pracovat s uživatelským rozhraním tvoří asi největší balík v MIDP. Nabízí nám prostředky k definování formulářů, práci s bitmapovými obrazky a grafikou. Toto vše může být zobrazeno na obrazovce(displayi) vašeho mobilního přístroj. MIDP API definuje jednoduchou hierarchii tříd, které reprezentují zobrazené objekty:
Nejdůležitějším třídou je javax.microedition.lcdui.Display
.
Představuje jakéhosi manažera výstupních i vstupní zařízení.
Jestliže potřebujueme neco zobrazit, potřebujeme tento objek.
Získáme ho voláním statické metody Display.GetDiplay()
.
Obsahuje metody pro manipulaci se zobrazenými objekty, potomky třídy Displayable.
Metoda SetCurrent
nastaví Displayable objekt, který se má zobrazit a metoda GetCurrent
naopak vrátí zobrazovaný Displayable objekt.
Navíc má Display metody pro zjištění hardwarových vlastností displaye.
Metodu na isColor()
, pro zjištění zda je display barevný, a numColors()
, která vrádí počet barev, nebo odstínů šedi displaye.
Třída Displayable je předek pro všechny zobrazitelné třídy.
Zároveň implementuje metody zajišťující odchytávání vstupu ze vstupních zařízení(nejčasteji klávesnice a s ní svázaná nabídka).
Metoda setCommandListener(CommandListener l)
registruje, který objekt implementující interface CommandListener
, má do své povinně předefinované metody commandAction(Command c, Displayable d)
přijímat vstupy.
Metody addCommand(Command cmd)
a removeCommand(Command cmd)
, pak slouží k přídávání a odebíraní vstupů definovaných objekty třídy Command
.
Přímým potomkem třídy Displayable je třída Canvas
, která se maximálně rozšiřuje vstupní a výstupní možnosti a proto se často používá při programování MIDletových her.
Drůhým potomkem je třída Screen
, která je základnou pro formulářově orientované prvky.
Formulářově orientované prvky dělíme na dvě.
První jsou velke vstupní komponenty, nebo komponentové kontajnery, které jsou potomky Screen.
Jsou to třídy Alert, Form, List a Textbox
.
Druhé jsou pak samotné komponetny, potomci třídy Item
, kteří se dají vkládat do objektů kontajnerové třídy Form
pomocí metod add.
Tyto třídy jsou:
Ticker
, kterou můžeme vytvořit efekt textu skrólujícího přes
obrazovku.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
class AcumCalc extends Form
{
TextField a;
StringItem si;
ChoiceGroup cg;
public Command count,exit;
public int val=0;
public AcumCalc() {
super("Kalkulačka"); //konstrukce predka tridy
String op[]={"přičíst","odečíst","násobit","dělit"};
si = new StringItem("Accum:",""); //hodnota v akumulatoru
append(si);setValue(0);
a = new TextField("hodnota","0",4,TextField.NUMERIC); //vstup hodnoty
cg = new ChoiceGroup("operace",ChoiceGroup.EXCLUSIVE,op,null); //volba operace
append(a);append(cg);
count = new Command("počitej",Command.ITEM,1); //prikazy pro pocitani
exit = new Command("konec",Command.ITEM,2); //a konec
addCommand(count);addCommand(exit);
}
public void setValue(int v) {
val=v;
si.setText(String.valueOf(val));
}
public void calculate() {
int v=Integer.valueOf(a.getString()).intValue();
switch(cg.getSelectedIndex()) {
case 0: setValue(val+v);break;
case 1: setValue(val-v);break;
case 2: setValue(val*v);break;
case 3: setValue(val/v);break;
}
}
}
public class CalcMIDlet extends MIDlet implements CommandListener
{
private Display d;
private AcumCalc ac;
public void commandAction(Command c, Displayable d) //odchytavac prikazu
{
if(c==ac.count) ac.calculate();
else if(c==ac.exit) notifyDestroyed();
}
public CalcMIDlet()
{
d = Display.getDisplay(this);
ac = new AcumCalc();
ac.setCommandListener(this);
}
public void startApp(){d.setCurrent(ac);}
public void pauseApp(){}
public void destroyApp(boolean unconditional){}
}
Zdroj 6: Složitější příklad využívající uživatelské rozhraní, implementující jednoduchou akumulátorovou kalkulačku
Profil MIDP, nabízí ještě několik tříd a interfaců pro práci s persistentně uloženými daty.
Jsou to třídy balíku javax.microedition.rms
.
Přístup k těmto datům se přípomíná něco mezi prácí s databází a textovým souborem.
Nejdůležitější třídou je zde RecordStore, která přistupuje k jednotlivým tabulkám(stores) záznamů.
Její statická metoda listRecordStores() vrátí seznam tabulek.
Jiná statickí metoda openRecordStore(String Name,boolean create) otevře tabulku, případně ji vytvoří, pokud neexistuje a parametr create je roven true.
closeRecordStore(), deleteRecordStore(..) slouží k zavírání a mazání tabulky.
Metody addRecord(..), getRecord(..), setRecord(..), deleteRecord(..) slouží k přidávání, vybírání, změně a mazání záznamů v tabulce, pomocí číselného klíče.
Tyto manipulace se záznami tabulky jsou vlastně akce, které mohou vyvolat událost, stejně jako Command v uživatelském rozhraní.
K podpoře tohoto přístupu je zde interface RecordListener, jehož implementací v naší třídě získáme metody, které budou volány, vždy při přidání, změně, nebo smazání záznamu.
RecordStore musíme s RecordListenerem svázat voláním metody RecordStore.addRecordListener.
Další zajímavou možností je definování specifického vyhledávaní pomocí enumeratoru, za použití tříd RecordComparator, RecordEnumeration a RecordFilter.
Máme program ve formě zdrojového kódu. Co se s ním dál může dělat? Nejprve musíme zdrojový soubor přeložit. K tomu nám dobře poslouží stejný překladač Javy, jako se použil v případě appletů. Rozdíl je ale v tom, že při překladu appletů a konzolových aplikací jsme použili standardní množinu Javových API. Teď ovšem používáme nové balíky, jako jsou javax.microedition. Tyto balíky jsme nainstalovali společně s j2me_wireless_toolkit, ale nemáme k nim cesty. Jedna mošnost je nastavit systémovou proměnnou PATH a druhá možnost je použít parametry překladače.
v systému UNIX:javac -bootclasspath /usr/local/WTK104/lib/midpapi.zip my_midlet.java
v systému Windows(wireless_toolkit nesmí být nainstalován v adresáři s absolutní cestou, v které je mezera):javac -bootclasspath C:\WTK104\lib\midpapi.zip my_midlet.java
Takto nám vznikne přeložený program v Javovském bytovem kódu. Překladač přeložil bez ohledu na to, zda je pro aplikaci v MIDP nějaká třída nebo balík povolen. Překladač má k dipozici všechny třídy, které mu na vasem systému jsou dostupné. Pro kontrolu a úpravu bytového kódu k použití na MIDP zařízeních slouží takzvaný preverifikátor. Preverifikátor je součástí j2me_wireless_toolkit, takže ho můžete použít následujícím způsobem.
UNIX:preverify -classpath /usr/local/WTK104/lib/midpapi.zip my_midlet.class
Windows:preverify -classpath C:\WTK104\lib\midpapi.zip my_midlet.class
Preverifikátor přeuspořádá bytový Java kód a výstupní class soubory uloží implicitně v podadresáři ./output. Dalším věc, kterou si ve spojitosti s vlastnostmi zařízení, kde chcete applikaci použít, je ta, že mobilí přístroje nemusí mít souborový systém tak, aby jste mohli do něj mohli zkopírovat strukturovanou množinu class souborů a ostatních souborů jako jsou obrázky. Java pro tento účel navrhla archív JAR. Takže na cílové zařízení zkopíruje jen jeden jednolitý blok binárních dat. Nástroj, který tyto archívy vytváří a pracuje s nimy je program jar(jar.exe ve Windows). Archív pracuje podobně jako zip, nebo tar s tim rozdílem, že umožňuje připojit popisovací textový soubor Manifest. Manifest je obecně nepovinný, ale v případě MIDletů hraje důležitou úlohu. Je vněm popsaná verze použitého standardu, názen, výrobce, soubor ikony a případné parametry. Všechno to se dá zjistit pomocí metody getAppProperty. Manifest může vypadat například takto:
MIDlet-1: BasicMIDlet,/icon.png,BasicMIDlet MIDlet-Name: BasicMIDlet MIDlet-Vendor: MyCompany MIDlet-Version: 1.0 MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-1.0
Zdroj 7: Příklad souboru Manifest
Z manifestového souboru a preverifikovaných class souborů se vytvoří JAR archív nasledujícím způsobem:
UNIX a Windows:
jar cfm BasicMIDlet.jar Manifest BasicMIDlet.class icon.png
Teď už jsme téměř u cíle. Poslední co musíme udelat je popisovací soubor JAD. Neboli Jar Descriptor. Tento soubor je textový a má stejný smysl a formát jako Manifest. Malinko s ale lyší v parametrech. Tabulka 5 shrnuje typy parametrů, které se dají použít, nebo jsou povinné v Manifestu a v JAD souboru. Podstatný parametr, který je nutné správně vyplnit je MIDlet-Jar-Size. Jeho hodnota má být správná velkost JAR archívu v bytech.
Povinné atributy | ||
MIDlet-Name | Jméno MIDletu tak jak ho uvidí uživatel v AMS. | JAD i manifest |
MIDlet-Version | JAD i manifest | |
MIDlet-Vendor | JAD i manifest | |
MIDlet-Jar-URL | JAD | |
MIDlet-Jar-Size | JAD | |
MicroEdition-Profile | manifest | |
MicroEdition-Configuration | manifest | |
Nepovinné atributy | ||
MIDlet-Icon | JAD i/nebo manifest | |
MIDlet-Description | JAD i/nebo manifest | |
MIDlet-Info-URL | JAD i/nebo manifest | |
MIDlet-Data-Size | JAD i/nebo manifest | |
MIDlet-Delete-Confirm | ||
MIDlet-Install-Notify | ||
|User-Defined Attributes| | JAD |
Tabulka 5: Přehled parametrů Manifestu a Popisovače JAD
Takto připravený program můžeme nahrát do mobilního zařízení pomocí nějakého obslužného programu dodaného výrobcem. K přenosu je možné použít datový kabel do seriovéhého portu, nebo IrDa. Jinou možností, která je vhodná v době kdy je program teprve vyvýjen je emulátor. Emulátor typický simuluje jak by byl program prováďen na mobilním telefonu, nebo PDAčku, včetně grafické podoby přístroje. Emulátor je také součástí j2me_wireless_toolkit. Je možné s ním simulovat několik různých přístrojů, s odlyšnými parametry, jako je velikost displaye. Nakonec tedy už jen zbývá spustit program v emulátoru:
UNIX a Windows:
emulator -Xdescriptor:BasicMIDlet.jad
Obr.7: Emulovaný virtuální mobilní telefon se spuštěným MIDletem kalkulačky
Internetové zdroje a odkazy: