You are on page 1of 4

Programowanie urządzeń mobilnych

Android vs. Java ME


Cz. III: Komunikacja

Flickr jest cenionym serwisem internetowym umożliwiającym gromadzenie


i udostępnianie zdjęć. Jako serwis Web 2.0 ma tendencję do korzystania z
nowatorskich technik i metod komunikacyjnych. W kontekście porównania
technologii Java ME oraz Android przyjrzymy się bliżej sposobom integracji
aplikacji z serwisem.
Interfejsy i klasy sieciowe zostały umieszczo-
Dowiesz się: Powinieneś wiedzieć: ne w następujących paczkach :
• Podstawowych komponentach sieciowych • Podstawowa wiedza z zakresu sieci kompute-
platformy Android; rowych; • java.net;
• Bibliotekach wspierających architekturę zo- • Podstawowa obsługa środowiska Eclipse. • android.net;
rientowaną na usługi w Java ME oraz Android; • org.apache.http;
• Sposobie na integrację z serwisem Flickr. • android.telephony, android.location.

Biblioteka java.net
aplikacji działających na „dorosłych” kompu- Podstawowe klasy i interfejsy zaczerpnięte są z
terach. Nadmiar danych odbieranych przez Java SE. Na stronie Sun można znaleźć tutorial,
Poziom trudności aplikacje mobilne niejednokrotnie stanowił który od podstaw pokazuje, w jaki sposób z nich
ciężki orzech do zgryzienia. Wprowadzenie korzystać. Uproszczony diagram prezentuje stos
szybkiego łącza UMTS oraz wzrost mocy protokołów, na podstawie którego powstała ta bi-
obliczeniowej urządzeń znacznie poprawi- blioteka (Rysunek 3).
Wstęp ło wydajność działania systemów mobilnych. Oto charakterystyka podstawowych klas, które
Dla wielu ludzi Internet stał się niezbędnym Aplikacje stały się bardziej atrakcyjne i moż- niezbędne będą do budowy aplikacji sieciowej.
elementem ich funkcjonowania we współ- na z nich korzystać niemalże w każdym miej- Do konstrukcji adresów internetowych wy-
czesnym świecie. Znalazł on zastosowanie scu objętym zasięgiem sieci komórkowej. korzystuje się klasę URL oraz URI. Przykładowe
w różnych dziedzinach życia , między inny- W Java Microedition komunikacja siecio- utworzenie obiektu klasy URL wygląda nastę-
mi ułatwił komunikację, a szczególnie szyb- wa początkowo funkcjonowała w oparciu o pująco:
kie przesyłanie wiadomości bez względu na protokół HTTP. MIDP 2 wprowadził gniazda
odległość. i rozszerzył sposoby łączności internetowej. URL url = new URL("http://www.example.com");
Wykorzystywany jest zarówno w pracy ja- Na ich podstawie powstały protokoły wyższej URL url2 = new URL(url, "page1.html");
ko jedno z narzędzi zdobywania informacji, warstwy zorientowanej na usługi. Android ja-
ale także w domu jako rozrywka. Świat te- ko młoda platforma wprowadził podstawo- Natomiast obiekty klasy URI wykorzystywane
lefonii komórkowej nie mógł obejść się bez we mechanizmy sieciowe. Większość wyso- są do utworzenia poprawnych adresów URL.
wprowadzenia możliwości przyłączenia się kopoziomowych interfejsów komunikacyj- Czasami w adresie mogą wystąpić znaki spe-
do globalnej sieci. Początkowo mobilne surfo- nych jest w fazie rozwoju. W niniejszym od- cjalne, jak np. spacja: http://www.example.com/
wanie umożliwiały przeglądarki po stronach cinku cyklu artykułów opisujących Andro- hello world/. Utworzenie poprawnego adresu za
WAP. Jednak nie były one tak atrakcyjne jak id OS przedstawię, w jaki sposób aplikacje pomocą klasy URL wymaga ręcznego zakodowa-
strony oglądane na monitorach komputerów. działające pod kontrolą tego systemu mogą nia spacji:
W miarę postępu technologicznego pojawiły komunikować się ze światem zewnętrznym. URL url = new URL("http://
się pierwsze przeglądarki stron WWW. Co Metody integracji dla Java ME zostały opisa- www.example.com/hello%20world").
prawda nie mogą one konkurować z prze- ne w jednym z numerów Software Developer Dlatego można wykorzystać klasę URI, któ-
glądarkami z komputerów PC, ale to kwestia Journal 06/2008. Dlatego przede wszystkim ra automatycznie zadba o transformację tych
czasu, kiedy dogonią ich możliwości. skupię się na opisie mechanizmów dostęp- znaków:
Z aplikacjami na urządzeniach mobilnych nych na platformie Android, zaś w kontek-
historia jest podobna. Początkowo komuni- ście ewentualnych porównań będę odwoły- URI uri = new URI("http", "www.example.com",
kacja postępowała wolnym łączem GPRS. wał się do Java ME. "/hello world/", "");
Zmuszało to użytkowników do ogromnej URL url = uri.toURL();
cierpliwości, czasami do rezygnacji z korzy- Podstawowe komponenty
stania z aplikacji. Ponadto serwisy interne- Na początek warto prześledzić, jakie standar- Z obiektu reprezentującego adres URL, za po-
towe w większości były zoptymalizowane dla dowe komponenty sieciowe oferuje Android. mocą metod można także wydobyć przydatne

66 07/2009
Android vs. Java ME cz. III: Komunikacja

informacje dotyczące nazwy protokołu, adresu Interfejs sieciowy jest punktem połączenia mię- procesowej, za którą odpowiadają obiekty klasy
serwera, numeru portu oraz inne. dzy komputerem a publiczną lub prywatną sie- LocalSocket oraz LocalServerSocket. Lokal-
Szybkie odczytanie danych bezpośrednio cią. Fizycznie jest to karta sieciowa (NIC), ale w ne gniazda stanowią szybkie medium wymiany
z obiektu URL jest możliwe przez otworzenie systemie operacyjnym traktuje się ją jako wirtu- danych ze względu na utworzenie ich w abstrak-
strumienia (Listing 1). Nawiązanie połączenia alny odpowiednik. Klasa NetworkInterface do- cyjnej przestrzeni nazw UNIX, a nie w systemie
umożliwia zapis oraz odczyt danych z serwera. starcza podstawowych informacji o dostępnych plików. Klasa pomocnicza Proxy służy do konfi-
Służy do tego klasa URLConnection oraz jej po- interfejsach sieciowych NIC. guracji oraz informacji na temat serwerów pro-
chodne (Listing 2). xy. Do przetwarzania adresów URI posłużą nam
Na tym etapie można się dopatrzeć podo- Biblioteka android.net klasy: Uri, Uri.Builder, UrlQuerySanitizer.
bieństw klas URLConnection z interfejsami Ja- Komponenty tej biblioteki stanowią uzupełnie-
vaME Connection (Rysunek 1). Składnia tych nie i rozszerzenie paczki java.net. Podstawowym Klient HTTP apache
klas jest zbliżona, w ramach przykładu można elementem jest klasa ConnectivityManager, Protokół HTTP (ang. Hyper-Text Transfer Proto-
porównać javax.microedition.io.HttpConn która monitoruje interfejsy sieciowe (Wi-fi, col) jest jednym z najbardziej znaczących stan-
ection (z JME) oraz java.net.HttpURLConne GPRS, UMTS, etc.). Wykrywa zmiany zmiany dardów komunikacji w sieci Internet. Stano-
ction (z Android). W Java ME połączenie by- połączenia i wysyła komunikat rodzaju broad- wi fundamentalną podstawę funkcjonowania
ło otwierane przez fabrykę Connector.open() cast intent. Nawiązuje połączenie z inną siecią przeglądarek stron WWW. Wiele aplikacji sie-
, natomiast w tym przypadku następuje to w przypadku utraty połączenia z bieżącą. Do- ciowych wykorzystuje go jako środek transpor-
przez obiekt URL. Podobna zasada wykorzysty- starcza API umożliwiające aplikacjom na odpy- tu do przesyłania danych między sobą. W syste-
wana jest przy połączeniach za pomocą gniazd tywanie się o stan dostępnych sieci . Informa- mie Android do zrealizowania podstawowej ko-
oraz datagramów. Odpowiadają za to klasy cje o sieci oraz konfiguracji węzłów można uzy- munikacji przez ten protokół wystarczą klasy
Socket, ServerSocket, DatagramSocket, skać z klasy NetworkInfo lub DhcpInfo (ang. paczki java.net. Jednak dla bardziej zaawan-
DatagramPacket i MulticastSocket . Pomoc- Dynamic Host Configuration Protocol). Systemy sowanych rozwiązań sieciowych implementa-
ne w tworzeniu tego rodzaju połączeń są klasy pochodne od Unix (między innymi Android) cja klienta przy pomocy tych klas może okazać
Inet*, które dotyczą adresów internetowych. wspierają gniazda lokalnej komunikacji między- się dość pracochłonna. Wynika to z tego, że bra-
kuje w nich pewnych gotowych funkcjonalno-
ści i elastyczności, jakie można spotkać na przy-
Inne podstawowe interfejsy i protokoły sieciowe... kład w rozwiązaniach przeglądarek stron inter-
WLAN netowych. Przyczyniło się to do powstania pro-
W Java ME nie mamy możliwości bezpośredniego dostępu do interfejsu sieciowego. Jest on
jektu Apache HttpComponents, który jest im-
przeźroczysty i ukryty w implementacji maszyny wirtualnej. Android dostarcza szeregu klas i in-
terfejsów – android.net.wifi, które mogą posłużyć do wykorzystania pewnych funkcjonalności plementacją komponentów protokołu HTTP
bezprzewodowej karty WiFi. w czystym języku Java . Biblioteka ta uzupeł-
Bluetooth nia system Android o bogate funkcjonalności
W Java ME obsługę interfejsu Bluetooth zaimplementowano w opcjonalnym rozszerzeniu JSR klienta HTTP:
82. Niestety w Android, ze względu błędów projektowych, API obsługi Bluetooth zostało tym-
czasowo usunięte. • pełna implementacja metod HTTP we fra-
GPS mework'u zorientowanym obiektowo;
Lokalizacja oraz mapy stanowią nieodłączny element systemu Google Android. Funkcjonalno- • wspiera szyfrowanie przez HTTPS;
ści wspierane są przez dwie biblioteki: android.location oraz com.google.android.maps. Nato-
miast na platformie Suna powstało opcjonalne API (JSR 179) Location, które wykorzystuje zaso-
• przeźroczyste(ang. transparent) połączenie
by sprzętowe (GPS, sieć) do ustalenia pozycji. Bliżej tym komponentom przyjrzymy się w jednym przez proxy HTTP;
z kolejnych artykułów. • tunelowe połączenie HTTPS przez proxy
Email HTTP;
Do wysyłania wiadomości e-mail można spróbować wykorzystać klasy wbudowanej aplikacji do- • uwierzytelnienie podstawowe/skrócone
stępnej w kodach źródłowych: {$anroid.src}\packages\apps\Email\src\com\android\. (Basic, Digest authentication schemes);
Na jednej ze stron można znaleźć rozwiązanie zbudowania klienta email w oparciu o bibliote- • koncepcja wtyczek w przypadku innych
ki Sun activation-1.1.jar oraz mail-1.4.jar. Java ME nie oferuje standardowych narzędzi do obsługi
wiadomości email. Należy doszukiwać się gotowych rozwiązań lub zaimplementować na pod- schematów uwierzytelnienia;
stawie gniazd TCP/IP. • możliwość dołączenia bezpiecznych gniazd
XMPP innych rozwiązań;
Implementacja protokołu XMPP (GTalk) została usunięta z Android i w tej chwili trudno stwier- • zarządzanie połączeniami dla aplikacji wie-
dzić, kiedy będzie przywrócona. Alternatywę mogą stanowić gotowe biblioteki, poddane próbie lowątkowych( maksymalna liczba połą-
wykorzystania w Android. W Internecie można dopatrzeć się artykułów, których autorzy sugeru- czeń na host, detekcja i zamykanie nieaktu-
ją pewne rozwiązania. Podobna sytuacja jest w Java Me, gdzie należy zbadać, które rozwiązania
alnych połączeń);
nadają się dla tego środowiska.
• automatyczne wsparcie dla obsługi cookie;
Telefonia SMS/MMS
Możliwości telefonii komórkowej można zrealizować w Android za pomocą klas i interfejsów w
• mechanizm wtyczek dla innej polityki ob-
bibliotece android.telephony. Natomiast w Java ME wykonanie połączenia z określonym nu- sługi cookie;
merem telefonu możliwe jest tylko w MIDP 2.0, poprzez wykorzystanie metody MIDlet.platfor • żądanie/odpowiedź w formie strumie-
mRequest(). Wiadomości SMS(MMS) można wysyłać, korzystając z opcjonalnego WMA API, opi- ni output/input dla efektywnego zapisu/
sanego po części w artykule „Automatyczne uruchamianie MIDletów” w Software Developer's odczytu danych bezpośrednio do/ze stru-
Journal 08/2008.
mienia gniazda serwera;
Sensory • wykorzystanie KeepAlive dla trwałego pod-
W ostatnim czasie popularne sensory, jak kompas oraz akcelerometr, znacznie wzbogaciły ma-
nipulowanie aplikacjami. W Java ME prowadzony jest projekt, który wprowadza obsługę senso-
trzymania połączenia;
rów Mobile Sensor API (JSR 256). Nie doczekaliśmy się jednak jego urzeczywistnienia w urządze- • bezpośredni dostęp do kodu odpowiedzi
niach. W Android udostępniono API do obsługi wspieranych przez urządzenie sensorów (kom- oraz nagłówków wysłanych przez serwer;
pas, akcelerometr) w postaci biblioteki android.hardware. • możliwość ustawienia czasu timeouts;
• kod źródłowy dostępny na licencji Apache.

www.sdjournal.org 67
Programowanie urządzeń mobilnych

Na Listingu 3 zaprezentowany jest jeden nym luźno powiązane z systemami operacyjny- datkowe narzędzia do stworzenia serwisu czy
z przykładów zastosowania klienta Apa- mi i językami programowania. Wybierając me- usługi sieciowej. Nie skupia się na szczegółach
che HTTP. Więcej szczegółów oraz przy- tody integracji, będziemy sugerowali się inter- implementacji ani zastosowanych technolo-
kładów można znaleźć na stronach projek- fejsami dostępu, jaki oferuje nam serwis Flickr. giach. Wszystkie te cechy przyczyniają się do
tu http://hc.apache.org/httpcomponents-client/ Wprowadzenie teoretyczne będzie pomocne do ogromnej popularności tej koncepcji. Aby roz-
index.html. realizacji implementacji opisanych podejść i roz- szyfrować nazwę tego stylu, nadaną w dyser-
Opisane pokrótce biblioteki sieciowe do- wiązań w naszej aplikacji MobiFlickr. Zatem na tacji przez Roya Fieldina, posłużę się abstrak-
starczane są wraz z systemem Android. Na podstawie strony http://www.flickr.com/services/ cyjnym przykładem strony samochodów mar-
ich podstawie bazują wszystkie kolejne pro- api/ komunikację z serwisem można nawiązać ki Alfa Romeo. Jednym z zasobów w mnie-
tokoły i mechanizmy komunikacji. W dal- na trzy sposoby: REST, XML-RPC oraz SOAP. maniu REST może być AlfaRomeo156.html,
szej części artykułu opisane zostaną wyso- którego określa następujący adres URL: http:
kopoziomowe komponenty zorientowane REST //www.alfaromeo.com/AlfaRomeo156.html.
na usługi. REST (ang. Representational State Transfer) jest Reprezentacja (ang. representation) tego zaso-
stylem lub podejściem architektonicznym, bu jest zwrócona jako AlfaRomeo156.html.
Architektura którego celem jest minimalizacja latencji(czas Aplikacja kliencka po otrzymaniu reprezen-
zorientowana na usługi między wysłaniem żądania a otrzymaniem tacji przechodzi w określony stan (ang. state).
SOA (ang. Service-Oriented Architecture) to archi- odpowiedzi) oraz komunikacji sieciowej przy Klient, wykorzystując hyperlink, może uzy-
tektura zorientowana na usługi, która umożli- maksymalizacji niezależności oraz skalowalno- skać dostęp do innego zasobu, a poprzez no-
wia tworzenie i użytkowanie procesów bizne- ści komponentów. Nie jest oficjalnym standar- wą reprezentację przejdzie w inny stan. Zatem
sowych. Zapewnia infrastrukturę informatycz- dem lub metodą budowy serwisów interneto- klient zmienia stan (ang. transfers) z każdą no-
ną, dzięki której aplikacje mogą komunikować wych, a jedynie koncepcją. Określa ona zbiór wą reprezentacją zasobów. Składając słowa klu-
się między sobą oraz angażować się w procesy reguł oraz zasad udostępniania zasobów serwi- czowe opisanego procesu, można dojść do na-
biznesowe w formie usług. Komponenty usług su. Jej siła drzemie w rozwiązaniu, w którym zwy Representational State Transfer. Nie będę
sieciowych pracują w środowisku heterogenicz- nie jest potrzebne żadne rozszerzenie oraz do- tutaj polemizował i mocno zagłębiał się w tej fi-
lozofii. Niejednokrotnie jest ona tematem spo-
rów i dyskusji technicznych ze względu na to,
Listing 1. Przykład użycia klasy URL że nie jest formalnym standardem. W obrębię
URL googleURL = new URL("http://www.google.com"); tego artykułu opisane zostaną ogólne zasady i
BufferedReader in = new BufferedReader( cechy tego stylu.
new InputStreamReader( Ułatwi to analizę serwisu Flickr i odpowie
googleURL.openStream())); na pytanie: Czy realizuje on w pełni podejście
String inputLine; koncepcji REST? Również w kontekście klien-
while ((inputLine = in.readLine()) != null) ta mobilnego będzie można spojrzeć przez pry-
System.out.println(inputLine); zmat zasad REST, czy istnieją przeszkody w ich
adaptacji na porównywanych platformach.
in.close();
Zasady REST
Listing 2. Przykład nawiązania połączenia URLConnection Aplikacje wykorzystujące REST mogą być za-
public void connectToServer(String urlStr, String msg){ implementowane w wielu różnych technolo-
try{ giach. Komponenty systemu komunikują się
przez standardowe interfejsy (np. HTTP) i wy-
URL url = new URL(urlStr); mieniają reprezentacje zasobów. Do podstawo-
URLConnection connection = url.openConnection(); wych zasad, jakie należy przestrzegać budu-
connection.setDoOutput(true); jąc aplikacje, należą: unikalny adres zasobów,
multi-reprezentacja zasobów, zastosowanie hi-
OutputStreamWriter out = new OutputStreamWriter(connection.getO perlinków, bufor (ang. cache), bezstanowa ko-
utputStream()); munikacja, jednolity interfejs oraz architektu-
out.write(msg); ra wielowarstwowa.
out.close();
Unikalny adres
BufferedReader in = new BufferedReader(new InputStreamReader(connection.get Najważniejszą zasadą koncepcji REST jest uni-
InputStream())); kalny identyfikator zasobów serwisu.
String decodedString; Odnosić się on może do pojedynczych eg-
zemplarzy zasobów:
while ((decodedString = in.readLine()) != null) {
System.out.println(decodedString); • http://sklep.com/klienci/1234;
} • http://sklep.com /zamowienia /2008/05/
in.close(); 446688;
• http://sklep.com/produkty/7272
}catch(Exception ex){
ex.printStackTrace(); lub ich kolekcji:
}
} • http://sklep.com/zamowienia/2008/05;
• http://sklep.com/produkty?kolor=czarny.

68 07/2009
JEŻELI JESTEŚ ZAINTERESOWANY DALSZĄ
CZĘŚCIĄ ARTYKUŁU ZACHĘCAMY DO
ZAKUPU SDJ 7/2009

��������������������� ��������������������

You might also like