Naprogramujte si mobil

Část 2. Začínáme programovat Minule jsme si ukázali důležité vlastnosti hlavní třídy "telefonních" aplikací, kt...


Část 2. Začínáme programovat
Minule jsme si ukázali důležité vlastnosti hlavní třídy "telefonních" aplikací,
která je potomkem abstraktní třídy MIDlet. Dnes si již vytvoříme první MIDlet a
povíme si něco o nízkoúrovňovém uživatelském rozhraní.
Nyní již víme vše potřebné pro to, abychom mohli připravit a spustit jednoduchý
prográmek, který ilustruje minule popsané stavy MIDletu. Protože nejsem
přítelem aplikací typu "Hello world" (pro její vytvoření toho stejně ještě víme
příliš málo), připravil jsem malou suitu MIDletů, kterou se postupně naučíme
vytvořit.
Vytvoříme jednoduchoučký prográmek simulující házení kostkou a postupně si na
něm ukážeme, jaké možnosti nám MIDlety nabízejí a co musíme udělat, aby jich
náš program využil. Abychom mohli hned na počátku spustit funkční netriviální
MIDlet, bude mít vlastní spuštění programu a alokaci všech prostředků na
starosti třída DieCast (tu naprogramujeme za chvíli), jejíž instanci v hlavním
MIDletu vytvoříme. Nuže, tvořme:
import javax.microedition.midlet.*;
public class DieMIDlet_1 extends MIDlet {
private final static boolean L = true; //Ladění=true, nasazení=false
private static int pocet = 0;
private int poradi = ++pocet;
public DieMIDlet_1() {
if(L)System.out.println("MIDlet_1 č. "+ poradi +" vytvořen");
}//FirstMIDlet()
public void startApp() {
if(L)System.out.println ("MIDlet_1 č. " + poradi + " aktivován");
new DieCast_1(this);
}//startApp()
public void pauseApp() {
//Převod do čekajícího stavu v této aplikaci nepředpokládáme
if(L)System.out.println ("MIDlet_1 č. " + poradi + " uspán");
}//public void pauseApp() public void destroyApp( boolean sure )
throws MIDletStateChangeException {
if(L)System.out.println ("MIDlet_1 č. " + poradi + " ukončován sure=" + sure);
if( !sure ) throw new MIDletStateChange Exception ("NECHCI!");
if(L)System.out.println(" nebylo úniku je ukončen");
notifyDestroyed();
}//public void destroyApp( boolean unconditional )
}//public class DieMIDlet_1 extends MIDlet
V programu jsem použil řadu tisků na standardní výstup. Spustíte-li program na
emulátoru, nepůjdou tyto tisky na obrazovku telefonu, ale do zvláštního okna.
Když poběží aplikace na skutečném telefonu, nic se zobrazovat nebude, nicméně
příkazy tisku budou spotřebovávat jak čas, tak paměť. Doporučuji proto oblíbené
řešení všechny kontrolní tisky podmiňujte splněním nějaké statické konstantní
podmínky. Protože je tato podmínka statická a konstantní, vyhodnotí ji
překladač již v době překladu a nebude-li splněna, vůbec daný příkaz do
programu nezařadí (to ale již asi znáte).
Nyní tedy stačí požádat váš nástroj, aby program přeložil a spustil.

Displej
V MIDletech mohou na displeji něco zobrazovat pouze instance potomků třídy
Displayable (tato třída je abstraktní). Chce-li nějaký objekt něco nakreslit na
displej, musí si jej nejprve uzurpovat pro sebe. Z toho vyplývá, že dokud tak
některý objekt z aplikace neučiní, kreslí si na něj operační systém. Aby objekt
mohl prozradit displeji ono sladké tajemství, že je teď jeho, musí nejprve
získat odkaz na objekt typu Display. Ve třídě Display k tomu slouží její
statická metoda public static Display getDisplay (MIDlet m).
Jak vidíte, k jejímu vyvolání je potřeba odkaz na MIDlet, o jehož displej se
jedná. Ten jsme ale v našem minulém programu volané funkci předali, takže je
vše v pořádku. Vlastní převzetí displeje pak dosáhneme zavoláním metody public
void setCurrent(Displayable nextDisplayable).

Příkazy
Třída Displayable nabízí objektům svých potomků nejenom možnost kreslení na
displej, ale také možnost definovat sadu příkazů a reakci na ně. Příkazy jsou
instancemi třídy Command a vytvářejí se konstruktorem:
public Command(String label, int commandType, int priority), kde label je text,
který se objeví na obrazovce jako zástupce příslušného příkazu, commandType je
jedna z osmi předdefinovaných konstant definujících druh příkazu, priority
naznačuje důležitost příkazu (menší číslo vyšší důležitost). Má-li systém místo
na displeji, vybere si, které příkazy na něm zobrazí. Standardně bývají dva,
ale má-li malý displej, nemusí zobrazit také žádný. Většinou vybírá nejprve
podle druhu příkazu a teprve pak podle priority.
Příkazy můžeme pouze přidávat a odebírat. Pro přidání příkazu do sady daného
objektu slouží metoda
public void addCommand(Command cmd),
pro jejich odebírání pak metoda
public void removeCommand(Command cmd).
Samotné zařazení příkazů do sady se však nijak neprojeví, dokud také
nedefinujeme, jak na jejich zadání bude systém reagovat. K tomu slouží metoda
public void setCommandListener(CommandListener l).
Všimněte si, že tato metoda posluchače nepřidává, jak jste možná zvyklí z AWT,
ale nastavuje. Příkazy mohou mít vždy pouze jediného posluchače. Tímto
posluchačem musí být objekt třídy implementující rozhraní CommandListener, jež
definuje jedinou metodu
public void commandAction(Command c, Displayable d),
které systém v prvním parametru předá odkaz na zadaný příkaz a v druhém
parametru odkaz na objekt, jenž v daném okamžiku právě vlastnil displej. Uvnitř
metody bývá většinou násobný if ... else if, který zjišťuje, jaký příkaz byl
vlastně zadán, a podle toho spouští příslušnou akci. Velmi často nastavuje
objekt jako posluchače sám sebe.
Autor pracuje jako EDU Expert ve firmě Amaio Technologies.









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.