2010.08_Java na BlackBerry _[Java].pdf

(1114 KB) Pobierz
441667526 UNPDF
PROGRAMOWANIE JAVA
Java na BlackBerry
Podstawy pisania aplikacji
Artykuł przedstawia podstawy programowania aplikacji
w języku Java pod system BlackBerry. W podstawowym
zakresie omówione zostały cztery tematy: ogólne sposoby
tworzenia aplikacji, budowanie interfejsu użytkownika,
programowanie menu telefonu oraz zagadnienie utrwalania
danych.
Dowiesz się:
• Jakie są sposoby tworzenia aplikacji w języku Java na telefony
BlackBerry;
• Jak tworzyć komponenty interfejsu użytkownika i rozmiesz-
czać je na ekranie;
• Jak dodawać elementy do Menu telefonu;
• Jak zapisywać i odczytywać dane.
Powinieneś wiedzieć:
• Podstawowa znajomość języka Java;
• Znajomość Eclipse IDE;
• Znajomość standardu J2Me może być pomocna.
zaliczanych do segmentu tzw. smartphone'ów .
Jest to produkt kanadyjskiej firmy Research In
Motion produkowany już od 11 lat. Cechą charaktery-
styczną urządzeń BlackBerry jest łatwa obsługa wia-
domości e-mail. Stoi za tym technologia „push-mail”,
polegająca na współpracy terminali (telefony komór-
kowe) z serwerami pocztowymi BlackBerry. Współ-
praca ta przejawia się w „wypychaniu” emaili z serwe-
ra na terminale, co daje możliwość odbioru poczty po-
dobnie jak w przypadku odbioru sms'ów. Funkcjonal-
ność ta stała się znakiem firmowym BlackBerry i w du-
żym stopniu przyczyniła się do sukcesu rynkowego
w USA. W Europie technologia ta jest mniej popular-
na. W USA natomiast udziały firmy RiM w rynku smart-
phon'ów wynoszą ponad 50%. Drugie miejsce zajmu-
je dopiero iPhone.
bluetooth, mają szeroki wybór komponentów do two-
rzenia interfejsu użytkownika. Platforma BlackBer-
ry oferuje również trwałe źródła danych, w związku
z czym możliwy jest zapis danych. To wszystko spra-
wia, że bardzo proste staje się rozwijanie aplikacji wy-
posażonych w najbardziej zaawansowane funkcje i
odpowiadających najbardziej wyszukanym gustom
użytkowników.
Sposoby tworzenia aplikacji
Platforma BlackBerry umożliwia tworzenie aplikacji
w Javie na dwa sposoby. Pierwszy, o którym wspo-
mnieliśmy wyżej, polega na korzystaniu z wbudowa-
nego API i tworzeniu aplikacji uruchamianych bezpo-
średnio na platformie BlackBerry (na systemie opera-
cyjnym). Drugi sposób wiąże się z rozwojem aplikacji
webowych. Wykorzystuje się tu możliwości wbudowa-
nej przeglądarki internetowej. Sam proces tworzenia
aplikacji webowych przebiega identycznie jak w przy-
padku tworzenia aplikacji pod zwykłe przeglądarki
stron internetowych, czyli wykorzystuje się tu techno-
logie takie jak: html, css itd.
Twórcy oprogramowania nie mogą narzekać na ze-
staw narzędzi developerskich dostarczonych przez
firmę RiM. Zarówno proces budowania aplikacji bez-
pośrednio na platformę BlackBerry, jak i tzw. web de-
velopment mają swoje wsparcie w odpowiednich na-
BlackBerry i Java
BlackBerry ma długą historię współpracy z technolo-
gią Java. Od modelu 5810 (2002 rok) większość co-
re’owych aplikacji jest napisanych w tym języku. Pro-
ducent telefonów stworzył również API, przy pomo-
cy którego każdy programista może tworzyć aplikacje
w języku Java. Najnowsza wersja API (ver. 5.0) udo-
stępnia zaawansowany zestaw funkcjonalności. De-
veloperzy mogą programować obsługę m.in. GPS,
36
8/2010
B lackBerry jest rodziną telefonów komórkowych
441667526.028.png 441667526.029.png
 
441667526.030.png 441667526.001.png 441667526.002.png 441667526.003.png 441667526.004.png
Java na BlackBerry
rzędziach. Są to wtyczki do popularnych środowisk
developerskich (IDE), np. do Eclipse'a, lub też cał-
kiem odrębne środowiska programistyczne stworzone
od podstaw przez producenta.
Istotnym udogodnieniem jest także liczna gama
emulatorów poszczególnych modeli telefonów Black-
Berry. Po instalacji Java Development Environment
(JDE) w którejkolwiek wersji, instalowane są domyśl-
ne emulatory. Użytkownik może jednak ściągnąć i za-
instalować emulator praktycznie każdego dostępne-
go na rynku telefonu BlackBerry. Trzeba jednak przy-
znać, że emulatory nowszych modeli działają dość
wolno, stąd też do developmentu wygodne jest korzy-
stanie ze starszych modeli.
W przeciwieństwie do np. platformy Android jest
możliwe jedynie programowalne deiniowanie UI, de-
klaratywne (ustawianie komponentów UI w np. pli-
kach xml ) nie jest obsługiwane. Jest to z pewno-
ścią pewna luka w API. Pozycjonowanie elementów
UI w odseparowanych plikach jest rozwijającym się
trendem w programowaniu interfejsów użytkownika.
Tworzenie GUI przebiega więc podobnie jak w przy-
padku programowania z użyciem biblioteki Swing
z podstawowego pakietu Javy (J2SE). Klasa każde-
go komponentu jest tworzona „ręcznie” przez progra-
mistę, zwykle w konstruktorach lub blokach statycz-
nych.
BlackBerry JDE
W artykule zajmiemy się tylko pierwszym sposobem
tworzenia aplikacji. Będziemy korzystać z wtyczki do
środowiska Eclipse (BlackBerry Java Plug-in for Eclip-
se v1.1) oraz z Java Development Environment w wer-
sji 4.5 (JDE 4.5). Wskazanie wszystkich elementów
potrzebnych do konfiguracji całego środowiska develo-
perskiego BlackBerry znajduje się w ramce „W sieci”.
Listing 1. Główna klasa przykładowej aplikacji
public class Notepad extends UiApplication {
public Notepad () {
pushScreen ( new UICreator () . createMainScreen ()
) ;
}
public static void main ( String [] args ) {
Notepad notepad = new Notepad () ;
notepad . enterEventDispatcher () ;
}
}
Prosta aplikacja
Zakładamy, że czytelnik posiada poprawnie zainstalo-
wane JDE, plugin do Eclipse'a oraz emulator. Zajmie-
my się więc utworzeniem prostej aplikacji będącej for-
mą notatnika. Z racji tego, że artykuł obejmuje pod-
stawy programowania na platformie BlackBerry, w ilu-
strującej go aplikacji zastosowaliśmy dość stare JDE
w wersji 4.5. Jednakże zawarte tam API w pełni za-
spokaja potrzeby tak prostego programu.
W procesie tworzenia aplikacji poruszymy trzy za-
gadnienia. Pierwszym będzie programowanie pro-
stego interfejsu użytkownika (UI), drugim – zaimple-
mentowanie jednej funkcji w „Menu” telefonu, trzecim
– oprogramowanie zapisu danych wprowadzonych
przez użytkownika do trwałego źródła.
Na platformie BlackBerry każda klasa generują-
ca interfejs użytkownika musi dziedziczyć z klasy
UIApplication . Klasa ta zawiera metody powołujące
do życia m.in. układ wszystkich elementów UI. Taką
metodą jest pushScreen() . W naszej aplikacji główną
klasą jest Notepad (Listing 1).
Jak widać, punktem startowym aplikacji jest meto-
da main() , w której tworzony jest obiekt klasy Notepad
i tym samym inicjalizowana jest cała aplikacja.
Listing 2. Metoda createMainScreen() tworząca układ i
wygląd głównego ekranu aplikacji
public MainScreen createMainScreen () {
initMainScreenAndComponents () ;
addComponentsToMainLayoutManager () ;
addLayoutManagerToMainScreen () ;
return mainScreen ;
}
Listing 3. Inicjalizacja VerticalFieldManagera oraz dodawanie
do niego komponentów
private void addComponentsToMainLayoutManager () {
mainVfm = new VerticalFieldManager ( Manager . VERTI
CAL_SCROLL ) ;
mainVfm . setMargin ( 10 , 0 , 0 , 10 ) ;
Tworzenie interfejsu użytkownika
BlackBerry API udostępnia szeroki wachlarz kompo-
nentów służących do budowania interfejsu użytkowni-
ka. Klasy komponentów znajdują się w pakiecie
mainVfm . add ( notesText ) ;
mainVfm . add ( saveButton ) ;
mainVfm . add ( vfm ) ;
}
net.rim.device.api.ui.
www.sdjournal.org
37
441667526.005.png 441667526.006.png 441667526.007.png 441667526.008.png 441667526.009.png 441667526.010.png 441667526.011.png 441667526.012.png
 
PROGRAMOWANIE JAVA
W naszej przykładowej aplikacji za zarządzanie
komponentami UI odpowiada klasa UICreator . Kla-
sa ta posiada pola będące referencjami do poszcze-
gólnych komponentów oraz jedną metodę publiczną
createMainScreen() służącą do stworzenia głównego
ekranu aplikacji. Metoda ta przedstawiona jest na Li-
stingu 2.
Z klasy UICreator korzysta główna klasa aplikacji
Notepad .
Jak każde API dostarczające komponentów do two-
rzenia UI, platforma BlackBerry zawiera komponen-
ty do rozmieszczania innych komponentów na ekra-
nie. Są to tzw. managery ( layout managers ) i w naszej
aplikacji wykorzystamy dwa ich podstawowe rodzaje.
Będzie to HorizontalFieldManager (jak sama nazwa
wskazuje, rozmieszcza elementy poziomo) i Verti-
calFieldManager (rozmieszcza pionowo). Spójrzmy na
fragment kodu, gdzie wykorzystane jest użycie tych
managerów (Listing 3).
Listing 3 pokazuje inicjalizację głównego manage-
ra layoutu zawierającego wszystkie pozostałe kompo-
nenty graficznego interfejsu użytkownika.
Użyta stała Manager.VERTICAL_SCROLL powoduje po-
jawienie się paska przewijania w sytuacji, gdy wy-
świetlane dane nie mieszczą się na ekranie.
Ustawiony margines mainVfm.setMargin(10, 0, 0,
10); oznacza przesunięcie całej zawartości ekranu
w pionie i poziomie o 10 pikseli, tak aby komponenty
UI nie były wyświetlane tuż przy krawędzi ekranu.
Lista dostępnych komponentów interfejsu użytkow-
nika jest podobna do tej, którą oferują konkurencyjne
platformy (Android OS). Znajdziemy tam: komponen-
ty odpowiedzialne za przyciski (buttony), pola teksto-
we, listy rozwijane, tzw. radio buttony, check-boxy i in-
ne. Na Listingu 4 pokazujemy inicjalizację większości
komponentów użytych w aplikacji.
Z listingu tego widać podobieństwa do biblioteki
Swing. Akcje wykonywane po naciśnięciu komponentu
ButtonField (przycisk) obsługują listenery. W tym kon-
kretnym przypadku jest to FieldChangeListener .
Występujący w prawie każdej bibliotece GUI ele-
ment Dialog odpowiedzialny jest za wyświetlenie okna
dialogowego z odpowiednim komunikatem. Jego rola
na platformie BlackBerry jest taka sama.
Z Listingu 3 i Listingu 4 wyłania się powoli cało-
kształt prostego interfejsu użytkownika. Głównym kon-
Listing 4. Inicjalizacja VerticalFieldManagera oraz dodawanie
do niego komponentów
private void initMainScreenAndComponents () {
mainScreen = new MainScreen () ;
mainScreen . setTitle ( new LabelField ( "Notatnik" )) ;
notesText = new EditField ( "Notatka: " , "" ) ;
saveButton = new ButtonField ( "Zapisz" ) ;
saveButton . setChangeListener ( new
FieldChangeListener () {
public void ieldChanged ( Field ield , int
context ) {
NotesInfo notesInfo = new NotesInfo () ;
notesInfo . setElement ( notesText . getText ()) ;
pm . persist ( notesInfo ) ;
Dialog . inform ( "Zapisano!" ) ;
notesText . setText ( null ) ;
}
}) ;
vfm = new VerticalFieldManager () ;
}
Rysunek 1. Ogólny widok interfejsu użytkownika
38
8/2010
441667526.013.png 441667526.014.png
 
441667526.015.png 441667526.016.png
 
Java na BlackBerry
tenerem jest VerticalFieldManager , który posiada trzy
elementy: pole tekstowe z opisem, button do zapisu
notatki oraz zagnieżdżony VerticalFieldManager słu-
żący do wyświetlenia w formie pionowej listy zacią-
gniętych ze źródła danych notatek. Efekt tych usta-
wień widać na Rysunku 1.
sto wiąże się z koniecznością zaprogramowania tzw.
menu telefonu, mającego najczęściej postać listy roz-
wijanej pokazującej się z boku ekranu. Również i plat-
forma BlackBerry posiada API pozwalające na stwo-
rzenie menu. W naszej aplikacji za obsługę menu
odpowiada klasa UICreator . Posiada ona pole typu
MainItem odpowiadające za stworzenie jednego ele-
mentu w menu telefonu. Na Listingu 5 jest przedsta-
wiony kod tej klasy.
Możemy tam znaleźć kilka interesujących fragmen-
tów kodu. Kod w metodzie run() wykonuje się po wy-
braniu pozycji w menu.
Zmienna pm jest referencją do PersistentManagera ,
klasy omówionej dokładnie w dalszej części arty-
kułu, a służącej do zarządzania trwałością obiek-
tów (notatek). Widzimy tam zaciągnięcie ze źró-
dła danych wszystkich dotychczas zapisanych nota-
tek, wykonanie iteracji, w końcu wyświetlenie nota-
tek na ekranie po uprzednim umiejscowieniu ich w
Menu telefonu
Programowanie aplikacji na smartphony bardzo czę-
Listing 5. Komponent MenuItem tworzący element w menu:
„Pobierz Notatki”
private MenuItem getItem = new MenuItem ( "Pobierz
notatki" , 110 , 11 ) {
public void run () {
Vector data = pm . load () ;
boolean dataWasLoaded = ! data . isEmpty () ;
if ( dataWasLoaded ) {
displayNotes ( data ) ;
}
}
private void displayNotes ( Vector data ) {
Enumeration enumeration = data . elements () ;
vfm . deleteAll () ;
index = 1 ;
while ( enumeration . hasMoreElements ()) {
putNotesToLayoutManager ( enumeration ) ;
}
notesText . setText ( null ) ;
}
private void putNotesToLayoutManager ( Enumeratio
n enumeration ) {
NotesInfo nf = ( NotesInfo ) enumeration . next
Element () ;
hfm = new HorizontalFieldManager () ;
hfm . setMargin ( 10 , 0 , 0 , 0 ) ;
hfm . add ( new LabelField ( index ++ + "." )) ;
hfm . add ( new LabelField ( nf . getElement ())) ;
vfm . add ( hfm ) ;
}
} ;
}
Rysunek 2. Menu telefonu z opcją „Pobierz notatki”
www.sdjournal.org
39
441667526.017.png 441667526.018.png 441667526.019.png 441667526.020.png 441667526.021.png 441667526.022.png 441667526.023.png
 
PROGRAMOWANIE JAVA
HorizontalFieldManager . Te zadania oczywiście reali-
zują dwie prywatne funkcje displayNotes(Vector data)
i putNotesToLayoutManager(Enumeration enumeration) .
Na Rysunku 2 jest przedstawiony widok aplikacji
z rozwiniętym menu telefonu.
Listing 6. Klasa jedynej encji w aplikacji - NotesInfo
public inal class NotesInfo implements Persistable {
public static inal int ID = 0 ;
public static inal int NAME = 1 ;
private Vector elements ;
Zapis danych
Jedną z podstawowych funkcji praktycznie każdej
aplikacji jest przechowywanie danych, na których
aplikacja działa. BlackBerry umożliwia zapis danych
w systemie i odtwarzanie ich zarówno po ponownym
uruchomieniu aplikacji, jak i po restarcie całego sys-
temu operacyjnego (restart telefonu). Od wersji JDE
5.0 istnieje możliwość zapisu danych w bazie danych
SQLite. Ten niewielki silnik bazodanowy znany jest
także m.in. z systemu Android i świetnie sprawdza się
w zastosowaniach mobilnych.
Na platformie BlackBerry, każdy obiekt, któ-
ry chcemy zapisać, musi implementować interfejs
Persistable . W naszym projekcie klasą encji jest
NotesInfo przechowująca informację o zapisanym
tekście notatki. Na Listingu 6, z racji jego niewielkiej
objętości, umieściliśmy kod całej klasy.
Oczywiście klasa ta opakowuje kilka funkcjonalno-
ści. Na przykład zmienna typu Vector może służyć
do przechowywania kilku właściwości danej notatki.
W naszym przykładzie korzystamy jednak tylko z za-
pisu jednej właściwości – samego tekstu notatki.
Samą logiką zapisu zajmuje się stworzona przez
nas klasa PersistentManager . Zawiera ona od-
wołanie do dostarczonej przez BlackBerry klasy
PersistentObject . Stanowi ona faktyczne opakowa-
nie dostępu do źródła danych i interfejs komunika-
cji z nim. Sam obiekt uzyskuje się, korzystając z klas
API: PersistentObject store = PersistentStore.getP
ersistentObject(0xdec6a67096f133cL);
W metodzie getPersistentObject(long key) użyliśmy
dedykowanego klucza identyfikującego. Każdy obiekt
zapisywany do źródła danych (czyli w naszym przypad-
ku – NotesInfo ) musi mieć unikalny klucz jednoznacz-
nie identyfikujący go w źródle danych i pozwalający na
wykonywanie na nim akcji zapisu lub pobrania.
Bazując na tych założeniach, utworzyliśmy dwie me-
tody w PersistentManager – jedną do zapisu notatki,
drugą do jej odczytu. Pokazane jest to na Listingu 7.
public NotesInfo () {
elements = new Vector ( 1 ) ;
for ( int i = 0 ; i < elements . capacity () ; ++ i ) {
elements . addElement ( new String ( "" )) ;
}
}
public String getElement () {
return ( String ) elements . elementAt ( NAME ) ;
}
public void setElement ( String value ) {
elements . addElement ( value ) ;
}
}
Listing 7. Metody do zapisu i odczytu notatek ze źródła
danych
public void persist ( NotesInfo notesInfo ) {
data . addElement ( notesInfo ) ;
synchronized ( store ) {
store . setContents ( data ) ;
store . commit () ;
}
}
public Vector load () {
synchronized ( store ) {
data = ( Vector ) store . getContents () ;
}
return data ;
}
W Sieci
• Eclipse IDE do ściągnięcia: http://www.eclipse.org/downloads/
• BlackBerry Plugin do Eclipse'a: http://na.blackberry.com/eng/developers/javaappdev/devtools.jsp
• BlackBerry JDE – różne wersje: http://na.blackberry.com/eng/developers/javaappdev/javadevenv.jsp
• Dostępne emulatory: http://na.blackberry.com/eng/developers/resources/simulators.jsp
• Opis instalacji i koniguracji środowiska developerskiego: http://na.blackberry.com/developers/resources/A1_Setting_up_neces-
sary_tools_v5.0.pdf
• Dokumentacja BlackBerry API ver. 4.5 (JavaDoc): http://www.blackberry.com/developers/docs/4.5.0api/index.html
40
8/2010
441667526.024.png 441667526.025.png 441667526.026.png 441667526.027.png
Zgłoś jeśli naruszono regulamin