Android Programowanie aplikacji
Rusz głową!
Android jest niezwykłym systemem. Dynamikę jego rozwoju i ekspansji można określić
jednym słowem: oszałamiająca! Programiści, producenci urządzeń mobilnych, a przede
wszystkim użytkownicy wysoko sobie cenią jego zalety, takie jak modułowa architektura,
wysoka elastyczność czy otwarty charakter systemu. Liczbę urządzeń pracujących pod
kontrolą Androida podaje się w miliardach, a przewiduje się, że będzie ich o wiele,
wiele więcej. Umiejętność efektywnego pisania świetnych, atrakcyjnych aplikacji dla
Androida staje się niezawodną receptą na sukces.
Książka, którą trzymasz w rękach, to podręcznik niezwykły, gdyż uwzględnia
specyfikę funkcjonowania ludzkiego mózgu i sposób, w jaki najszybciej się uczy.
Dzięki nowatorskiemu podejściu autorów nauka pisania aplikacji nie jest nudna:
niepostrzeżenie będziesz nabierał coraz większej wprawy. Już w trakcie zapoznawania
się z podstawowymi koncepcjami rozpoczniesz pracę w IDE Android Studio.
Dowiesz się, jak zaprojektować strukturę aplikacji i jak zbudować idealny
interfejs. Będziesz swobodnie posługiwał się aktywnościami, intencjami, usługami.
Poznasz interfejs Material Design firmy Google, dowiesz się, jak wykorzystywać bazy
danych SQLite. A to wszystko dopiero początek...
W tej książce między innymi:
omówienie zasad tworzenia aplikacji interaktywnych — odpowiadających na działania
użytkownika,
przedstawienie świetnego narzędzia dla programistów — środowiska Android Studio,
opis koncepcji istotnych dla Androida: aktywności i ich cyklu życia, intencji, układów
i fragmentów, usług i wielu innych,
wskazówki dotyczące tworzenia wyrafinowanych systemów nawigowania w aplikacji,
korzystania z szuflad nawigacyjnych oraz z pasków akcji,
przedstawienie interfejsu Material Design,
omówienie ART — środowiska uruchomieniowego Androida i ADB, programu narzędziowego
umożliwiającego rozwiązanie niektórych problemów podczas programowania i testowania
aplikacji.
Rusz głową i zacznij pisać świetne aplikacje dla Androida!
Wprowadzenie (xxiii)
Dla kogo jest przeznaczona ta książka? (xxiv) Wiemy, co sobie myślisz (xxv) Wiemy,
co sobie myśli Twój mózg (xxv) Metapoznanie - myślenie o myśleniu (xxvii) Oto co MY
zrobiliśmy (xxviii) Przeczytaj to (xxx) Zespół recenzentów technicznych (xxxii) Podziękowania
(xxxiii)
ROZDZIAŁ 1. Zaczynamy. Skok na głęboką wodę (1)
Witamy w Androidowie (2) Platforma Android w szczegółach (3) Środowisko
programistyczne (5) Zainstaluj Javę (6) Stwórzmy prostą aplikację (8) Aktywności z
wysokości 15 tysięcy metrów (12) Tworzenie aplikacji (ciąg dalszy) (13) Tworzenie
aplikacji (ciąg dalszy) (14) Właśnie utworzyłeś swoją pierwszą aplikację na
Androida (15) Android Studio utworzy pełną strukturę katalogów aplikacji (16)
Przydatne pliki projektu (17) Edycja kodu z użyciem edytorów Android Studio (18)
Uruchamianie aplikacji w emulatorze Androida (23) Tworzenie wirtualnego urządzenia z
Androidem (24) Uruchomienie aplikacji w emulatorze (27) Postępy możesz obserwować w
konsoli (28) Jazda próbna (29) Ale co się właściwie stało? (30) Usprawnianie
aplikacji (31) Czym jest układ? (32) Plik activity_main.xml zawiera dwa elementy (33)
Plik układu zawiera odwołanie do łańcucha, a nie sam łańcuch znaków (34) Zajrzyjmy
do pliku strings.xml (35) Weź swoją aplikację na jazdę próbną (37) Twój przybornik
do Androida (38)
ROZDZIAŁ 2. Tworzenie interaktywnych aplikacji. Aplikacje, które coś robią (39)
W tym rozdziale napiszemy aplikację Doradca piwny (40) Utworzenie projektu (42)
Utworzyliśmy domyślną aktywność i układ (43) Dodawanie komponentów w edytorze
projektu (44) Plik activity_find_beer.xml zawiera nowy przycisk (45) Zmiany w kodzie XML
układu... (48) ...są uwzględniane w edytorze projektu (49) Stosuj zasoby łańcuchowe,
a nie łańcuchy podawane w kodzie (50) Zmiana układu i zastosowanie w nim zasobów
łańcuchowych (51) Weź swoją aplikację na jazdę próbną (52) Dodanie wartości do
komponentu Spinner (53) Dodanie do komponentu Spinner odwołania do string-array (54)
Jazda próbna komponentu Spinner (54) Musimy zadbać o to, by przycisk coś robił (55)
Niech przycisk wywołuje metodę (56) Jak wygląda kod aktywności? (57) Dodaj do
aktywności metodę onClickFindBeer() (58) Metoda onClickFindBeer() musi coś robić (59)
Dysponując obiektem View, można odwoływać się do jego metod (60) Aktualizacja kodu
aktywności (61) Pierwsza wersja aktywności (63) Jazda próbna - test modyfikacji (65)
Tworzenie własnej klasy Javy (66) Dodaj do aktywności wywołanie metody naszej klasy,
aby była wyświetlana FAKTYCZNA porada (67) Kod aktywności, wersja 2 (69) Co się dzieje
podczas wykonywania tego kodu? (70) Jazda próbna - test aplikacji (71) Twój przybornik
do Androida (72)
ROZDZIAŁ 3. Wiele aktywności i intencji. Jakie są Twoje intencje? (73)
Aplikacja może zawierać więcej niż jedną aktywność (74) Oto struktura naszej
aplikacji (75) Utworzenie projektu (75) Utworzenie drugiej aktywności i układu (78)
Przedstawiamy plik manifestu aplikacji na Androida (80) Użycie intencji do uruchomienia
drugiej aktywności (83) Co się dzieje po uruchomieniu aplikacji? (84) Jazda próbna
aplikacji (85) Przekazanie tekstu do drugiej aktywności (86) Aktualizacja właściwości
widoku tekstowego (87) Metoda putExtra() zapisuje w intencji dodatkowe informacje (88)
Aktualizacja kodu aktywności CreateMessageActivity (91) Zastosowanie informacji
przekazanych w intencji w klasie ReceiveMessageActivity (92) Co się dzieje, gdy
użytkownik kliknie przycisk Wyślij wiadomość? (93) Jazda próbna aplikacji (94) Jak
działają aplikacje na Androida? (95) Co się dzieje podczas działania kodu? (99) Jak
Android korzysta z filtrów intencji? (102) Musisz uruchomić aplikację na PRAWDZIWYM
urządzeniu (105) Jazda próbna aplikacji (107) Zmień kod, aby wyświetlać okno
dialogowe (111) Jazda próbna aplikacji (112) Twój przybornik do Androida (114)
ROZDZIAŁ 4. Cykl życia aktywności. Była sobie aktywność (115)
Jak właściwie działają aktywności? (116) Aplikacja stopera (118) Kod układu
aplikacji stopera (119) Dodanie kodu obsługującego przyciski (122) Metoda runTimer()
(123) Obiekty Handler umożliwiają planowanie wykonania kodu (124) Pełny kod metody
runTimer() (125) Kompletny kod aktywności StopwatchActivity (126) Obrót ekranu zmienia
konfigurację urządzenia (132) Od narodzin do śmierci: stany aktywności (133) Cykl
życia aktywności: od utworzenia do usunięcia (134) W jaki sposób radzić sobie ze
zmianami konfiguracji? (136) Co się stanie po uruchomieniu aplikacji? (139) Tworzenie i
usuwanie to nie cały cykl życia aktywności (142) Cykl życia aktywności: widzialny
czas życia (143) Zaktualizowany kod aktywności StopwatchActivity (147) Co się dzieje
podczas działania aplikacji? (148) Jazda próbna aplikacji (149) A co się dzieje, jeśli
aplikacja jest tylko częściowo widoczna? (150) Cykl życia aktywności: życie na
pierwszym planie (151) Zatrzymanie stopera w razie wstrzymania aktywności (154) Kompletny
kod aktywności (157) Wygodny przewodnik po metodach cyklu życia aktywności (161) Twój
przybornik do Androida (162)
ROZDZIAŁ 5. Interfejs użytkownika. Podziwiaj widoki (163)
Trzy kluczowe układy: względny, liniowy i siatki (165) Rozmieszczanie widoków względem
układu nadrzędnego (168) Rozmieszczanie widoków względem innych widoków (170)
Atrybuty do rozmieszczania widoków względem innych widoków (171) RelativeLayout -
podsumowanie (173) Układ LinearLayout wyświetla widoki w jednym wierszu lub kolumnie
(174) Zmieńmy nieco prosty układ liniowy (176) Dodawanie wagi do widoków (179)
Dodawanie wagi do większej liczby widoków (180) Stosowanie atrybutu android:gravity -
lista wartości (182) Inne wartości, których można używać w atrybucie
android:layout_gravity (184) Kompletny układ liniowy (185) LinearLayout - podsumowanie
(186) Układ GridLayout wyświetla widoki w siatce (189) Dodawanie widoków do układu
siatki (190) Utwórzmy nowy układ siatki (191) Wiersz 0: dodajemy widoki do określonych
wierszy i kolumn (193) Wiersz 1: tworzymy widok zajmujący komórki kilku kolumn (194)
Wiersz 2: tworzymy widok zajmujący komórki kilku kolumn (195) Pełny kod układu siatki
(196) GridLayout - podsumowanie (197) Układy i komponenty GUI mają wiele wspólnego
(201) Zabawy z widokami (205) Twój przybornik do Androida (225)
ROZDZIAŁ 6. Widoki list i adaptery. Zorganizuj się (227)
Każda aplikacja zaczyna się od pomysłu (228) Skategoryzuj swoje pomysły -
aktywności: poziom główny, kategoria i szczegóły/edycja (229) Nawigowanie po
aktywnościach (230) Użyj ListViews do nawigowania po danych (231) Napiszemy aplikację
kafeterii Coffeina (232) Aktywność szczegółów napoju (233) Struktura aplikacji dla
kafeterii Coffeina (234) Układ aktywności głównego poziomu składa się z obrazka i
listy (238) Kompletny kod układu aktywności głównego poziomu (240) Zapewnianie reakcji
ListView na kliknięcia za pomocą obiektu nasłuchującego (241) Kompletny kod
aktywności TopLevelActivity (243) Jak utworzyć aktywność listy? (249) Łączenie widoków
list z tablicami za pomocą adaptera ArrayAdapter (251) Dodanie adaptera ArrayAdapter do
aktywności DrinkCategoryActivity (252) Co się stanie po wykonaniu kodu? (253) Jak
obsługiwaliśmy kliknięcia w aktywności TopLevelActivity? (256) Kompletny kod
aktywności DrinkCategoryActivity (258) Aktywność szczegółów wyświetla informacje o
jednym rekordzie (259) Wypełnienie widoków danymi (261) Kod aktywności DrinkActivity
(263) Jazda próbna aplikacji (266) Twój przybornik do Androida (268)
ROZDZIAŁ 7. Fragmenty. Zadbaj o modularyzację (269)
Struktura aplikacji Trenażer (273) Klasa Workout (275) Jak dodać fragment do
projektu? (276) Jak wygląda kod fragmentu? (278) Przypomnienie stanów aktywności (282)
Cykl życia fragmentów (283) Nasze fragmenty dziedziczą metody cyklu życia (284) Jazda
próbna aplikacji (286) Jak utworzyć fragment typu ListFragment? (290) Zaktualizowany kod
klasy WorkoutListFragment (292) Jazda próbna aplikacji (294) Powiązanie listy z widokiem
szczegółów (295) Stosowanie transakcji fragmentu (301) Zaktualizowany kod aktywności
MainActivity (302) Jazda próbna aplikacji (303) Kod fragmentu WorkoutDetailFragment (305)
Struktury aplikacji na tablety i telefony (307) Różne opcje katalogów (309) Układ
MainActivity dla telefonów (315) Kompletny kod aktywności DetailActivity (319)
Zmodyfikowany kod aktywności MainActivity (321) Jazda próbna aplikacji (322)
ROZDZIAŁ 8. Fragmenty zagnieżdżone. Zadbaj o potomstwo (325)
Tworzenie zagnieżdżonych fragmentów (326) Kod fragmentu StopwatchFragment (332) Układ
fragmentu StopwatchFragment (335) Metoda getFragmentManager() tworzy transakcje na
poziomie aktywności (340) Zagnieżdżone fragmenty wymagają zagnieżdżonych transakcji
(341) Kompletny kod fragmentu WorkoutDetailFragment (343) Jazda próbna aplikacji (344)
Dlaczego kliknięcie przycisku powoduje awarię aplikacji? (345) Przyjrzyjmy się kodowi
układu StopwatchFragment (346) Zaimplementuj we fragmencie interfejs OnClickListener
(349) Powiązanie obiektu nasłuchującego OnClickListener z przyciskami (351) Kod
fragmentu StopwatchFragment (352) Jazda próbna aplikacji (354) Kod fragmentu
WorkoutDetailFragment (358) Jazda próbna aplikacji (359) Twój przybornik do Androida
(364)
ROZDZIAŁ 9. Paski akcji. Na skróty (365)
Świetne aplikacje mają przejrzystą strukturę (366) Różne typy nawigacji (367)
Zacznijmy od paska akcji (368) Pakiet bibliotek Support Libraries (369) Twój projekt może
już używać bibliotek wsparcia (370) Zadbamy, by aplikacja używała aktualnych motywów
(371) Zastosowanie motywu w pliku AndroidManifest.xml (372) Definiowanie stylów w pliku
zasobów stylów (373) Określenie domyślnego motywu w pliku styles.xml (374) Co się
dzieje podczas działania aplikacji? (375) Dodawanie elementów do paska akcji (376) Plik
zasobów menu (377) Atrybut showAsAction menu (378) Dodawanie nowego elementu akcji (379)
Utworzenie aktywności OrderActivity (382) Uruchomienie aktywności OrderActivity po
kliknięciu przycisku Złóż zamówienie (383) Kompletny kod aktywności MainActivity
(384) Dzielenie się treściami z poziomu paska akcji (386) Określanie treści za pomocą
intencji (388) Kompletny kod aktywności MainActivity (389) Włączanie nawigacji w górę
(391) Określanie aktywności nadrzędnej (392) Dodawanie przycisku W górę (393) Jazda
próbna aplikacji (394) Twój przybornik do Androida (395)
ROZDZIAŁ 10. Szuflady nawigacyjne. Z miejsca na miejsce (397)
Zmiany w aplikacji dla restauracji Włoskie Co Nieco (398) Szuflady nawigacyjne bez
tajemnic (399) Struktura aplikacji dla restauracji Włoskie Co Nieco (400) Utworzenie
fragmentu TopFragment (401) Utworzenie fragmentu PizzaFragment (402) Utworzenie fragmentu
PastaFragment (403) Utworzenie fragmentu StoresFragment (404) Dodanie układu DrawerLayout
(405) Kompletna zawartość pliku activity_main.xml (406) Inicjalizacja listy szuflady
nawigacyjnej (407) Zmiana tytułu paska akcji (412) Zamykanie szuflady nawigacyjnej (413)
Zaktualizowany kod pliku MainActivity.java (414) Stosowanie ActionBarDrawerToggle (417)
Modyfikowanie elementów paska akcji w trakcie działania aplikacji (418) Zaktualizowany
kod aktywności MainActivity (419) Włączenie możliwości otwierania i zamykania
szuflady nawigacyjnej (420) Synchronizacja stanu przycisku ActionBarDrawerToggle (421)
Zaktualizowany kod aktywności MainActivity (422) Obsługa zmian konfiguracji (425)
Reagowanie na zmiany stosu cofnięć (426) Dodawanie znaczników do fragmentów (427)
Kompletny kod aktywności MainActivity (429) Jazda testowa aplikacji (435) Twój
przybornik do Androida (436)
ROZDZIAŁ 11. Bazy danych SQLite. Odpal bazę danych (437)
Znowu w kafeterii Coffeina (438) Android trwale przechowuje dane, używając baz danych
SQLite (439) Android udostępnia kilka klas związanych z SQLite (440) Obecna struktura
aplikacji kafeterii Coffeina (441) Pomocnik SQLite zarządza Twoją bazą danych (443)
Pomocnik SQLite (443) Tworzenie pomocnika SQLite (444) Wnętrze bazy danych SQLite (446)
Tabele tworzymy w języku SQL (447) Wstawianie danych za pomocą metody insert() (448)
Aktualizacja rekordów za pomocą metody update() (449) Określanie wielu warunków (450)
Kod klasy CoffeinaDatabaseHelper (451) Co robi kod pomocnika SQLite? (452) Co zrobić, gdy
trzeba będzie zmienić bazę? (455) Bazy danych SQLite mają numer wersji (456)
Aktualizacja bazy danych - omówienie (457) Jak pomocnik SQLite podejmuje decyzje? (459)
Aktualizacja bazy w metodzie onUpgrade() (460) Przywracanie starszej wersji bazy za pomocą
metody onDowngrade() (461) Zaktualizujmy bazę danych (462) Aktualizacja istniejącej bazy
danych (465) Zmiana nazwy tabeli (466) Pełny kod pomocnika SQLite (467) Kod pomocnika
SQLite (ciąg dalszy) (468) Co się dzieje podczas działania kodu? (469) Twój przybornik
do Androida (470)
ROZDZIAŁ 12. Kursory i zadania asynchroniczne. Nawiązywanie połączenia z
bazą danych (471)
Aktualny kod aktywności DrinkActivity (474) Określanie tabeli i kolumn (478)
Zapytania z wieloma warunkami (479) Stosowanie funkcji SQL w zapytaniach (481) Poruszanie
się po kursorze (488) Pobieranie wartości z kursora (489) Kod aktywności DrinkActivity
(490) Dodanie ulubionych napojów do aktywności DrinkActivity (508) Kod aktywności
DrinkActivity (513) Nowy kod aktywności głównego poziomu (518) Zmodyfikowany kod
aktywności TopLevelActivity (524) Metoda onPreExecute() (531) Metoda doInBackground()
(532) Metoda onProgressUpdate() (533) Metoda onPostExecute() (534) Klasa AsyncTask (535)
Kod aktywności DrinkActivity (537) Twój przybornik do Androida (540)
ROZDZIAŁ 13. Usługi. Do usług (541)
Aplikacja z usługą uruchomioną (543) Usługa IntentService z wysokości 15 tysięcy
metrów (545) Jak rejestrować komunikaty? (546) Kompletny kod usługi
DelayedMessageService (547) Kompletny kod usługi DelayedMessageService (554) Jak używać
usługi powiadomień? (557) Uruchamianie intencji przez powiadomienie (559) Wysyłanie
powiadomień za pomocą usługi systemowej (561) Kompletny kod usługi
DelayedMessageService (562) Etapy tworzenia usługi Odometer (570) Zdefiniowanie obiektu
Binder (573) Klasa Service ma cztery kluczowe metody (575) Dodanie obiektu
LocationListener do usługi (577) Rejestracja obiektu LocationListener (578) Kompletny kod
usługi OdometerService (580) Aktualizacja pliku AndroidManifest.xml (582) Aktualizacja
układu aktywności MainActivity (586) Tworzenie obiektu ServiceConnection (587)
Powiązanie z usługą należy utworzyć podczas uruchamiania aktywności (588)
Wyświetlanie przebytego dystansu (589) Kompletny kod aktywności MainActivity (590) Twój
przybornik do Androida (595)
ROZDZIAŁ 14. Material Design. W materialistycznym świecie (597)
Przedstawiamy Material Design (598) Struktura aplikacji dla restauracji Włoskie Co
Nieco (600) Utworzenie widoku CardView (603) Kompletny kod pliku card_captioned_image.xml
(604) Utworzenie prostego adaptera (606) Zdefiniowanie obiektu ViewHolder na potrzeby
adaptera (607) Utworzenie obiektów ViewHolder (608) Każdy widok CardView wyświetla
zdjęcie i podpis (609) Dodanie danych do widoków CardView (610) Kompletny kod pliku
CaptionedImagesAdapter.java (611) Utworzenie widoku RecyclerView (612) Dodanie widoku
RecyclerView do układu (613) Kod klasy PizzaMaterialFragment (614) Do rozmieszczania
zawartości RecyclerView używa menedżera układu (615) Określanie menedżera układu
(616) Kompletny kod klasy PizzaMaterialFragment (617) Zastosowanie fragmentu
PizzaMaterialFragment w aktywności MainActivity (618) Co się stanie po uruchomieniu
kodu? (619) Utworzenie aktywności PizzaDetailActivity (627) Co musi robić aktywność
PizzaDetailActivity? (628) Aktualizacja pliku AndroidManifest.xml (628) Kod pliku
PizzaDetailActivity.java (629) Obsługa kliknięć w widoku RecyclerView (631) Dodanie
interfejsu do adaptera (634) Implementacja interfejsu Listener we fragmencie
PizzaMaterialFragment (636) Umieszczenie treści na samym początku (639) Kompletny kod
pliku układu fragment_top.xml (644) Kompletny kod klasy TopFragment (645) Twój
przybornik do Androida (647)
Dodatek A. ART. Środowisko uruchomieniowe Androida (649)
Dodatek B. ADB. Android Debug Bridge (653)
Dodatek C. Emulator Androida (659)
Dodatek D. Pozostałości. Dziesięć najważniejszych zagadnień (których nie opisaliśmy)
(663)
1. Rozpowszechnianie aplikacji (664) 2. Dostawcy treści (665) 3. Klasa WebView (666)
4. Animacje (667) 5. Mapy (668) 5. Mapy (ciąg dalszy) (669) 6. Klasa CursorLoader (669)
7. Odbiorcy komunikatów (670) 8. Widżety aplikacji (671) 9. Grafika 9-patch (672) 10.
Testowanie (673)
Skorowidz (674)