Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00391 009633 11232698 na godz. na dobę w sumie
Android Poradnik programisty - ebook/pdf
Android Poradnik programisty - ebook/pdf
Autor: Liczba stron:
Wydawca: Promise Język publikacji: polski
ISBN: 978-83-7541-177-5 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie
Porównaj ceny (książka, ebook, audiobook).

Zbiór gotowych do użycia, unikatowych przepisów
Ten, obejmujący wiele wersji systemu Android aż do wersji Android 4.1, wyczerpujący zbiór to zestaw obowiąz-kowy dla zarówno zaawansowanych, jak i początkujących programistów. Każdy rozdział zawiera rozmaite przepisy i wskazówki, które rozwiązują typowe, codzienne wyzwania. Każdy przepis zawiera omówienie problemu i propo-nowane rozwiązania wraz z dostosowywalnym, samodzielnym plikiem projektu ilustrującym jego zastosowanie.
Oto kilka pomocnych przepisów, które znajdziesz w książce Android – poradnik programisty:
Podstawy systemu Android
Programowe rejestrowanie odbiorników komunikatów, samoczynne uruchamianie aplikacji podczas rozruchu, wywoływanie wbudowanych aplikacji, umożliwianie wywoływania aplikacji przez inne elementy
Interfejs użytkownika, widoki i listy
Implementacja systemu oceniania, ładowanie zawartości z folderu Assets, wyświetlanie menu kontekstowych, okien dialogowych, stronicowanie treści, dostosowywanie widoku listy, animowanie i zmienianie obrazów za pomocą ImageSwitcher
Telefonia, wiadomości i sieć
Blokowanie połączeń wychodzących, automatyczne odpowiadanie, odczytywanie numeru telefonu, IMEI i identyfikatora SIM, monitoring wysyłanych wiadomości SMS, przechwytywanie przychodzących wiadomości, odczytywanie usług Web XML, tworzenie serwera i klienta gniazd, obsługa Bluetooth, wyszukiwanie adresu poprzez odwrotne geokodowanie i vice versa
Usługi oparte na lokalizacji
Ustalanie położenia geograficznego poprzez GPS lub triangulację sieci komórkowej, rejestrowanie położenia, wykonywanie zdjęć, włączanie lampy błyskowej, odczytywanie kodów paskowych
Przechowywanie danych
Zapisywanie i ładowanie preferencji, tworzenie ekranu preferencji, zapisywanie plików w różnych lokalizacjach, dołączanie plików do projektu
Wei-Meng Lee jest założycielem firmy Developer Learning Solutions (www.learn2develop.net), zajmującej się praktycznymi szkoleniami w zakresie najnowszych technologii firm Microsoft i Apple. Jest autorem wielu publikacji online oraz książek Beginning Android 4 Application Development i Beginning iOS 5 Application Development.
wrox.com
Forum programistów
Dołącz do naszego forum Programmer to Programmer, aby zadać pytania dotyczące tej książki (i nie tylko), podyskutować na najbardziej gorące tematy branżowe i poznać kolegów-programistów z całego świata.
Kod do pobrania
Wykorzystaj przykładowy kod do tej książki, jak również przykłady z wielu innych publikacji – wszystkie gotowe do użycia.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Android™ – poradnik programisty 93 PRZEPISY TWORZENIA DOBRYCH APLIKACJI Wei-Meng Lee APN Promise SA ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Original English language edition © 2013 by John Wiley Sons, Inc. Tytuł oryginału: Android™ Application Development Cookbook: 93 Recipes for Building Winning Apps, ISBN 978-1-118-17767-9 All rights reserved. Authorised translation from the English language edition published by John Wiley Sons, Inc. © Polish edition by APN PROMISE SA, Warszawa 2013 APN PROMISE SA, ul. Kryniczna 2, 03-934 Warszawa tel. +48 22 35 51 600, fax +48 22 35 51 699 e-mail: mspress@promise.pl Wszystkie prawa zastrzeżone. Żadna część niniejszej książki nie może być powielana ani rozpowszechniana w jakiejkolwiek formie i w jakikolwiek sposób (elektroniczny, mechaniczny), włącznie z fotokopiowaniem, nagrywaniem na taśmy lub przy użyciu innych systemów bez pisemnej zgody wydawcy. Wszystkie nazwy handlowe i towarowe występujące w niniejszej publikacji mogą być znakami towarowymi zastrzeżonymi lub nazwami zastrzeżonymi odpowiednich fi rm odnośnych właścicieli. APN PROMISE SA dołożyła wszelkich starań, aby zapewnić najwyższą jakość tej publikacji. Jednakże nikomu nie udziela się rękojmi ani gwarancji. APN PROMISE SA nie jest w żadnym wypadku odpowiedzialna za jakiekolwiek szkody będące następstwem korzystania z informacji zawartych w niniejszej publikacji, nawet jeśli APN PROMISE została powiadomiona o możliwości wystąpienia szkód. ISBN: 978-83-7541-121-8 Przekład: Witold Sikorski Redakcja: Marek Włodarz Projekt grafi czny okładki: Ryan Sneed Fotografi a na okładce @ Paul Fleet / iStockPhoto Korekta: Ewa Swędrowska Skład i łamanie: MAWART Marek Włodarz ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Mojej rodzinie, Dziękuję za zrozumienie i wsparcie podczas mej pracy nad tą książką. Kocham Was wszystkich! ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== O autorze Wei-Meng Lee jest technologiem i założycielem Developer Learning Solutions (www. learn2develop.net), fi rmy technologicznej specjalizującej się w praktycznym szkoleniu w zakresie najnowszych technologii mobilnych. Wei-Meng ma wiele lat doświadczenia w prowadzeniu szkoleń, a w jego kursach szczególny nacisk kładzie się na uczenie przez praktykę. To praktyczne podejście do nauki programowania powoduje, że zrozumienie danego tematu staje się znacznie łatwiejsze niż po przeczytaniu książki, samouczka i innej dokumentacji. Wei-Meng jest również autorem książek Beginning iOS 5 Application Development (Wrox, 2010) oraz Beginning Android 4 Application Development (Wrox, 2011). Można się z nim kon- taktować pod adresem weimenglee@learn2develop.net O redaktorze technicznym Chaim Krause jest specjalistą ds. symulacji w US Army’s Command and General Staff College, gdzie między innymi opracowuje różne produkty programistyczne na wielu plat- formach, od urządzeń z systemami iOS i Android po komputery stacjonarne z systemem Windows  i serwery z systemem Linux. Preferowanym przez niego językiem jest Python, lecz pracuje w wielu językach, także koduje w Java, JavaScript/HTML5/CSS i w innych. Miał szczęście rozpocząć karierę zawodową na polu oprogramowania w fi rmie Borland, gdzie był starszym inżynierem programistą (Senior Developer Support Engineer) języka Delphi. Poza tym, że jest maniakiem komputerowym, Chaim lubi muzykę techno i dubstep oraz jazdę zaprzęgiem ze swoimi dwoma psami, Dasherem i Minnie. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Podziękowania Świat systemu Android bardzo się rozwinął od momentu wydania mojej ostatniej książki, Beginning Android 4 Application Development. Google wprowadziło nową wersję SDK: Android 4.1 SDK. Przy korzystaniu z systemu Android 4.1 SDK oraz ADT Plugin 20.0.3 jest dużo łatwiej pisać aplikacje w systemie Android — począwszy od tych, które działają na starszych urządzeniach, aż po najnowsze i największe. Chciałbym podziękować osobom, które ciężko pracowały nad realizacją tej książki. Po pierwsze, jestem wdzięczny Bobowi Elliottowi, redaktorowi naczelnemu w wy- dawnictwie Wrox. Bob jest zawsze gotowy wysłuchać i zaoferować pomoc, gdy jest ona potrzebna. Praca z nim jest wielką przyjemnością, ponieważ jest on jedną z najbardziej odpowiedzialnych osób, z jaką kiedykolwiek pracowałem. Dziękuję Ci, Bob, za pomoc i wskazówki. Nie mogę oczywiście zapomnieć o Ami Sullivan, moim redaktorze (i przyjacielu), z którą praca jest zawsze przyjemnością. Dziękuję za pomoc i zachętę do kontynuacji projektu, Ami. Jestem wdzięczny mojemu redaktorowi technicznemu, Chaimowi Krause. Chaim wy- kazał sokole oko przy redagowaniu książki i testowaniu moich przykładów. Dzięki temu mój kod działa, tak jak został napisany. Dziękuję, Chaim. I na koniec, chcę podziękować równie ważnym osobom – moim rodzicom i mojej żonie, Sze Wa, dla wsparcie, które od nich otrzymałem. Bezinteresownie dostosowali swoje rozkłady zajęć do mojego napiętego grafi ku, gdy pracowałem na tą książką. Moja żona, jak zwykle, spędziła ze mną wiele nieprzespanych nocy, gdy pracowałem jak szalony, aby dotrzymać ostatecznych terminów. Za to chcę powiedzieć jej i moim rodzicom, „Kocham Was wszystkich!”. Na koniec podziękowania dla naszego uroczego psa, Ookii, za pozostanie przy moim boku. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Spis treści Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi Podstawy systemu Android 1 Przepis 1.1 Łączenie działań . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Przepis 1.2 Przekazywanie danych między działaniami . . . . . . . . . . . . . . . . . . . . . . . .5 Przepis 1.3 Przekazywanie obiektów pomiędzy działaniami . . . . . . . . . . . . . . . . . .12 Przepis 1.4 Wysyłanie i odbieranie komunikatów . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 Przepis 1.5 Przypisywanie priorytetów odbiornikom komunikatów . . . . . . . . . . .19 Przepis 1.6 Automatyczne uruchamianie aplikacji w czasie rozruchu . . . . . . . . . .22 Przepis 1.7 Wywoływanie wbudowanych aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . .24 Przepis 1.8 Tworzenie aplikacji, która może być wywoływana przez inne aplikacje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Stosowanie widoków do projektowania interfejsu użytkownika 41 Przepis 2.1 Stosowanie przycisków . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42 Przepis 2.2 Stosowanie przycisków z obrazami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46 Przepis 2.3 Stosowanie przycisków radiowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49 Przepis 2.4 Stosowanie pól wyboru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52 Przepis 2.5 Implementowanie systemu klasyfi kacji w formie gwiazdek . . . . . . . .55 Przepis 2.6 Stosowanie AutoComplete TextView . . . . . . . . . . . . . . . . . . . . . . . . . . . .58 Przepis 2.7 Wyświetlanie stron sieci Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60 Przepis 2.8 Stosowanie widoku TimePicker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66 Przepis 2.9 Stosowanie widoku Date Picker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68 Przepis 2.10 Stosowanie LinearLayout do pozycjonowania widoków . . . . . . . . . . .70 Przepis 2.11 Stosowanie RelativeLayout do pozycjonowania widoku . . . . . . . . . . .76 Przepis 2.12 Stosowanie FrameLayout do pozycjonowania widoku . . . . . . . . . . . . .78 Przepis 2.13 Stosowanie TableLayout do pozycjonowania widoku . . . . . . . . . . . . . .82 Przepis 2.14 Zastosowanie widoku ScrollView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84 Przepis 2.15 Wyświetlanie treści i opcji menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88 1 2 ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== viii | Spis treści Przepis 2.16 Wyświetlanie okien dialogowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96 Przepis 2.17 Implementowanie stronicowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 3 Wyświetlanie list elementów i obrazów Przepis 3.1 Wyświetlanie listy elementów za pomocą ListView . . . . . . . . . . . . . .112 Przepis 3.2 Dostosowywanie widoku ListView . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114 Przepis 3.3 Wyświetlanie wielu widoków ListView . . . . . . . . . . . . . . . . . . . . . . . . .117 Przepis 3.4 Tworzenie niestandardowych widoków ListViews . . . . . . . . . . . . . . .120 Przepis 3.5 Dalsze dostosowywanie wierszy za pomocą 111 dodatkowych widoków TextView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124 Przepis 3.6 Wyświetlanie listy elementów za pomocą widoku SpinnerView . . .132 Przepis 3.7 Wyświetlanie listy obrazów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135 Przepis 3.8 Animowanie zmian obrazów przy użyciu ImageSwitcher . . . . . . . . .140 Przepis 3.9 Wyświetlanie obrazów za pomocą GridView . . . . . . . . . . . . . . . . . . . .145 Przepis 3.10 Budowanie interfejsu Master-Detail . . . . . . . . . . . . . . . . . . . . . . . . . . . .148 Telefonia 4 5 Obsługa wiadomości Przepis 4.1 Połączenie telefoniczne z aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157 Przepis 4.2 Monitorowanie stanu telefonu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159 Przepis 4.3 Monitorowanie w tle stanu telefonu . . . . . . . . . . . . . . . . . . . . . . . . . . . .162 Przepis 4.4 Blokowanie połączeń wychodzących . . . . . . . . . . . . . . . . . . . . . . . . . . .165 Przepis 4.5 Automatyczna odpowiedź na przychodzące połączenie . . . . . . . . . . .167 Przepis 4.6 Przełączenie na tryb samolotowy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170 Przepis 4.7 Pobieranie numeru telefonu, IMEI i identyfi katora karty SIM . . . .172 Przepis 4.8 Włączanie karty Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174 Przepis 4.9 Wyświetlanie rejestru połączeń . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180 157 183 Przepis 5.1 Wysyłanie wiadomości SMS za pomocą wbudowanej aplikacji Wiadomości . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183 Przepis 5.2 Programowe wysyłanie komunikatów SMS w aplikacji systemu Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186 Przepis 5.3 Programowe monitorowanie stanu wysłanych wiadomości . . . . . . .188 Przepis 5.4 Monitorowanie wychodzących wiadomości SMS . . . . . . . . . . . . . . . .192 Przepis 5.5 Przechwytywanie przychodzących wiadomości SMS . . . . . . . . . . . . .196 ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Programowanie w sieci Spis treści | ix 199 Przepis 6.1 Łączenie z serwerami za pomocą HTTP GET . . . . . . . . . . . . . . . . . . .199 Przepis 6.2 Łączenie z serwerami za pomocą POST HTTP . . . . . . . . . . . . . . . . . .203 Przepis 6.3 Ładowanie danych binarnych za pomocą HTTP . . . . . . . . . . . . . . . . .206 Przepis 6.4 Korzystanie z usług Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .208 Przepis 6.5 Korzystanie z usług Web JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .212 Przepis 6.6 Pobieranie adresu IP urządzenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .219 Przepis 6.7 Tworzenie serwera gniazda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .221 Przepis 6.8 Tworzenie klienta gniazda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .227 Przepis 6.9 Sprawdzanie dostępności Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . .231 Przepis 6.10 Monitorowanie stanu Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .234 Przepis 6.11 Tworzenie aplikacji czatu w Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . .236 Korzystanie z Google Maps 253 Przepis 7.1 Wyświetlanie Google Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .254 Przepis 7.2 Powiększanie i pomniejszanie Google Maps . . . . . . . . . . . . . . . . . . . . .260 Przepis 7.3 Zmiana trybu mapy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .263 Przepis 7.4 Nawigacja na mapie do konkretnej lokalizacji . . . . . . . . . . . . . . . . . . .266 Przepis 7.5 Dodawanie znaczników do mapy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268 Przepis 7.6 Znajdowanie przyjaznego adresu za pomocą odwrotnego geokodowania i odwrotnie . . . . . . . . . . . . . . . . . . . . . . . . .278 Przepis 7.7 Reakcja na zmianę rozmiarów i przesuwanie . . . . . . . . . . . . . . . . . . . .286 Usługi danych oparte na położeniu 291 Przepis 8.1 Uzyskiwanie położenia geografi cznego za pomocą GPS, Wi-Fi lub sieci komórkowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .292 Przepis 8.2 Wybieranie najlepszego dostawcy lokalizacji . . . . . . . . . . . . . . . . . . . .296 Przepis 8.3 Monitorowanie położenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .300 Przepis 8.4 Zastosowanie BroadcastReceiver do uzyskiwania lokalizacji . . . . . .302 Przepis 8.5 Rejestracja danych lokalizacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305 Uzyskiwanie dostępu do sprzętu 313 Przepis 9.1 Przechwytywanie obrazów z aparatu . . . . . . . . . . . . . . . . . . . . . . . . . . .313 Przepis 9.2 Wykrywanie obecności funkcji sprzętowych . . . . . . . . . . . . . . . . . . . .317 Przepis 9.3 Sprawdzanie stanu sieci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .319 6 7 8 9 ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== x | Spis treści Przepis 9.4 Włączanie i wyłączanie GPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321 Przepis 9.5 Programowe przechwytywanie przycisków sprzętowych . . . . . . . . .323 Przepis 9.6 Włączanie lampy błyskowej . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .327 Przepis 9.7 Pobieranie kodów kreskowych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333 Przepis 10.1 Zapisywanie i ładowanie preferencji użytkownika . . . . . . . . . . . . . . .340 Przepis 10.2 Tworzenie ekranu preferencji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .342 Przepis 10.3 Zapisywanie plików w katalogu danych . . . . . . . . . . . . . . . . . . . . . . . . .348 Przepis 10.4 Zapisywanie plików w katalogu pamięci podręcznej . . . . . . . . . . . . .353 Przepis 10.5 Zapisywanie plików w pamięci zewnętrznej . . . . . . . . . . . . . . . . . . . . .355 Przepis 10.6 Dołączanie plików do projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .360 Przepis 10.7 Programowe tworzenie i używanie baz danych SQLite . . . . . . . . . . .362 Przepis 10.8 Wstępne tworzenie baz danych SQLite. . . . . . . . . . . . . . . . . . . . . . . . . .368 10 Przechowywanie danych 11 Wdrażanie aplikacji systemu Android Przepis 11.1 Lokalizacja naszej aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .374 Przepis 11.2 Eksportowanie aplikacji jako pliku APK . . . . . . . . . . . . . . . . . . . . . . . .379 Przepis 11.3 Wdrażanie swojej aplikacji za pomocą poczty e-mail . . . . . . . . . . . . .382 Przepis 11.4 Wdrażanie naszej aplikacji za pośrednictwem sieci Web . . . . . . . . . .384 Przepis 11.5 Wdrażanie aplikacji z karty SD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .386 Przepis 11.6 Określenie miejsca zainstalowania aplikacji . . . . . . . . . . . . . . . . . . . . .388 339 373 Indeks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .391 ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Wprowadzenie Tempo rozwoju systemu Android jest szalone. Na przestrzeni zaledwie kilku lat Android stał się stabilną platformą, dorównując swojemu głównemu konkurentowi, iOS. W czasie, gdy ta książka była pisana, najnowszą wersją systemu Android była wersja 4.1 (alias Jelly Bean). System Android 4.1 działa zarówno na smartfonach, jak i tabletach, więc staje się naturalnym wyborem dla wielu deweloperów. Ta książka narodziła się w wyniku wielu frustracji, jakie miałem przy opracowywaniu aplikacji w systemie Android. Często zdarza się, że potrzebujemy tylko szybkiej migawki pokazującej, jak zrobić dane zadanie, a fragment kodu byłby idealnym rozwiązaniem. Jednak odwołanie się do ofi cjalnej dokumentacji systemu Android często powoduje więcej nieporozumień niż pomocy, ponieważ przykłady kodu nie zawsze są kompletne. Tak więc celem tej książki jest wypełnienie luki poprzez podanie niezależnych przykładów, które można szybko ogarnąć i je rozwinąć. Każdy przepis dotyczy problemu, który możemy napotkać w swojej codziennej pracy dewelopera systemu Android – niezależnie od tego, czy jest tak drobna kwestia, tak jak korzystanie z widoku za pomocą opcji Button (Przycisk), bądź tak zawiła, jak implemen- towanie aplikacji Master-Detail z wykorzystaniem fragmentów. Tę książkę można czytać od pierwszego przepisu aż do ostatniego lub bezpośrednio przejść do przepisów, które są dla nas najbardziej interesujące. Dla kogo jest ta książka Książka jest przeznaczona dla programistów pracujących w systemie Android, którzy mają już jakąś podstawową wiedzę o tworzeniu aplikacji w tym systemie. Zakłada się, że Czytelnicy wiedzą, jak tworzyć projekt w systemie Android za pomocą Eclipse i znają już strukturę projektu w tym systemie. Wszystkie przykłady kodu w tej książce zostały napisane i przetestowane przy użyciu Android 4.1 SDK, razem z Eclipse (wydanie Juno) oraz wtyczką ADT 20.0.3. Wszystkie projekty mogą działać na urządzeniach z systemem Android począwszy od wersji 2.2 tego systemu. W szczególności, we wszystkich projektach wykorzystano pakiet Android Support , który jest domyślnie włączony do projektów Android 4.1. Dzięki zastosowaniu Android Support Package nasze aplikacje mogą korzystać z nowych funkcji wprowa- dzonych w wersji 3.0 systemu Android (takich jak fragmenty), a jednocześnie działają na urządzeniach ze starszymi wersjami systemu. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== xii | Wprowadzenie UWAGA Mimo dołożenia wszelkich starań, aby wszystkie stosowane w przy- kładach narzędzia były najnowsze, zawsze może się zdarzyć, że do momentu lektury tej książki pojawią się ich nowe wersje. W takim przypadku niektóre z instrukcji i/lub mogą się nieznacznie różnić. Jednak ze wszelkimi zmianami powinniśmy dać sobie radę. Co zawiera ta książka Ta książka obejmuje wszystkie najważniejsze obszary programowania w systemie Android przy wykorzystaniu Android 4.1 SDK. Jest podzielona na 11 rozdziałów. ▶ Rozdział 1: Podstawy systemu Android zawiera tematykę podstawową, taką jak spo- soby łączenia czynności, przenoszenie danych pomiędzy czynnościami, wysyłanie i odbieranie rozgłoszeń, wywoływanie wbudowanych aplikacji i wiele więcej. ▶ Rozdział 2: Stosowanie widoków do projektowania interfejsu użytkownika za- wiera objaśnienie sposobu korzystania z różnych widoków do budowania interfejsu użytkownika w aplikacjach systemu Android. Zawiera również opis różnych typów układów obsługiwanych w systemie Android do rozmieszczania tych widoków, w tym LinearLayout, RelativeLayout, FrameLayout. Nauczymy się także wyświetlania menu kontekstowych i menu opcji. ▶ Rozdział 3: Wyświetlanie list elementów i obrazów zawiera opis sposobu korzy- stania z ListView i Spinner oraz sposobu ich dostosowania w celu wyświetlania listy elementów. Pokazano w nim również, jak korzystać z fragmentów, aby tworzyć apli- kacje Master-Detail. ▶ Rozdział 4: Telefonia obejmuje tematykę związaną z telefonem w naszym urządzeniu z systemem Android, w tym sposób blokowania połączeń wychodzących, automa- tyczne odpowiedzi na połączenia przychodzące, włączanie Bluetooth i inne. ▶ Rozdział 5: Obsługa wiadomości zawiera opis, jak wysyłać i odbierać wiadomości SMS na swoim telefonie z systemem Android. Dowiemy się także, jak śledzić wiado- mości SMS wysyłane przez użytkowników. ▶ Rozdział 6: Programowanie w sieci obejmuje tematykę związaną z łączeniem się aplikacji systemu Android ze światem zewnętrznym. Dowiemy się, jak korzystać z usług XML oraz JSON sieci Web, programowania gniazd i komunikacji Bluetooth. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Wprowadzenie | xiii ▶ Rozdział 7: Korzystanie z Google Maps obejmuje tematykę dotyczącą sposobu wy- świetlania Google Maps w naszej aplikacji Android oraz m.in. wykonywania odwrot- nego geokodowania. ▶ Rozdział 8: Usługi danych oparte na położeniu dotyczy najważniejszych technik, które trzeba znać, aby tworzyć usługi oparte na lokalizacji. Dowiemy się także, jak implementować rejestrowanie danych lokalizacji. ▶ Rozdział 9: Uzyskiwanie dostępu do sprzętu zawiera opis sposobów uzyskiwania z aplikacji systemu Android dostępu do wielu funkcji sprzętowych. Obejmuje przepisy pokazujące, jak zrobić zdjęcie za pomocą wbudowanego aparatu fotografi cznego, jak włączyć i wyłączyć GPS, a także jak włączyć lampę błyskową w urządzeniu. ▶ Rozdział 10: Przechowywanie danych obejmuje kilka metod utrzymywania danych, w tym pamięć wewnętrzną, pamięć zewnętrzną, bazę danych i inne. ▶ Rozdział 11: Wdrażanie aplikacji systemu Android zawiera opis różnych metod wdrażania aplikacji systemu Android, takich jak za pomocą karty SD, serwera Web lub poczty e-mail. Jak zorganizowana jest ta książka Rozdziały książki są podzielone na tematy główne, a każdy rozdział zawiera wiele „prze- pisów”, w bardziej szczegółowy sposób odnoszących się do określonych podtematów. Zamiast tworzenia projektu krok po  kroku, a  następnie objaśnienia, jak działa kod, w książce zaprezentowano kluczowe elementy każdego przepisu – kluczowe punkty, które trzeba zrozumieć, aby spełnić wymagania lub rozwiązać problem (bądź wykonać typowe zadanie) w programowaniu w systemie Android. Każdy przepis obejmuje główne pojęcia, które należy zrozumieć, bez żadnego zbędnego kodu, który mógłby skomplikować przy- kład. Przy takim podejściu najprościej jest skopiować i wkleić kod do własnego projektu, aby następnie poprawić go, dostosowując do swoich własnych celów. Moim zdaniem jest to najlepszy sposób nauczenia się programowania w systemie Android. W tym celu każdy rozdział ma bardzo określoną strukturę. Każdy przepis ma swój numer i tytuł. Przepis zaczyna się od listy składników potrzebnych do skutecznego roz- wiązania zadania, jak na następnej stronie: ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== xiv | Wprowadzenie Przepis 0.0 Wymagania dla przepisu Wersje systemu Android W każdym przepisie wykorzystano interfejsy API z Android SDK. W punk- cie „Wersje systemu Android” podano wersję (numer poziomu), z której pochodzą interfejsy API. Możemy na przykład zobaczyć „Poziom 1 i wyż- sze”. To wskazuje, że interfejsy API stosowane w tym przepisie są dostępne w systemie Android 1 poziomu 1 (tj. wersji 1.0) i wersjach wyższych. Uprawnienia W tym punkcie pokazane są uprawnienia, które trzeba dodać do aplikacji, a dokładnie do pliku AndroidManifest.xml, aby użyć interfejsów API opisa- nych w danym przepisie. Należy sprawdzić, czy uprawnienie zostało do- dane; jeśli o tym zapomnimy, zwykle spowoduje to błąd aplikacji podczas jej wykonywania. Kod źródłowy do pobrania z witryny Wrox.com W tym punkcie podana jest nazwa pliku ZIP, który można pobrać z pomoc- niczej witryny Web dla tej książki – z Wrox.com. Plik ZIP zawiera pełny projekt użyty do ilustracji pomysłu zawartego w tym przepisie. Jeśli chcemy szybko umieścić kod przepisu w swoim własnym projekcie, pobranie kodu źródłowego jest najszybszą opcją. Następnie wyjaśniono główny cel danego przepisu. Dalej następuje rozwiązanie. Czasami rozwiązanie jest krótkie i przyjemne, a czasami jest bardziej złożone i wymaga wielu kroków. Co jest potrzebne, aby korzystać z tej książki Większość przykładów w tej książce działa na emulatorze systemu Android, który jest częścią Android SDK. Aby jednak wynieść jak najwięcej z tej książki, zaleca się skorzystanie z rzeczywistego urządzenia z systemem Android (chociaż nie jest to absolutnie konieczne). Ponadto każdy przepis zaczyna się od listy wymagań właściwych dla tego przepisu (wersje, uprawnienia oraz kod źródłowy), jak to wcześniej omówiono. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Wprowadzenie | xv Uwaga dotycząca włączania uprawnień do kodu Aby przepisy stały się zwięzłe i proste do śledzenia, w tej książce założono, że Czytelnicy wiedzą, jak dodawać uprawnienia do swoich aplikacji. Na przykład zamiast pełnego listingu pliku AndroidManifest.xml z wyróżnieniem uprawnień, które trzeba dodać w następujący sposób: manifest xmlns:android= http://schemas.android.com/apk/res/android package= net.learn2develop.http android:versionCode= 1 android:versionName= 1.0 uses-sdk android:minSdkVersion= 8 android:targetSdkVersion= 15 / uses-permission android:name= android.permission.INTERNET / uses-permission android:name= android.permission.ACCESS_NETWORK_STATE / application android:icon= @drawable/ic_launcher android:label= @string/app_name android:theme= @style/AppTheme activity android:name= .MainActivity android:label= @string/title_activity_main intent-filter action android:name= android.intent.action.MAIN / category android:name= android.intent.category. LAUNCHER / /intent-filter /activity /application /manifest przepis wskaże po prostu, że trzeba dodać następujące uprawnienia: uses-permission android:name= android.permission.INTERNET / uses-permission android:name= android.permission.ACCESS_NETWORK_STATE / Jeśli powyższy krok nie jest bezpośrednio i wyraźnie opisany, trzeba zawsze sprawdzić sekcję Uprawnienia na początku każdego przepisu i dodać uprawnie- nia do pliku AndroidManifest.xml. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== xvi | Wprowadzenie Konwencje Aby pomóc w optymalnym korzystaniu z tekstu i śledzeniu działań, w całej książce zasto- sowano kilka konwencji: ▶ Nowe pojęcia i ważne słowa są przy pierwszym wystąpieniu wyróżnione kursywą. ▶ Kombinacje klawiszy są oznaczane tak: Ctrl+R. ▶ Nazwy plików, kod w  tekście oraz adresy URL są  oznaczane tak: persistence. properties. ▶ Kody przedstawiane są na dwa różne sposoby: W większości przykładów kodu stosowany jest typ czcionki o stałej szerokości bez wyróżnienia. Do wyróżnienia kodu, który jest szczególnie ważny w przestawionym przykładzie, stosowane jest pogrubienie. UWAGA Uwagi, wskazówki, porady i komentarze do aktualnego omówienia wyglądają tak jak niniejsza uwaga. Kod źródłowy Podczas pracy nad kolejnymi przykładami z tej książki, można wybrać ręczne wpisywanie całego kodu, albo skorzystać z plików kodu źródłowego, które towarzyszą książce. Cały kod źródłowy użyty w tej książce jest dostępny do pobrania na stronie www.wrox.com. Po wejściu na tę stronę znajdujemy po prostu tytuł książki (za pomocą pola Search lub jednej z list tytułów) i klikamy łącze Download Code (Pobierz kod) na stronie ze szcze- gółami książki, aby uzyskać jej cały kod źródłowy. Po pobraniu kodu dokonujemy jego dekompresji za pomocą wybranego narzędzia. Alternatywnie przechodzimy do głównej strony pobierania kodu Wrox pod adresem www.wrox.com/dynamic/books/download.aspx, aby zobaczyć kod dostępny dla tej książki (i wszystkich pozostałych książek Wrox). UWAGA Wyszukując książkę na liście, trzeba odwołać się do tytułu angielskiego, czyli Android Application Development Cookbook: 93 Recipes for Building Winning Apps. Ponieważ wiele książek może mieć podobne tytuły, łatwiejsze może być jej szukanie poprzez ISBN oryginalnego wydania angielskiego, którym dla tej książki jest 978-1-118-17767-9. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Wprowadzenie | xvii Errata Dołożyliśmy wszelkich starań, aby tekst ani kod nie zawierały błędów. Nikt jednak nie jest doskonały, a błędy się zdarzają. Będziemy wdzięczni za informacje w przypadku znalezie- nia w jednej z naszych książek błędu w pisowni lub błędnego fragmentu kodu. Wysyłając informację o błędzie możemy oszczędzić innemu Czytelnikowi godzin frustracji, a jedno- cześnie pomaga nam w dostarczeniu informacje jeszcze lepszej jakości. Aby znaleźć stronę erraty dla tej książki, przechodzimy do strony www.wrox.com i znaj- dujemy tytuł, korzystając z okna Search lub jednej z list tytułów. Następnie, na stronie ze szczegółowymi informacjami o książce, klikamy łącze Book Errata. Na tej stronie można zobaczyć całą listę błędów, które zostały zgłoszone do tej książki i opublikowane przez redaktorów wydawnictwa Wrox. Pełna lista książek, wraz z łączami do ich errat, jest do- stępna również pod adresem www.wrox.com/misc-pages/booklist.shtml. Jeśli na stronie Book Errata Czytelnik nie dostrzeże „swojego” błędu, powinien przejść do www.wrox.com/contact/techsupport.shtml i wypełnić tam formularz, aby przesłać in- formacje o znalezionym błędzie. Informacje te zostaną sprawdzone, a jeśli zajdzie taka potrzeba, na stronie erraty pojawi się post, a w następnych wydaniach książki błąd zostanie skorygowany1. p2p.wrox.com Aby podyskutować z autorem i innymi osobami, można dołączyć do forum P2P na stronie p2p.wrox.com. Forum to system oparty na sieci Web służący do publikowania wiadomości dotyczących książek wydawnictwa Wrox i związanych z nimi technologii oraz do wzajem- nych kontaktów z innymi czytelnikami i użytkownikami technologii. Fora oferują funkcję subskrypcji na otrzymywanie pocztą e-mail nowych postów zamieszczanych na forum dotyczących wybranych, interesujących tematów. Na tych forach obecni są autorzy i re- daktorzy wydawnictwa Wrox oraz inni eksperci w branży i czytelnicy. Na stronie p2p.wrox.com można znaleźć kilka różnych forów, które pomogą nie tylko przy czytaniu tej książki, lecz także przy opracowywaniu swoich własnych aplikacji. Aby dołączyć do forum, należy wykonać następujące kroki: 1. Przejdź na stronę p2p.wrox.com i kliknij łącze Register (Zarejestruj się). 1 Przedstawiona strona zawiera erratę do wydania oryginalnego (angielskiego). Może być ona uży- teczna w przypadku błędów dostrzeżonych w przykładach kodu. W razie dostrzeżenia błędu w polskim przekładzie prosimy o przesłanie informacji na adres mspress@promise.pl. Errata do pol- skiego wydania będzie dostępna na stronie poświęconej książce w witrynie www.książki.promise.pl (przyp. redakcji wydania polskiego). ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== xviii | Wprowadzenie 2. Przeczytaj warunki korzystania i kliknij Agree (Zgadzam się). 3. Podaj wymagane informacje, aby dołączyć do forum, a także wszelkie informacje op- cjonalne, jakie chcesz podać i kliknij Submit (Wyślij). 4. Otrzymasz wiadomość e-mail z informacjami, jak potwierdzić swoje konto i dokończyć proces dołączania. UWAGA Wiadomości na forach można czytać bez dołączania do P2P, lecz pub- likowanie własnych postów wymaga dołączenia do forum. Po dołączeniu do forum można publikować nowe wiadomości i odpowiadać na posty innych użytkowników. Wiadomości można czytać w dowolnej chwili w sieci Web. Jeśli chcemy, aby nowe wiadomości z konkretnego forum były do nas przesyłane pocztą e-mail, trzeba kliknąć ikonę Subscribe to Th is Forum (Subskrybuj to forum) przy nazwie forum na liście forów. Więcej informacji na temat sposobu korzystania z Wrox P2P, działania oprogramo- wania, a także odpowiedzi na wiele pytań specyfi cznych dla książek wydawnictwa Wrox można znaleźć w pytaniach FAQ P2P. Aby przeczytać FAQ, trzeba kliknąć łącze FAQ na dowolnej stronie P2P. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 1 Podstawy systemu Android W tym rozdziale poznamy podstawowe zagadnienia związane z systemem Android, które powinna znać większość programistów. Wśród nich są kwestie połączeń z innymi apli- kacjami za pomocą obiektów Intent, komunikacja z innymi aplikacjami (lub częściami tej samej aplikacji) za pomocą odbiorników komunikatów oraz przekazywanie danych pomiędzy działaniami. Przepis 1.1 Łączenie działań Wersja systemu Android Poziom 1 i wyższe Uprawnienia Brak Kod źródłowy do pobrania z witryny Wrox.com Linking.zip O ile nie piszemy programu typu Hello World, najpewniej nasza aplikacja będzie zawierała kilka potrzebnych działań, które należy połączyć ze sobą, aby utworzyć spójną aplikację. W tym przepisie pokazano różne sposoby łączenia działań z innymi działaniami w naszej aplikacji systemu Android. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 2 | Rozdział 1: Podstawy systemu Android Rozwiązanie Przypuśćmy, że w  naszej aplikacji występują dwa działania. W  poniższym pliku AndroidManifest.xml pokazano dwie klasy działań, MainActivity i Activity2: manifest xmlns:android= http://schemas.android.com/apk/res/android package= net.learn2develop.linking android:versionCode= 1 android:versionName= 1.0 uses-sdk android:minSdkVersion= 8 android:targetSdkVersion= 15 / application android:icon= @drawable/ic_launcher android:label= @string/app_name android:theme= @style/AppTheme activity android:name= .MainActivity android:label= @string/title_activity_main intent-filter action android:name= android.intent.action.MAIN / category android:name= android.intent.category.LAUNCHER / /intent-filter /activity activity android:name= .Activity2 android:label= @string/app_name intent-filter action android:name= net.learn2develop.Activity2 / category android:name= android.intent.category.DEFAULT / /intent-filter /activity /application /manifest Przyjmując, że jesteśmy aktualnie w działaniu MainActivity, to w celu połączenia się z dzia- łaniem Activity2 możemy użyć następującego fragmentu kodu: package net.learn2develop.linking; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class MainActivity extends Activity { ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.1 Łączenie działań | 3 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //--- Połączenie z Activity2 --- Intent i = new Intent( net.learn2develop.Activity2 ); startActivity(i); } } Aby połączyć się z innym działaniem, musimy utworzyć obiekt Intent i ustawić jego kon- struktor (podobnie jak element w pliku AndroidManifest.xml) na nazwę docelowego dzia- łania. Następnie wywołujemy metodę startActivity(), aby uruchomić to działanie. Alternatywnie możemy utworzyć obiekt Intent, a następnie wywołać jego metodę setAction(), aby ustawić nazwę działania docelowego: //--- Połączenie z Activity2 --- Intent i = new Intent(); i.setAction( net.learn2develop.Activity2 ); startActivity(i); Powyższe fragmenty kodu są wygodne do wywołania działania, które znajduje się w tej samej aplikacji, a także do tego, aby inne aplikacje wywoływały nasze działanie. Jeśli chcemy wywołać działanie, które znajduje się wewnątrz naszej aplikacji, możemy je rów- nież wywołać w następujący sposób, korzystając z jego nazwy klasy: //--- Połączenie z Activity2--- Intent i = new Intent(this, Activity2.class); Jeśli nie chcemy, aby inne działania wywoływały nasze działanie spoza naszej aplikacji, musimy po prostu usunąć element action z elementu intent-filter : activity android:name= .Activity2 android:label= @string/app_name intent-filter !-- action android:name= net.learn2develop.Activity2 / -- category android:name= android.intent.category.DEFAULT / /intent-filter /activity Jeśli na danym urządzeniu nie ma działania, które próbujemy wywołać, wtedy nasza apli- kacja ulegnie awarii, wyświetlając komunikat podobny do pokazanego na rysunku 1-1. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 4 | Rozdział 1: Podstawy systemu Android Aby nasza aplikacja nie została przerwana w  sposób nagły, wywołujemy metodę startActivity() wraz z metodą createChooser(). obiektu typu Intent. Metoda createChooser() po- biera nazwę obiektu typu Intent oraz podany tekst, aby wyświetlić je w przypadku, gdy działania nie można znaleźć (lub gdy znaleziono więcej niż jedno działanie odpowiadające naszemu obiektowi typu Intent): Rysunek 1-1 Intent i = new Intent( net.learn2develop.Activity2 ); startActivity(Intent.createChooser(i, Choose an application )); Na rysunku 1-2 pokazano komunikat, który zostanie wyświetlony, gdy działania nie uda się znaleźć. Na rysunku 1-3 pokazano komunikat, który zostanie wyświetlony, gdy program znajdzie więcej niż jedno działanie. Rysunek 1-2 ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.2 Przekazywanie danych między działaniami | 5 Rysunek 1-3 Zauważmy, że podczas korzystania z metody createChooser() musimy podać nazwę działa- nia (jak na przykład net.learn2develop.Activity2, co pokazano w poprzednim przykładzie), które uruchamiamy, a nie nazwę jego klasy. Poniższy fragment kodu nie będzie działał: //--- Ten kod nigdy nie połączy się z Activity2 --- Intent i = new Intent(this, Activity2.class); startActivity(Intent.createChooser(i, Choose an application )); Przepis 1.2 Przekazywanie danych między działaniami Wersja systemu Android Poziom 1 i wyższe Uprawnienia Brak Kod źródłowy do pobrania z witryny Wrox.com PassingData.zip ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 6 | Rozdział 1: Podstawy systemu Android W poprzednim przepisie pokazano, jak uruchomić inne działanie za pomocą metody startActivity(). Częstym zadaniem, które musimy wykonać podczas uruchamiania innego działania, jest przekazanie do niego danych. Na przykład możemy chcieć uruchomić inne działanie, które zbierze dane związane z użytkownikiem, więc trzeba przekazać do niego nazwę użytkownika. Gdy użytkownik zakończy zbieranie danych, należy je z kolei prze- kazać z powrotem do działania wywołującego. Musimy więc przekazywać dane między działaniami w obie strony. W tym przepisie pokażemy, jak to zrobić. Rozwiązanie Aby przekazać dane do innego działania, możemy użyć klasy Intent. W celu przekazania prostych typów danych można skorzystać z metody putExtra(), jak pokazuje poniższy fragment kodu: package net.learn2develop.passingdata; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View view) { Intent i = new Intent( net.learn2develop.SecondActivity ); //--- Użyj putExtra(), aby dodać nowe pary klucz/wartość --- i.putExtra( str1 , This is a string ); i.putExtra( age1 , 25); } } Powyższe instrukcje tworzą obiekt Intent, a następnie dołączają do niego dwie wartości, korzystając z metody putExtra(): jedną dla tekstu i jedną dla wartości całkowitej. Dane możemy przekazać także w obiekcie Bundle z wykorzystaniem obiektu Intent. Obiekt Bundle przypomina obiekt słownika, gdyż można podać pary klucz/wartość. Aby przekazać obiekt Bundle za pomocą obiektu Intent, tworzymy obiekt Bundle, wypełniamy go, a następnie dołączamy do obiektu Intent za pomocą metody putExtras(), co pokazano w poniższym kodzie: ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.2 Przekazywanie danych między działaniami | 7 public void onClick(View view) { Intent i = new Intent( net.learn2develop.SecondActivity ); //--- Użyj putExtra(), aby dodać nowe pary klucz/wartość --- i.putExtra( str1 , This is a string ); i.putExtra( age1 , 25); //--- Użyj putExtra(), aby dodać nowe pary klucz/wartość--- Bundle extras = new Bundle(); extras.putString( str2 , This is another string ); extras.putInt( age2 , 35); //---Dołącz obiekt Bundle do obiektu Intent--- i.putExtras(extras); } Gdy za pomocą obiektu Intent uruchamiamy nowe działanie, dołączone do niego dane są przekazywane do działania docelowego. Aby wywołać inne działanie w celu odebrania od niego danych, korzystamy z metody startActivityForResult(): public void onClick(View view) { Intent i = new Intent( net.learn2develop.SecondActivity ); //--- Użyj putExtra(), aby dodać nowe pary klucz/wartość --- i.putExtra( str1 , This is a string ); i.putExtra( age1 , 25); //--- Użyj obiektu Bundle, aby dodać nowe pary // klucz/wartość --- Bundle extras = new Bundle(); extras.putString( str2 , This is another string ); extras.putInt( age2 , 35); //--- Dołącz obiekt Bundle do obiektu Intent --- i.putExtras(extras); //--- Uruchom działanie, aby otrzymać wyniki --- startActivityForResult(i, 1); } Metoda startActivityForResult() pobiera obiekt Intent oraz kod żądania. Kod żądania to wartość całkowita, która jest większa lub równa zeru. Kod ten jest używany do ziden- tyfi kowania działań zwrotnych, ponieważ możemy jednocześnie wywołać więcej niż jedno działania. Jeśli ustawimy kod żądania na wartość –1, to wywołanie startActivityForResult() jest tożsame z wywołaniem startActivity(). Oznacza to, że nie będziemy mogli uzyskać danych przekazanych z powrotem z działania docelowego. W działaniu docelowym uzyskanie danych przekazanych do niego wymaga wykorzy- stania metody getIntent(), aby otrzymać instancję obiektu Intent, która została do niego ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 8 | Rozdział 1: Podstawy systemu Android przekazana. Aby przekazać prosty typ danych za pomocą metody putExtra(), musimy użyć metody get typ Extra(), gdzie typ może być rodzaju String, int, float itd. Kolejny kod pokazuje, jak pobierane są dwa podstawowe typy danych: package net.learn2develop.passingdata; import android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class SecondActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //--- Pobierz przekazane dane za pomocą getStringExtra() --- Toast.makeText(this,getIntent().getStringExtra( str1 ), Toast.LENGTH_SHORT).show(); //--- Pobierz przekazane dane za pomocą getIntExtra() --- Toast.makeText(this,Integer.toString( getIntent().getIntExtra( age1 , 0)), Toast.LENGTH_SHORT).show(); } } Aby uzyskać dane przekazane poprzez obiekt Bundle, użyjemy metody getExtras() dla obiektu Intent. Metoda getExtras() zwraca obiekt Bundle, który możemy wykorzystać do uzyskania różnych par klucz/wartość za pomocą metody get typ (), gdzie typem jest String, int i tak dalej: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //--- Pobierz przekazane dane za pomocą getStringExtra() --- Toast.makeText(this,getIntent().getStringExtra( str1 ), Toast.LENGTH_SHORT).show(); //--- Pobierz przekazane dane za pomocą getIntExtra() --- Toast.makeText(this,Integer.toString( getIntent().getIntExtra( age1 , 0)), Toast.LENGTH_SHORT).show(); //--- Pobierz przekazany obiekt Bundle --- Bundle bundle = getIntent().getExtras(); //--- Pobierz dane za pomocą getString() --- Toast.makeText(this, bundle.getString( str2 ), ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.2 Przekazywanie danych między działaniami | 9 Toast.LENGTH_SHORT).show(); //--- Pobierz dane za pomocą metody getInt() --- Toast.makeText(this,Integer.toString(bundle.getInt( age2 )), Toast.LENGTH_SHORT).show(); } Działanie docelowe może także przekazywać dane z powrotem do działania, z którego nastąpiło wywołanie. Aby przekazać dane z powrotem, możemy utworzyć kolejny obiekt Intent i ustawić wartości we wcześniej opisany sposób. Możemy też skorzystać z metody setData(), aby przekazać obiekt Uri poprzez obiekt Intent. Aby przekazać wyniki do dzia- łania wywołującego, korzystamy z metody setResult() w sposób pokazany w poniższym kodzie: package net.learn2develop.passingdata; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class SecondActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //--- Pobierz przekazane dane za pomocą getStringExtra() --- Toast.makeText(this,getIntent().getStringExtra( str1 ), Toast.LENGTH_SHORT).show(); //--- Pobierz przekazane dane za pomocą getIntExtra() --- Toast.makeText(this,Integer.toString( getIntent().getIntExtra( age1 , 0)), Toast.LENGTH_SHORT).show(); //--- Pobierz przekazany obiekt Bundle --- Bundle bundle = getIntent().getExtras(); //--- Pobierz dane za pomocą getString() --- Toast.makeText(this, bundle.getString( str2 ), Toast.LENGTH_SHORT).show(); //--- Pobierz dane za pomocą metody getInt() --- Toast.makeText(this,Integer.toString(bundle.getInt( age2 )), Toast.LENGTH_SHORT).show(); } public void onClick(View view) { //--- Użyj obiektu Intent, aby zwrócić dane --- ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 10 | Rozdział 1: Podstawy systemu Android Intent i = new Intent(); //--- Użyj metody putExtra(), aby zwrócić jakąś wartość --- i.putExtra( age3 , 45); //--- Użyj metody setData(), aby zwrócić jakąś wartość --- i.setData(Uri.parse( http://www.learn2develop.net )); //--- Ustaw wyniki jako OK oraz obiekt Intent --- setResult(RESULT_OK, i); finish(); } } Stała RESULT_OK pozwala nam na wskazanie działaniu wywołującemu, czy zwracane dane powinny zostać zignorowane. Jeśli chcemy, aby działanie wywołujące zignorowało wyniki, możemy użyć stałej RESULT_CANCELLED. Sposób interpretacji wyników zależy od działania wywołującego, ale użycie tych dwóch stałych służy jako wskaźnik. W głównym działaniu wywołującym implementujemy metodę onActivityResult(). Musimy sprawdzić, czy jest żądany kod, aby sprawdzić, czy otrzymujemy wyniki z od- powiedniego działania. Żądany kod to numer, który wcześniej przekazaliśmy do metody startActivityForResult(). W tym przykładzie ma on wartość 1: //--- Uruchom działanie, aby otrzymać wynik --- startActivityForResult(i, 1); Możemy także sprawdzić kod wyniku, aby zobaczyć, czy wynikiem jest RESULT_OK: package net.learn2develop.passingdata; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View view) { Intent i = new Intent( net.learn2develop.SecondActivity ); ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.2 Przekazywanie danych między działaniami | 11 //--- Użyj putExtra(), aby dodać nowe pary klucz/wartość --- i.putExtra( str1 , This is a string ); i.putExtra( age1 , 25); //--- Użyj obiektu Bundle, aby dodać nowe pary // klucz/wartość --- Bundle extras = new Bundle(); extras.putString( str2 , This is another string ); extras.putInt( age2 , 35); //--- Dołącz obiekt Bundle do obiektu Intent --- i.putExtras(extras); //--- Uruchom działanie, aby otrzymać jego wyniki --- startActivityForResult(i, 1); } public void onActivityResult(int requestCode, int resultCode, Intent data) { //--- Sprawdź, czy żądany kod ma wartość 1 --- if (requestCode == 1) { //--- Jeśli wynik jest OK --- if (resultCode == RESULT_OK) { //--- Pobierz wyniki za pomocą getIntExtra() --- Toast.makeText(this, Integer.toString( data.getIntExtra( age3 , 0)), Toast.LENGTH_SHORT).show(); //--- Pobierz wyniki za pomocą getData()--- Uri url = data.getData(); Toast.makeText(this, url.toString(), Toast.LENGTH_SHORT).show(); } } } } Aby pobrać dane wysłane za pomocą metody setData(), korzystamy z metody getData() obiektu Intent (przekazanego jako drugi argument metody ActivityResult()). ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 12 | Rozdział 1: Podstawy systemu Android Przepis 1.3 Przekazywanie obiektów pomiędzy działaniami Wersja systemu Android Poziom 1 i wyższe Uprawnienia Brak Kod źródłowy do pobrania z witryny Wrox.com PassingData.zip W poprzednim przepisie zobaczyliśmy, jak przekazywać proste dane (jak teksty i warto- ści całkowite) pomiędzy działaniami. W tym przepisie pokazano, jak między działaniami przekazywać obiekty. Na przykład w obiekcie możemy mieć hermetyzowane informacje o kliencie (takie jak identyfi kator klienta, nazwisko, fi rma i tak dalej), które trzeba przeka- zywać do innego działania w celu ich przetworzenia. Zamiast oddzielnego przekazywania poszczególnych fragmentów informacji o kliencie, łatwiej będzie przekazać cały obiekt. Rozwiązanie Poza przekazywaniem prostych typów danych za pomocą metod putExtra() i putExtras(), możemy także przekazywać obiekty za pomocą obiektu Intent. Jeśli mamy własną nie- standardową klasę, musimy sprawić, aby klasa ta implementowała podstawową klasę Serializable. Przykładem jest poniższa klasa MyCustomClass: package net.learn2develop.passingdata; import java.io.Serializable; public class MyCustomClass implements Serializable { private static final long serialVersionUID = 1L; String _name; String _email; public void setName(String name) { _name = name; } public String Name() { return _name; } public void setEmail(String email) { ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.3 Przekazywanie obiektów pomiędzy działaniami | 13 _email = email; } public String Email() { return _email; } } Aby przekazać obiekt do innego działania, korzystamy z metody putExtra(): public void onClick(View view) { Intent i = new Intent( net.learn2develop.SecondActivity ); //--- Użyj putExtra(), aby dodać nowe pary klucz/wartość --- i.putExtra( str1 , This is a string ); i.putExtra( age1 , 25); //--- Użyj obiektu Bundle, aby dodać nowe pary // klucz/wartość --- Bundle extras = new Bundle(); extras.putString( str2 , This is another string ); extras.putInt( age2 , 35); //--- Dołącz obiekt Bundle do obiektu Intent --- i.putExtras(extras); //--- Utwórz swój własny obiekt niestandardowy --- MyCustomClass myObject = new MyCustomClass(); myObject.setName( Wei-Meng Lee ); myObject.setEmail( weimenglee@learn2develop.net ); i.putExtra( MyObject , myObject); //--- Uruchom działanie, aby otrzymać wyniki --- startActivityForResult(i, 1); } Aby pobrać obiekt przekazany do  innego działania, korzystamy z  metody getSerializableExtra() obiektu Intent, przekazując mu klucz, który wcześniej ustalamy w metodzie putExtra(). Następnie umieszczamy wyniki otrzymane przez tę metodę w klasie MyCustomClass i przypisujemy je do zmiennej danego typu: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //--- Pobierz przekazane dane za pomocą getStringExtra() --- Toast.makeText(this,getIntent().getStringExtra( str1 ), Toast.LENGTH_SHORT).show(); //--- Pobierz przekazane dane za pomocą getIntExtra() --- Toast.makeText(this,Integer.toString( ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 14 | Rozdział 1: Podstawy systemu Android getIntent().getIntExtra( age1 , 0)), Toast.LENGTH_SHORT).show(); //--- Pobierz przekazany obiekt Bundle --- Bundle bundle = getIntent().getExtras(); //--- Pobierz dane za pomocą getString() --- Toast.makeText(this, bundle.getString( str2 ), Toast.LENGTH_SHORT).show(); //--- Pobierz dane za pomocą metody getInt() --- Toast.makeText(this,Integer.toString(bundle.getInt( age2 )), Toast.LENGTH_SHORT).show(); //--- Pobierz niestandardowy przekazany obiekt --- MyCustomClass obj = (MyCustomClass) getIntent().getSerializableExtra( MyObject ); Toast.makeText(this, obj.Name(), Toast.LENGTH_SHORT).show(); Toast.makeText(this, obj.Email(), Toast.LENGTH_SHORT).show(); } Przepis 1.4 Wysyłanie i odbieranie komunikatów Wersja systemu Android Poziom 1 i wyższe Uprawnienia Brak Kod źródłowy do pobrania z witryny Wrox.com UsingBroadcastReceiver.zip Obsługa komunikatów w systemie Android umożliwia nam wysyłanie komunikatów do in- nych części naszej aplikacji (lub innych aplikacji), abyśmy mogli informować ją o jakichś zdarzeniach. W tym przepisie nauczymy się, jak tworzyć odbiornik komunikatów do ich nasłuchiwania, a także jak wysyłać komunikaty do innych aplikacji. Rozwiązanie Są dwa sposoby tworzenia odbiornika komunikatów: programowy za pomocą kodu oraz deklaratywny za pośrednictwem pliku AndroidManifest.xml. W poniższym punkcie zostanie omówione każde możliwe rozwiązanie. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.4 Wysyłanie i odbieranie komunikatów | 15 Programowe rejestrowanie odbiornika komunikatów Rozważmy poniższe działanie: package net.learn2develop.usingbroadcastreceiver; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { MyBroadcastReceiver myReceiver; IntentFilter intentFilter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new MyBroadcastReceiver(); intentFilter = new IntentFilter( MY_SPECIFIC_ACTION ); } @Override public void onResume() { super.onResume(); //--- Zarejestruj odbiornik --- registerReceiver(myReceiver, intentFilter); } @Override public void onPause() { super.onPause(); //--- Wyrejestruj odbiornik --- unregisterReceiver(myReceiver); } public void onClick(View view) { Intent i = new Intent( MY_SPECIFIC_ACTION ); i.putExtra( key , some value from intent ); sendBroadcast(i); } public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent i) { Toast.makeText(context, Received broadcast in MyBroadcastReceiver, + value received: + i.getStringExtra( key ), ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 16 | Rozdział 1: Podstawy systemu Android Toast.LENGTH_LONG).show(); } } } Powyższy fragment kodu pokazuje wewnętrzną klasę MyBroadcastReceiver rozszerzającą klasę podstawową BroadcastReceiver. W tej klasie musimy przesłonić metodę onReceive() tak, aby po otrzymaniu komunikatu można było zrealizować działanie, które chcemy wy- konać. Aby dane zostały przekazane do odbiornika, możemy wykorzystać obiekt Intent w drugim argumencie metody onReceive(). Aby użyć tej klasy, musimy utworzyć jej instancję, a także obiekt IntentFilter: myReceiver = new MyBroadcastReceiver(); intentFilter = new IntentFilter( MY_SPECIFIC_ACTION ); W konstruktorze obiektu IntentFilter podajemy działanie zdefi niowane przez użytkownika i wykorzystujemy własny łańcuch testowy do zdefi niowania działania. Aby zarejestrować obiekt BroadcastReceiver, korzystamy z metody registerReceiver(), przekazując jej obiekt BroadcastReceiver oraz obiekt IntentFilter: registerReceiver(myReceiver, intentFilter); Mamy teraz zarejestrowany obiekt BroadcastReceiver, więc możemy wysłać komuni- kat, aby sprawdzić, czy wszystko działa. Aby wysłać komunikat, korzystamy z metody sendBroadcast(), przekazując jej obiekt Intent: public void onClick(View view) { Intent i = new Intent( MY_SPECIFIC_ACTION ); i.putExtra( key , some value from intent ); sendBroadcast(i); } Jeśli chcemy przekazać dane odbiornikowi, możemy użyć metody putExra(). Aby wyreje- strować odbiornik komunikatów, używamy metody unregisterReceiver(): unregisterReceiver(myReceiver); Na rysunku 1-4 pokazano odbiornik otrzymujący komunikat. Odbiornik komunikatów będzie działał nawet wtedy, gdy komunikat został wysłany przez inną aplikację. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.4 Wysyłanie i odbieranie komunikatów | 17 Rysunek 1-4 Rejestrowanie odbiornika komunikatów w pliku AndroidManifest.xml W poprzednim przykładzie odbiornik komunikatów nie będzie już działał, jeśli aplikacja pracuje w tle, gdyż po jej przejściu do pracy w tle zostaje przez nas wyrejestrowany: @Override public void onPause() { super.onPause(); //--- Wyrejestruj odbiornik --- unregisterReceiver(myReceiver); } Jeśli chcemy uzyskać bardziej trwały sposób otrzymywania komunikatów, musimy zare- jestrować klasę BroadcastReceiver w pliku AndroidManifest.xml. Aby tego dokonać, tworzymy klasę BroadcastReceiver w innej klasie Javy. Poniższy frag- ment kodu pokazuje zawartość pliku MySecondBroadcastReceiver.java: package net.learn2develop.usingbroadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MySecondBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent i) { Toast.makeText(context, ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 18 | Rozdział 1: Podstawy systemu Android Received broadcast in MySecondBroadcastReceiver; + value received: + i.getStringExtra( key ), Toast.LENGTH_LONG).show(); } } Aby zarejestrować ten odbiornik w pliku AndroidManifest.xml, dodajemy element receiver : manifest xmlns:android= http://schemas.android.com/apk/res/android package= net.learn2develop.usingbroadcastreceiver android:versionCode= 1 android:versionName= 1.0 uses-sdk android:minSdkVersion= 8 android:targetSdkVersion= 15 / application android:icon= @drawable/ic_launcher android:label= @string/app_name android:theme= @style/AppTheme activity android:name= .MainActivity android:label= @string/title_activity_main intent-filter action android:name= android.intent.action.MAIN / category android:name= android.intent.category.LAUNCHER / /intent-filter /activity receiver android:name= .MySecondBroadcastReceiver intent-filter action android:name= MY_SPECIFIC_ACTION / /intent-filter /receiver /application /manifest Nasza aplikacja ma teraz dwa obiekty BroadcastReceiver: jeden zarejestrowany programowo w metodzie onResume() oraz drugi w pliku AndroidManifest.xml. Jeśli teraz wyślemy komu- nikat, zostaną wywołane oba odbiorniki. Rysunek 1-5 przedstawia wywołanie drugiego odbiornika. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== Przepis 1.5 Przypisywanie priorytetów odbiornikom komunikatów | 19 Rysunek 1-5 Przepis 1.5 Przypisywanie priorytetów odbiornikom komunikatów Wersja systemu Android Poziom 1 i wyższe Uprawnienia Brak Kod źródłowy do pobrania z witryny Wrox.com UsingBroadcastReceiver.zip Gdy wysyłamy komunikat za pomocą metody sendBroadcast(), wszystkie odbiorniki ko- munikatów, które pasują do podanego działania, są wywoływane w sposób losowy. Co jednak, jeśli chcemy przypisać określoną kolejność odbiornikom komunikatów, tak aby niektóre z nich były wywoływane przed innymi? Aby to zrobić, trzeba przypisać priorytety odbiornikom komunikatów. ##7#52#aSUZPUk1BVC1WaXJ0dWFsbw== 20 | Rozdział 1: Podstawy systemu Android Rozwiązanie Aby programowo przypisać priorytet odbiornikowi komunikatów, korzystamy z metody setPriority(): public class MainActivity extends Activity { MyBroadcastReceiver myReceiver; IntentFilter intentFilter; @Override public void on
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Android Poradnik programisty
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: