Na stronie tytułowej również informacje o miejscach wydania i wydawcy oryginału - O'Reilly.
Na okładce: Zobacz jak wyglądają fragmenty pod mikroskopem, Unikaj kłopotliwych aktywności, Przekonaj sie jak układy z ograniczeniami moga zmienić Twoje życie, Twórz usługi nie z tego świata, Znajdź własna droge dzięki usługom lokalizacyjnym Androida, Zabaw sie z biblioteka wsparcia wzornictwa.
Indeks.
ROZDZIAŁ 1. Zaczynamy. Skok na głęboką wodę Witamy w Androidowie (2) Platforma Android w szczegółach (3) Oto co mamy zamiar zrobić (4) Środowisko programistyczne (5) Zainstaluj Android Studio (6) Stwórzmy prostą aplikację (7) Jak stworzyć aplikację? (8) Aktywności i układy z wysokości 15 tysięcy metrów (12) Jak stworzyć aplikację? (ciąg dalszy) (13) 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) Uruchamianie aplikacji w emulatorze (27) Postępy możesz obserwować w konsoli (28) Ale co się właściwie stało? (30) Usprawnienie aplikacji (31) Czym jest układ? (32) Plik activity_main.xml zawiera dwa elementy (33) Aktualizacja tekstu wyświetlanego w układzie (34) Weź aplikację na jazdę próbną (35) Twój przybornik do Androida (36) ROZDZIAŁ 2. Tworzenie interaktywnych aplikacji. Aplikacje, które coś robią W tym rozdziale napiszemy aplikację Doradca piwny (38) Utworzenie projektu (40) Utworzyliśmy domyślną aktywność i układ (41) Dokładniejsza prezentacja edytora projektu (42) Dodawanie przycisku w edytorze projektu (43) Plik activity_find_beer.xml zawiera nowy przycisk (44) Dokładniejszy przegląd kodu układu (45) Weź swoją aplikację na jazdę próbną (49) Podawanie tekstów na stałe utrudnia lokalizację (50) Utworzenie zasobu łańcuchowego (51) Zastosowanie zasobu łańcuchowego w układzie (52) Kod pliku activity_find_beer.xml (53) Dodawanie wartości do komponentu Spinner (56) Dodanie elementu string-array do pliku strings.xml (57) Jazda próbna komponentu Spinner (58) Musimy zadbać o to, by przycisk coś robił (59) Niech przycisk wywołuje metodę (60) Jak wygląda kod aktywności (61) Dodaj do aktywności metodę onClickFindBeer() (62) Metoda onClickFindBeer() musi coś robić (63) Dysponując obiektem View, można odwoływać się do jego metod (64) Aktualizacja kodu aktywności (65) Pierwsza wersja aktywności (67) Co ten kod robi? (68) Tworzenie własnej klasy Javy (70) Co się dzieje podczas wykonywania tego kodu? (74) Jazda próbna - test aplikacji (75) Twój przybornik do Androida (76) ROZDZIAŁ 3. Wiele aktywności i intencji. Jakie są Twoje intencje? Aplikacja może zawierać więcej niż jedną aktywność (78) Oto struktura naszej aplikacji (79) Zaczynamy: utworzenie projektu (79) Aktualizacja układu (80) Utworzenie drugiej aktywności i układu (82) Przedstawiamy plik manifestu aplikacji na Androida (84) Intencja jest rodzajem komunikatu (86) Co się dzieje po uruchomieniu aplikacji? (88) Przekazanie tekstu do drugiej aktywności (90) Aktualizacja właściwości widoku tekstowego (91) Metoda putExtra() zapisuje w intencji dodatkowe informacje (92) Aktualizacja kodu aktywności CreateMessageActivity (95) Zastosowanie informacji przekazanych w intencji w klasie ReceiveMessageActivity (96) Co się dzieje, gdy użytkownik kliknie przycisk Wyślij wiadomość (97) Możemy zmienić aplikację tak, by wiadomość była wysyłana do innych osób (98) Jak działają aplikacje na Androida (99) Utworzenie intencji określającej akcję (101) Zmiana intencji w celu użycia akcji (102) Jak Android korzysta z filtrów intencji? (106) A co, jeśli chcemy, by użytkownik ZAWSZE wybierał aktywność? (112) Co się dzieje w momencie wywoływania metody createChooser()? (113) Zmień kod, by wyświetlać okno dialogowe (115) Twój przybornik do Androida (118) ROZDZIAŁ 4. Cykl życia aktywności. Była sobie aktywność Jak właściwie działają aktywności? (120) Aplikacja stopera (122) Dodanie zasobów łańcuchowych (123) Jak będzie działał kod aktywności? (125) Działanie kodu obsługującego przyciski (126) Metoda runTimer() (127) Pełny kod metody runTimer() (129) Kompletny kod aktywności StopwatchActivity (130) Obrót ekranu zmienia konfigurację urządzenia (136) Stany aktywności (137) Cykl życia aktywności: od utworzenia do usunięcia (138) Zaktualizowany kod aktywności StopwatchActivity (142) Co się stanie po uruchomieniu aplikacji? (143) Tworzenie i usuwanie to nie cały cykl życia aktywności (146) Zaktualizowany kod aktywności StopwatchActivity (151) Co się dzieje podczas działania aplikacji? (152) A co się dzieje, jeśli aplikacja jest tylko częściowo widoczna? (154) Cykl życia aktywności: życie na pierwszym planie (155) Zatrzymanie stopera w razie wstrzymania aktywności (158) Implementacja metod onPause() oraz onResume() (159) Kompletny kod aktywności (160) Co się stanie po uruchomieniu aplikacji? (163) Wygodny przewodnik po metodach cyklu życia aktywności (167) Twój przybornik do Androida (168) ROZDZIAŁ 5. Widoki i grupy widoków. Podziwiaj widoki Interfejs użytkownika aplikacji składa się z układów i komponentów GUI (170) Układ LinearLayout wyświetla widoki w jednym wierszu lub w jednej kolumnie (171) Dodawanie pliku zasobów wymiaru w celu zapewnienia spójnych wypełnień w układach (174) Stosowanie marginesów do oddalania widoków od siebie (176) Zmieńmy nieco prosty układ liniowy (177) Rozciągaaaaamy widok, zwiększając jego wagę (179) Wartości atrybutu android:gravity (183) Kompletny układ liniowy (186) Układy FrameLayout rozmieszczają widoki jeden na drugim (188) Dodanie obrazka do projektu (189) Kompletny kod układu (192) Układy FrameLayout: podsumowanie (193) Zabawy z widokami (201) Pola tekstowe (202) Przycisk (203) Przycisk przełącznika (204) Przełącznik (205) Pola wyboru (206) Przyciski opcji (208) Lista rozwijana (210) Widoki obrazów (211) Dodawanie obrazów do przycisków (213) Widoki przewijane (215) Krótkie komunikaty (216) Twój przybornik do Androida (220) ROZDZIAŁ 6. Układy z ograniczeniami. Rozmieszczaj rzeczy w odpowiednich miejscach Zagnieżdżone układy mogą być nieefektywne (222) Przedstawiamy układy z ograniczeniami (223) Nie zapomnij dołączyć do projektu biblioteki Constrained Layout Library (224) Dodanie zasobów do strings.xml (225) Zastosowanie narzędzia do tworzenia szkicu (226) Rozmieszczanie widoków przy wykorzystaniu ograniczeń (227) Dodawanie ograniczenia w pionie (228) Zmiany szkicu są uwzględniane w kodzie XML (229) Jak wyśrodkowywać widoki (230) Zmiana położenia widoku poprzez określanie przesunięcia (231) Jak zmieniać wielkość widoku? (232) Jak wyrównywać widoki? (238) Stwórzmy prawdziwy układ (239) Zacznij od dodania widoków do górnego wiersza (240) Mechanizm wnioskowania odgaduje, jakie ograniczenia należy dodać (241) Dodaj do szkicu kolejny wiersz... (242) I w końcu dodaj widok na treść wiadomości (243) Jazda próbna aplikacji (244) Twój przybornik do Androida (245) ROZDZIAŁ 7. Widoki list i adaptery. Zorganizuj się Każda aplikacja zaczyna się od pomysłu (248) Użyj widoku listy do nawigowania po danych (251) Aktywność szczegółów napoju (253) Struktura aplikacji dla kafeterii Coffeina (254) Klasa Drink (256) Układ aktywności głównego poziomu składa się z obrazka i listy (258) Kompletny kod układu aktywności głównego poziomu (260) Zapewnianie reakcji ListView na kliknięcia za pomocą obiektu nasłuchującego (261) Dodanie obiektu nasłuchującego do widoku listy (262) Aktywność kategorii wyświetla dane jednej kategorii (267) Aktualizacja układu activity_drink_category.xml (268) W przypadku danych statycznych należy użyć adaptera (269) Łączenie widoków ListView z tablicami przy użyciu adaptera (270) Dodanie adaptera ArrayAdapter do aktywności DrinkCategoryActivity (271) Przegląd aplikacji, czyli dokąd dotarliśmy (274) Jak obsługiwaliśmy kliknięcia w aktywności TopLevelActivity (276) Kompletny kod aktywności DrinkCategoryActivity (278) Wypełnienie widoków danymi (281) Kod aktywności DrinkActivity (283) Co się stanie po uruchomieniu aplikacji (284) Twój przybornik do Androida (288) ROZDZIAŁ 8. Biblioteki wsparcia i paski aplikacji. Na skróty Świetne aplikacje mają przejrzystą strukturę (290) Różne typy nawigacji (291) Zacznijmy od paska akcji (293) Utwórz aplikację Włoskie Co Nieco (295) Dodaj bibliotekę wsparcia AppCompat v7 (296) Plik AndroidManifest.xml może zmieniać postać paska aplikacji (299) Jak zastosować motyw? (300) Zdefiniuj styl w pliku zasobów (301) Dostosuj wygląd aplikacji (303) Zdefiniuj kolory w pliku zasobów kolorów (304) Kod pliku activity_main.xml (305) Pasek aplikacji a pasek narzędzi (306) Dołącz pasek narzędzi do układu aktywności (312) Dodawanie akcji do paska aplikacji (315) Zmień pasek aplikacji, dodając do niego etykietę (318) Kod pliku AndroidManifest.xml (319) Określ wygląd akcji (322) Kompletny kod pliku MainActivity.java (325) Włączanie nawigacji w górę (327) Dzielenie się treściami z poziomu paska aplikacji (331) Dodawanie dostawcy akcji udostępniania do menu_main.xml (332) Określanie treści za pomocą intencji (333) Kompletny kod aktywności MainActivity (334) Twój przybornik do Androida (337) ROZDZIAŁ 9. Fragmenty. Zadbaj o modularyzację Twoja aplikacja musi wyglądać świetnie na WSZYSTKICH urządzeniach (340) Może się zdarzyć, że aplikacja będzie musiała także działać inaczej (341) Fragmenty umożliwiają wielokrotne stosowanie kodu (342) Aplikacja w wersji na telefony (343) Utworzenie projektu i aktywności (345) Dodanie przycisku do układu aktywności (346) Jak dodać fragment do projektu? (348) Metoda onCreateView() fragmentu (350) Dodawanie fragmentu do układu aktywności (352) Zapewnienie interakcji fragmentu i aktywności (359) Klasa Workout (360) Przekazywanie identyfikatora treningu do fragmentu (361) Określenie identyfikatora treningu w kodzie aktywności (363) Cykl życia fragmentów (365) Określenie zawartości widoków w metodzie onStart() fragmentu (367) Jak utworzyć fragment typu ListFragment? (374) Zaktualizowany kod klasy WorkoutListFragment (377) Kod układu activity_main.xml (381) Powiązanie listy z widokiem szczegółów (384) Kod pliku WorkoutListFragment.java (387) Aktywność MainActivity musi implementować interfejs (388) Aktywność DetailActivity musi przekazać identyfikator do fragmentu WorkoutDetailFragment (389) Twój przybornik do Androida (392) ROZDZIAŁ 10. Fragmenty dla większych interfejsów. Różne wielkości, różne interfejsy Nasza aplikacja Trenażer wygląda tak samo na telefonie i tablecie (394) Projektowanie z myślą o większych interfejsach (395) Wersja aplikacji na telefony (396) Wersja aplikacji na tablety (397) Utwórz AVD tabletu (399) Umieszczaj zasoby przeznaczone dla różnych rodzajów ekranów w odpowiednich katalogach (402) Różne opcje katalogów (403) Tablety używają układów zapisanych w katalogu layout-large (408) Jak działa zaktualizowany kod? (410) Musimy zmienić kod metody itemClicked() (412) Chcemy, by fragmenty współpracowały z przyciskiem Wstecz (413) Witamy stos cofnięć (414) Transakcje na stosie cofnięć nie muszą być aktywnościami (415) Użyj układu FrameLayout, by programowo zmieniać fragmenty (416) Skorzystaj z różnic w układach, aby określić, który z nich został użyty (417) Zmodyfikowany kod aktywności MainActivity (418) Stosowanie transakcji fragmentów (419) Zaktualizowany kod aktywności MainActivity (423) Zmiana orientacji tabletu wywołuje problem w aplikacji (427) Zapisywanie stanu aktywności (po raz wtóry) (428) Zaktualizowany kod pliku WorkoutDetailFragment.java (430) Twój przybornik do Androida (432) ROZDZIAŁ 11. Fragmenty dynamiczne. Zagnieżdżanie fragmentów Dodawanie fragmentów dynamicznych (434) Nowa wersja aplikacji (436) Utwórz aktywność TempActivity (437) Klasa TempActivity musi dziedziczyć po AppCompatActivity (438) Kod fragmentu StopwatchFragment (444) Układ fragmentu StopwatchFragment (447) Dodanie fragmentu StopwatchFragment do układu aktywności TempActivity (449) Atrybut onClick wywołuje metody aktywności, a nie fragmentu (452) Powiązanie obiektu nasłuchującego OnClickListener z przyciskami (457) Kod fragmentu StopwatchFragment (458) Obrócenie urządzenia zeruje stoper (462) Używaj dla statycznych fragmentów... (463) W układzie activity_temp.xml zastosuj układ FrameLayout (464) Kompletny kod aktywności TempActivity.java (467) Dodanie stopera do fragmentu WorkoutDetailFragment (469) Kompletny kod pliku WorkoutDetailFragment.java (476) Twój przybornik do Androida (480) ROZDZIAŁ 12. Biblioteka wsparcia wzornictwa. Przeciągnięcie w prawo Aplikacja Włoskie Co Nieco w nowej odsłonie (482) Struktura aplikacji (483) Użycie klasy ViewPager do przewijania fragmentów (489) Dodajemy ViewPager do układu aktywności MainActivity (490) Przekaż kontrolce informacje o stronach przy użyciu odpowiedniego adaptera (491) Kod naszego adaptera FragmentPagerAdapter (492) Pełny kod pliku MainActivity.java (494) Dodanie kart do aktywności MainActivity (498) Jak dodać karty do układu? (499) Połączenie układu kart z kontrolką ViewPager (501) Pełny kod pliku MainActivity.java (502) Biblioteka wsparcia wzornictwa pomaga implementować Material Design (506) Zapewnienie reagowania paska narzędzi na przewijanie (508) Dodanie CoordinatorLayout do układu aktywności MainActivity (509) Jak koordynować przewijanie? (510) Dodanie do fragmentu zawartości do przewijania (512) Pełny kod pliku fragment_top.xml (515) Dodanie zwijanego paska narzędzi do aktywności OrderActivity (517) Jak stworzyć prosty zwijany pasek narzędzi? (518) Jak dodać obrazek do zwijanego paska narzędzi? (523) Aktualizacja kodu układu activity_order.xml (524) Przyciski FAB i paski snackbar (526) Zaktualizowany kod pliku activity_order.xml (528) Pełny kod pliku OrderActivity.java (533) Twój przybornik do Androida (535) ROZDZIAŁ 13. Widoki RecyclerView i CardView. Stosuj recykling Wciąż jest wiele do zrobienia w aplikacji Włoskie Co Nieco (538) Widoki RecyclerView z wysokości 3000 metrów (539) Dodanie danych pizz (541) Wyświetlenie danych pizzy na karcie (542) Jak utworzyć widok karty? (543) Kompletny kod pliku card_captioned_image.xml (544) Dodanie adaptera widoku RecyclerView (546) Zdefiniowanie obiektu ViewHolder (548) Przesłonięcie metody onCreateViewHolder() (549) Dodanie danych do widoków CardView (550) Kompletny kod pliku CaptionedImagesAdapter.java (551) Utworzenie widoku RecyclerView (553) Dodanie widoku RecyclerView do układu fragmentu PizzaFragment (554) Kompletny kod pliku PizzaFragment.java (555) RecyclerView rozmieszcza swoje widoki, używając menedżera układu (556) Określanie menedżera układu (557) Pełny kod fragmentu PizzaFragment.java (558) Zapewnienie reakcji obiektu RecyclerView na kliknięcia (566) Utworzenie aktywności PizzaDetailActivity (567) Kod pliku PizzaDetailActivity.java (569) Zapewnienie reakcji widoku RecyclerView na kliknięcia (570) Można nasłuchiwać zdarzeń z widoków w adapterze (571) Zapewnianie możliwości wielokrotnego stosowania adapterów (572) Dodanie interfejsu do adaptera (573) Implementacja interfejsu we fragmencie PizzaFragment (575) Twój przybornik do Androida (578) ROZDZIAŁ 14. Szuflady nawigacyjne. Z miejsca na miejsce Widoki kart zapewniają łatwą nawigację... (580) Planujemy utworzenie szuflady nawigacyjnej w nowej aplikacji pocztowej (581) Szuflady nawigacyjne rozmontowane na czynniki pierwsze (582) Utworzenie projektu Koci Czat (584) Utworzenie fragmentu InboxFragment (585) Utworzenie fragmentu DraftsFragment (586) Utworzenie fragmentu SentItemsFragment (587) Utworzenie fragmentu TrashFragment (588) Przygotowanie układu paska narzędzi (589) Aktualizacja motywu aplikacji (590) Utworzenie aktywności HelpActivity (591) Utworzenie aktywności FeedbackActivity (592) Utworzenie nagłówka szuflady nawigacyjnej (594) Kompletny kod pliku nav_header.xml (595) Jak można grupować elementy? (598) Sekcję wsparcia dodamy jako podmenu (600) Kompletny kod pliku menu_nav.xml (601) Jak utworzyć szufladę nawigacyjną? (602) Kompletny kod układu aktywności activity_main.xml (603) Dodanie fragmentu InboxFragment do układu aktywności MainActivity (604) Dodanie przełącznika szuflady (607) Reagowanie na klikanie elementów szuflady (608) Implementacja metody onNavigationItemSelected() (609) Zamknięcie szuflady po naciśnięciu przycisku Wstecz (614) Kompletny kod aktywności MainActivity (615) Twój przybornik do Androida (619) ROZDZIAŁ 15. Bazy danych SQLite. Odpal bazę danych Znowu w kafeterii Coffeina (622) Android trwale przechowuje dane, używając baz danych SQLite (623) Android udostępnia kilka klas związanych z SQLite (624) Obecna struktura aplikacji kafeterii Coffeina (625) Zmienimy aplikację, by korzystała z bazy danych (626) Pomocnik SQLite zarządza Twoją bazą danych (627) Tworzenie pomocnika SQLite (628) Wnętrze bazy danych SQLite (630) Tabele tworzymy w języku SQL (631) Wstawianie danych za pomocą metody insert() (632) Wstawianie wielu rekordów (633) Kod klasy CoffeinaDatabaseHelper (634) Co robi kod pomocnika SQLite? (635) Co zrobić, gdy trzeba będzie zmienić bazę? (636) Bazy danych SQLite mają numer wersji (637) Co się dzieje w przypadku zmiany numeru wersji? (638) Aktualizacja bazy w metodzie onUpgrade() (640) Przywracanie starszej wersji bazy za pomocą metody onDowngrade() (641) Zaktualizujmy bazę danych (642) Aktualizacja istniejącej bazy danych (645) Aktualizacja rekordów za pomocą metody update() (646) Stosowanie warunków odnoszących się do wielu kolumn (647) Modyfikacja struktury bazy danych (649) Usuwanie tabeli (650) Pełny kod pomocnika SQLite (651) Twój przybornik do Androida (656) ROZDZIAŁ 16. Proste kursory. Pobieranie danych Co się wydarzyło wcześniej... (658) Struktura nowej wersji aplikacji kafeterii Coffeina (659) Co zrobimy, by aktywność DrinkActivity zaczęła korzystać z bazy danych? (660) Aktualny kod aktywności DrinkActivity (661) Pobranie referencji do bazy danych (662) Pobieranie danych z bazy za pomocą kursora (663) Zwracanie wszystkich wierszy tabeli (664) Zwracanie wierszy w określonej kolejności (665) Zwracanie wybranych rekordów (666) Dotychczasowy kod aktywności DrinkActivity (669) Aby odczytać rekord z kursora, najpierw należy do niego przejść (670) Poruszanie się po kursorze (671) Pobieranie wartości z kursora (672) Kod aktywności DrinkActivity (673) Co udało się nam zrobić? (675) Aktualny kod aktywności DrinkCategoryActivity (677) Pobranie referencji do bazy danych kafeterii... (678) Jak zastąpić tablicę przekazywaną do komponentu ListView? (679) SimpleCursorAdapter odwzorowuje dane na widoki (680) Stosowanie adaptera SimpleCursorAdapter (681) Zamykanie kursora i bazy danych (682) Ciąg dalszy opowieści (683) Zmodyfikowany kod aktywności DrinkCategoryActivity (688) Kod aktywności DrinkCategoryActivity (ciąg dalszy) (689) Twój przybornik do Androida (691) ROZDZIAŁ 17. Kursory i zadania asynchroniczne. Pozostając w tle Chcemy, by nasza aplikacja aktualizowała dane w bazie (694) Dodanie pola wyboru do układu aktywności DrinkActivity (696) Wyświetlanie wartości kolumny FAVORITE (697) Odpowiadanie na kliknięcia w celu aktualizacji bazy (698) Kompletny kod aktywności DrinkActivity (701) Wyświetlanie ulubionych napojów w aktywności TopLevelActivity (705) Refaktoryzacja pliku TopLevelActivity.java (707) Nowy kod aktywności TopLevelActivity (710) Kursor można zmieniać za pomocą metody changeCursor() (715) Który kod umieścić w którym wątku? (723) Klasa AsyncTask służy do wykonywania operacji asynchronicznych (724) Metoda onPreExecute() (725) Metoda doInBackground() (726) Metoda onProgressUpdate() (727) Metoda onPostExecute() (728) Parametry klasy AsyncTask (729) Kompletny kod klasy UpdateDrinkTask (730) Kompletny kod pliku DrinkActivity.java (732) Twój przybornik do Androida (737) Podsumowanie etapów działania zadań AsyncTask (737) ROZDZIAŁ 18. Usługi uruchomione. Do usług Usługi działają w tle (740) Utworzymy usługę URUCHOMIONĄ (741) Użycie klasy IntentService do utworzenia prostej usługi uruchomionej (742) Jak rejestrować komunikaty? (743) Kompletny kod usługi DelayedMessageService (744) Usługi są deklarowane w pliku AndroidManifest.xml (745) Dodajemy przycisk do układu activity_main.xml (746) Usługę uruchamiamy, wywołując metodę startService() (747) Stany usług uruchomionych (750) Cykl życia usług uruchomionych: od utworzenia do usunięcia (751) Nasza usługa dziedziczy metody cyklu życia (752) Android dysponuje wbudowaną usługą obsługi powiadomień (755) Użyjemy powiadomień z biblioteki wsparcia AppCompat (756) W pierwszej kolejności tworzymy budowniczego powiadomień (757) Wysyłanie powiadomień przy użyciu wbudowanej usługi systemowej (759) Kompletny kod usługi DelayedMessageService (760) Twój przybornik do Androida (765) ROZDZIAŁ 19. Usługi powiązane i uprawnienia. Powiązane ze sobą Usługi powiązane są skojarzone z innymi komponentami (768) Utworzenie nowej usługi (770) Zdefiniowanie obiektu Binder (771) Dodanie metody getDistance() do usługi (772) Aktualizacja układu aktywności MainActivity (773) Utworzenie obiektu ServiceConnection (775) Użycie metody bindService() do powiązania usługi (778) Użycie metody unbindService() do odłączenia aktywności od usługi (779) Wyświetlenie przebytego dystansu (780) Kompletny kod aktywności MainActivity (781) Stany usług powiązanych (787) Dodanie biblioteki wsparcia AppCompat (790) Dodanie do usługi OdometerService obiektu nasłuchującego danych o lokalizacji (792) Zaktualizowany kod usługi OdometerService (795) Wyliczenie przebytego dystansu (796) Kompletny kod pliku OdometerService.java (798) Jak poprosić o uprawnienia z poziomu aplikacji? (802) Sprawdzenie odpowiedzi na prośbę (805) Dodanie kodu wyświetlającego powiadomienia do metody onRequestPermissionsResult() (809) Kompletny kod pliku MainActivity.java (811) Twój przybornik do Androida (815) Świetnie, że odwiedziliście nas w Androidowie (816) DODATEK A. Układy względne i układy siatki. Poznaj krewnych DODATEK B. Gradle. Program do budowy Gradle DODATEK C. ART. Środowisko uruchomieniowe Androida DODATEK D. ADB. Android Debug Bridge DODATEK E. Emulator Androida. Przyspieszanie emulatora DODATEK F. Pozostałości. Dziesięć najważniejszych zagadnień (których nie opisaliśmy) 1. Rozpowszechnianie aplikacji (862) 2. Dostawcy treści (863) 3. Klasy Loader (864) 4. Adaptery synchronizujące (864) 5. Odbiorcy komunikatów (865) 6. Klasa WebView (866) 7. Ustawienia (867) 8. Animacje (868) 9. Widżety aplikacji (869) 10. Testy zautomatyzowane (870)
Na okładce także nazwa wydawcy oryginału: No starch press.
Android. system operacyjny dla aparatów fotograficznych? Doświadczenie zawsze w cenie Zespół się rozrasta Jak zapunktować u inwestorów? Przejęcie startupu Życie w Google'u BUDOWANIE PLATFORMY Zespół do spraw podstawowych elementów systemu Java Podstawowe biblioteki Infrastruktura Grafika Media Framework Zestaw narzędzi do tworzenia interfejsu użytkownika Systemowy interfejs użytkownika i launcher Design Androidowa przeglądarka internetowa London Calling Aplikacje Usługi Androida Lokalizacja, lokalizacja, lokalizacja Android Market. Komunikacja Narzędzia dla deweloperów Odchudzony kod Open source Jak tym wszystkim zarządzać? Porozumienia Produkt kontra platforma ZESPÓŁ ANDROIDA Android != Google Zabawy ze sprzętem. Zabawy z robotami W tym czasie w Cupertino. Wydanie SDK Okres poprzedzający wydanie wersji 1.0 systemu Wydanie wersji 1.0 Reakcje na G1 Pierwsze urządzenia Droid dał radę Samsung i inni
U góry okł.: Błyskawicznie opanuj środowisko produkcyjne dla Androida!
U dołu okł.: Jak rozpocząć przygodę z systemem Adndroid? Jak korzystać z usług geolokalizacyjnych? Jak tworzyć trójwymiarową grafikę, korzystając z biblioteki OpenGL?
Na okładce: Wydanie 3 - dotyczy wydania oryginału.
Indeks.
Poznawanie systemu Android Wymagania wstępne Co nowego w trzecim wydaniu? Jak korzystać z tej książki? Jak zorganizowana jest ta książka Wyzwania Czy jesteś dociekliwy? Styl kodowania Konwencje typograficzne Wersje systemu Android Niezbędne narzędzia Pobieranie i instalowanie Android Studio Pobieranie starszych wersji środowiska SDK Urządzenie sprzętowe Twoja pierwsza aplikacja dla systemu Android Podstawowe elementy aplikacji Tworzenie projektu aplikacji dla systemu Android Poruszanie się w Android Studio Tworzenie układu interfejsu użytkownika Hierarchia widoków Atrybuty widgetów Tworzenie zasobów tekstowych Podgląd układu Od pliku układu XML do obiektów klasy View Zasoby i identyfikatory zasobów Podłączanie widgetów Pobieranie odwołań do widgetów Tworzenie obiektów nasłuchujących Tworzenie komunikatów toast Zastosowanie mechanizmu dopełniania kodu Uruchamianie aplikacji w emulatorze Dla dociekliwych: proces budowania aplikacji Narzędzia wspomagające budowanie aplikacji Wyzwania Wyzwanie: dostosowywanie komunikatów toast do własnych potrzeb System Android i wzorzec MVC Tworzenie nowej klasy Generowanie getterów i setterów Wzorzec MVC a system Android Zalety stosowania wzorca MVC Aktualizacje warstwy widoku Aktualizacja warstwy kontrolera Uruchamianie aplikacji na urządzeniu fizycznym Podłączanie urządzenia fizycznego Konfigurowanie urządzenia do pracy ze środowiskiem deweloperskim Dodawanie ikon Dodawanie nowych zasobów do projektu aplikacji Odwołania do zasobów w kodzie XML Wyzwanie: dodaj listener do widoku TextView Wyzwanie: dodaj przycisk Poprzednie Wyzwanie: od przycisku Button do przycisku ImageButton Cykl życia aktywności Logowanie cyklu życia aktywności Tworzenie dziennika komunikatów Zastosowanie panelu Logcat Badanie cyklu życia aktywności w praktyce Zmiana orientacji urządzenia a cykl życia aktywności Konfiguracje urządzeń i zasoby alternatywne Zapisywanie danych przy zmianie orientacji urządzenia Nadpisywanie metody onSaveInstanceState(Bundle) Jeszcze kilka słów o cyklu życia aktywności Dla dociekliwych: bieżący proces czyszczenia aktywności Dla dociekliwych: poziomy logowania i odpowiadające im metody Wyzwanie: zapobieganie wielokrotnym odpowiedziom na to samo pytanie Wyzwanie: ocena poziomu poprawności odpowiedzi Debugowanie aplikacji dla systemu Android Wyjątki i ślad stosu Diagnozowanie problemów Logowanie śladów stosu Ustawianie punktów przerwania w kodzie Zastosowanie pułapek z wyjątkami Mechanizmy debugowania specyficzne dla systemu Android Korzystanie z programu Android Lint Problemy z klasą R Wyzwanie: zastosowanie narzędzia Layout Inspector Wyzwanie: śledzenie alokacji zasobów pamięci Twoja druga aktywność Konfigurowanie drugiej aktywności Tworzenie nowej aktywności Podklasa nowej aktywności Deklarowanie aktywności w manifeście aplikacji Dodawanie przycisku podpowiedzi do aktywności QuizActivity Uruchamianie aktywności Komunikowanie się z intencjami Przekazywanie danych między intencjami Używanie danych typu extras w intencjach Pobieranie wyników z aktywności podrzędnej Jak system Android widzi Twoje aktywności Wyzwanie: zamykanie luk dla oszustów Wersje Android SDK i kompatybilność aplikacji Wersje środowiska Android SDK Kompatybilność aplikacji z różnymi wersjami systemu Android Rozsądne minimum Minimalna wersja SDK Docelowa wersja SDK Wersja kompilacji SDK Bezpieczne dodawanie kodu z nowszych wersji API Korzystanie z dokumentacji dla deweloperów aplikacji systemu Android Wyzwanie: raportowanie wersji SDK Wyzwanie: ograniczenie podpowiadania Fragmenty w interfejsie użytkownika i menedżer fragmentów Potrzeba elastyczności interfejsu użytkownika Wprowadzenie do zastosowania fragmentów Uruchamianie aplikacji CriminalIntent Tworzenie nowego projektu Dwa typy fragmentów Dodawanie zależności w Android Studio Tworzenie klasy Crime Hostowanie fragmentów interfejsu użytkownika Cykl życia fragmentu Dwa podejścia do hostowania fragmentów Definiowanie widoku kontenera Tworzenie fragmentu interfejsu użytkownika Definiowanie układu fragmentu CrimeFragment Tworzenie klasy CrimeFragment Dodawanie fragmentów interfejsu użytkownika do instancji klasy FragmentManager Transakcje fragmentów FragmentManager i cykl życia fragmentów Architektura aplikacji wykorzystującej fragmenty Powód, dla którego wszystkie nasze aktywności używają fragmentów Dla dociekliwych: fragmenty i biblioteka wsparcia Dla dociekliwych: dlaczego fragmenty z biblioteki wsparcia są bardziej użyteczne? Wyświetlanie list w widoku RecyclerView Aktualizacja warstwy modelu aplikacji CriminalIntent Wzorzec Singleton i scentralizowane przechowywanie danych Abstrakcyjna aktywność do przechowywania fragmentów Ogólny układ przechowujący fragmenty Abstrakcyjna klasa Activity Klasy RecyclerView, Adapter oraz ViewHolder Klasy ViewHolder i Adapter Adaptery Zastosowanie kontenera RecyclerView Widok do wyświetlenia Implementowanie klas ViewHolder i Adapter Dowiązywanie elementów listy Reagowanie na naciśnięcie Dla dociekliwych: kontenery ListView i GridView Dla dociekliwych: singletony Wyzwanie: typy widoków kontenera RecyclerView Tworzenie interfejsów użytkownika z układami i widgetami Korzystanie z graficznego narzędzia tworzenia układów Wprowadzenie do dynamicznych układów interfejsu - ConstraintLayout Korzystanie z układu ConstraintLayout Edytor graficzny Tworzenie miejsca dla widoków Dodawanie widgetów Wewnętrzne ustawienia układu ConstraintLayout Edytowanie właściwości Tworzenie dynamicznych elementów listy Jeszcze kilka słów o atrybutach układu Gęstość pikseli ekranu i jednostki dp oraz sp Marginesy i odstępy Style, motywy i atrybuty motywów Wytyczne dla deweloperów aplikacji dla systemu Android Graficzne narzędzia do tworzenia układów Wyzwanie: formatowanie daty Zastosowanie argumentów fragmentów Uruchamianie aktywności przez fragment Dodawanie danych extras Pobieranie danych extras Wypełnianie widoku fragmentu CrimeFragment danymi z obiektu Crime Wady bezpośredniego pobierania danych Argumenty fragmentu Przypisywanie argumentów do fragmentu Pobieranie argumentów Przeładowywanie listy Pobieranie wyników działania fragmentów Dla dociekliwych: dlaczego używamy argumentów fragmentów? Wyzwanie: efektywne przeładowywanie zawartości kontenera RecyclerView Wyzwanie: ulepszanie wydajności działania obiektu CrimeLab Zastosowanie klasy ViewPager Tworzenie klasy CrimePagerActivity Obiekty ViewPager i PagerAdapter Integrowanie aktywności CrimePagerActivity FragmentStatePagerAdapter kontra FragmentPagerAdapter Dla dociekliwych: jak naprawdę działa ViewPager Dla dociekliwych: rozmieszczanie widoków z poziomu kodu Wyzwanie: odtwarzanie marginesów fragmentu CrimeFragment Wyzwanie: dodawanie przycisków Pierwsza i Ostatnia Okna dialogowe Tworzenie instancji klasy DialogFragment Wyświetlanie fragmentu DialogFragment Dodawanie zawartości okna dialogowego Przekazywanie danych między fragmentami Przekazywanie danych do fragmentu DatePickerFragment Zwracanie danych do fragmentu CrimeFragment Wyzwanie: więcej okien dialogowych Wyzwanie: bardziej responsywny DialogFragment Pasek narzędzi Biblioteka AppCompat Używanie biblioteki AppCompat Menu Definiowanie menu w kodzie XML Tworzenie menu Reagowanie na wybranie elementu menu Włączanie nawigacji hierarchicznej Jak działa nawigacja hierarchiczna Alternatywny przycisk akcji Przełączanie tytułu przycisku akcji "Jeszcze tylko jedna sprawa..." Dla dociekliwych: pasek akcji a pasek narzędzi Wyzwanie: usuwanie przestępstw z listy Wyzwanie: zasoby tekstowe typu plural Wyzwanie: pusty widok dla kontenera RecyclerView Bazy danych SQLite Definiowanie schematu Tworzenie szkieletu bazy danych Eksploracja plików przy użyciu Android Device Monitor Debugowanie problemów z bazą danych Patroszymy CrimeLab Zapisywanie danych w bazie Zastosowanie klasy ContentValues Wstawianie i aktualizowanie wierszy tabeli Odczytywanie danych z bazy Zastosowanie klasy CursorWrapper Zamiana na obiekty modelu Dla dociekliwych: więcej baz danych Dla dociekliwych: kontekst aplikacji Wyzwanie: usuwanie przestępstw z listy Intencje niejawne Dodawanie przycisków Dodawanie podejrzanego do warstwy modelu Zastosowanie ciągów formatujących Zastosowanie niejawnych intencji Elementy składowe niejawnej intencji Wysyłanie raportu o przestępstwie Korzystanie z listy kontaktów Wyszukiwanie aktywności zdolnych do wykonania danego zadania Wyzwanie: klasa ShareCompat Wyzwanie: kolejna intencja niejawna Wykonywanie zdjęć przy użyciu intencji Miejsce do przechowywania zdjęć Miejsce na przechowywanie plików Zastosowanie klasy FileProvider Określanie lokalizacji zdjęć Zastosowanie intencji do uruchomienia aparatu fotograficznego Uruchamianie intencji Skalowanie i wyświetlanie bitmap Deklarowanie wymagań aplikacji Wyzwanie: wyświetlanie zdjęcia w pełnym rozmiarze Wyzwanie: efektywne ładowanie miniaturek zdjęć Dwupanelowy interfejs typu lista-szczegóły Dodawanie elastyczności do układu Modyfikowanie klasy SingleFragmentActivity Tworzenie układu z dwoma kontenerami dla fragmentów Używanie aliasów zasobów Tworzenie alternatywy dla tabletów Aktywność: nadzorca fragmentów Interfejsy zwrotne układów Dla dociekliwych: jeszcze kilka słów o sprawdzaniu rozmiarów ekranu urządzenia Wyzwanie: dodawanie funkcji "przeciągnij, aby usunąć" Lokalizacja Lokalizacja zasobów Zasoby domyślne Sprawdzanie pokrycia zasobów przy użyciu edytora tłumaczeń Translations Editor Dostosowywanie ustawień regionalnych Kwalifikatory konfiguracji Priorytetyzacja zasobów alternatywnych Wiele kwalifikatorów Odszukiwanie zasobów najlepiej dopasowanych do bieżącej konfiguracji Testowanie zasobów alternatywnych Wyzwanie: lokalizacja dat Ułatwienia dostępu Usługa TalkBack Eksploracja przez dotyk Nawigacja liniowa poprzez przeciąganie palcem po ekranie Jak spowodować, aby TalkBack odczytywał elementy nietekstowe? Dodawanie opisów zawartości Włączanie możliwości ustawienia fokusu dla wybranego widoku Jak zapewnić zbliżoną funkcjonalność aplikacji z ułatwieniami dostępu Zastosowanie etykiet do udostępniania kontekstu Dla dociekliwych: korzystanie z aplikacji Accessibility Scanner Wyzwanie: poprawianie listy Wyzwanie: dostarczanie kontekstu dla elementu danych Wyzwanie: powiadomienia o zdarzeniach Wiązanie danych i model MVVM Różne architektury - dlaczego warto sobie tym zaprzątać głowę Tworzenie aplikacji BeatBox Proste wiązanie danych Importowanie zasobów typu assets Pobieranie zasobów assets Podłączanie zasobów typu asset Wiązanie do danych Tworzenie modelu widoku Wiązanie do modelu widoku Observable data Korzystanie z zasobów typu asset Dla dociekliwych: jeszcze kilka słów o wiązaniu danych Wyrażenia lambda Jeszcze więcej cukru syntaktycznego BindingAdapter Dla dociekliwych: dlaczego zasoby typu asset, a nie zwykłe zasoby aplikacji? Dla dociekliwych: zasoby typu non-asset? Testy jednostkowe i odtwarzanie plików audio Tworzenie klasy SoundPool Ładowanie plików dźwiękowych Odtwarzanie plików dźwiękowych Zależności testów Tworzenie klasy testowej Konfigurowanie testu Zastosowanie zależności pozornych Pisanie testów Testowanie interakcji obiektów Wywołania zwrotne wiązania danych Usuwanie plików dźwięków z pamięci Zmiana orientacji urządzenia a ciągłość istnienia obiektów Zachowywanie fragmentów Obracanie urządzenia a zachowywanie fragmentów Dla dociekliwych: czy zachowywać fragmenty? Dla dociekliwych: Espresso i testy integracyjne Dla dociekliwych: obiekty pozorne i testowanie Wyzwanie: sterowanie szybkością odtwarzania Style i motywy Zasoby kolorów Style Dziedziczenie stylów Motywy aplikacji Modyfikowanie motywu Dodawanie kolorów motywu Nadpisywanie atrybutów motywu Eksplorowanie motywu Modyfikowanie atrybutów przycisków Dla dociekliwych: jeszcze kilka słów o dziedziczeniu stylów Dla dociekliwych: dostęp do atrybutów motywu Elementy XML drawable Tworzenie przycisków o jednolitym wyglądzie) Elementy typu shape drawable Lista stanów Lista warstw Dla bardziej dociekliwych: po co zawracać sobie głowę elementami XML drawable? Dla bardziej dociekliwych: obrazy Mipmap Dla dociekliwych: obrazy 9-patch Wyzwanie: motywy przycisków Więcej o intencjach i zadaniach Tworzenie aplikacji NerdLauncher Rozwiązywanie intencji niejawnych Tworzenie jawnych intencji w czasie działania programu Zadania i stos aktywności Przełączanie między zadaniami Uruchamianie nowego zadania Użycie launchera NerdLauncher jako ekranu głównego Wyzwanie: ikony Dla dociekliwych: procesy kontra zadania Dla dociekliwych: dokumenty równoległe HTTP i zadania drugoplanowe Tworzymy aplikację PhotoGallery Podstawowe zagadnienia sieciowe Uzyskiwanie uprawnień do korzystania z połączeń sieciowych Uruchamianie zadań asynchronicznych AsyncTask w wątku tła Ty i Twój wątek główny Poza głównym wątkiem Pobieranie danych w formacie JSON z serwisu Flickr Parsowanie danych zapisanych w formacie JSON Od zadania AsyncTask z powrotem do wątku głównego Porządkowanie zadań asynchronicznych AsyncTask Dla dociekliwych: jeszcze kilka słów o zadaniach AsyncTask Dla dociekliwych: alternatywy dla zadań AsyncTask Wyzwanie: Gson Wyzwanie: podział na strony Wyzwanie: dynamiczne modyfikowanie liczby wyświetlanych kolumn Obiekty Looper, Handler i HandlerThread Przygotowanie kontenera RecyclerView do wyświetlania obrazów Pobieranie wielu małych rzeczy Komunikacja z wątkiem głównym (544) Tworzenie wątku tła Komunikaty i handlery komunikatów Anatomia komunikatu Anatomia handlera Używanie handlerów Przekazywanie handlerów Dla dociekliwych: zadania AsyncTask kontra wątki Dla dociekliwych: rozwiązywanie problemu z pobieraniem zdjęć Dla dociekliwych: tryb StrictMode Wyzwanie: ładowanie wstępne i buforowanie danych Wyszukiwanie Wyszukiwanie zdjęć w serwisie Flickr Zastosowanie widoku SearchView Reagowanie na interakcję widoku SearchView z użytkownikiem Proste zachowywanie danych w plikach preferencji Wygładzanie aplikacji Wyzwanie: jeszcze bardziej ulepszamy aplikację Usługi działające w tle Tworzenie usługi IntentService Do czego służą usługi Operacje sieciowe bezpiecznie działające w tle Sprawdzanie, czy pojawiły się nowe wyniki wyszukiwania Opóźnione wykonywanie z wykorzystaniem usługi AlarmManager Jak używać alarmów we właściwy sposób Obiekty PendingIntent Zarządzanie alarmami przy użyciu PendingIntent Sterowanie alarmami Powiadomienia Wyzwanie: powiadomienia na urządzeniach typu Android Wear Dla dociekliwych: szczegóły usługi Czym zajmują się usługi (a czego nie powinny robić) Cykl życia usługi Usługi typu non-sticky Usługi typu sticky Wiązanie usług Dla dociekliwych: klasy JobScheduler oraz JobServices JobScheduler i przyszłość zadań drugoplanowych Wyzwanie: zastosowanie klasy JobService w systemie Lollipop Dla bardziej dociekliwych: adaptery synchronizacji Intencje rozgłoszeń Intencje a intencje rozgłoszeń Odbieranie rozgłoszeń systemowych - aktywowanie podczas uruchamiania systemu Tworzenie i rejestrowanie samodzielnego odbiornika rozgłoszeń Używanie odbiorników rozgłoszeń Filtrowanie powiadomień pierwszoplanowych Wysyłanie intencji rozgłoszenia Tworzenie i rejestrowanie odbiornika dynamicznego Ograniczanie zasięgu rozgłoszeń tylko do naszej aplikacji przy użyciu prywatnych uprawnień Przekazywanie i odbieranie danych przy użyciu rozgłoszeń uporządkowanych Odbiorniki i zadania działające przez długi czas Dla dociekliwych: zdarzenia lokalne Używanie biblioteki EventBus Używanie biblioteki RxJava Dla dociekliwych: sprawdzanie, czy fragment jest widzialny Przeglądanie sieci WWW i widoki WebView Ostatni kawałek danych z serwisu Flickr Prosty sposób - intencje niejawne Trudniejszy sposób - widok WebView Zastosowanie interfejsu WebChromeClient do ulepszenia wyświetlania stron internetowych Zmiana orientacji urządzenia a widok WebView Niebezpieczeństwa związane z obsługą zmian konfiguracji) Dla dociekliwych: wstrzykiwanie obiektów JavaScript Dla dociekliwych: aktualizacje widoku WebView Wyzwanie: używanie przycisku Wstecz do obsługi historii przeglądania Wyzwanie: obsługa łączy innych niż HTTP Widoki niestandardowe i zdarzenia związane z dotykiem Konfigurowanie projektu aplikacji DragAndDraw Tworzenie własnego, niestandardowego widoku Tworzenie widoku BoxDrawingView Obsługa zdarzeń związanych z dotykiem Śledzenie zdarzeń związanych z ruchem palca po ekranie Renderowanie z użyciem metody onDraw(Canvas) Wyzwanie: zapisywanie stanu Wyzwanie: obracanie prostokątów Animacja właściwości Budowanie sceny) Proste animacje Właściwości transformacji widoków Używanie różnych interpolatorów Modyfikowanie kolorów Uruchamianie kilku animatorów jednocześnie Dla dociekliwych: inne API animacji Starsze narzędzia animacyjne Transformacje Wyzwania Lokalizacja i usługi Play Lokalizacja i biblioteki Usługi Google Play) Tworzenie aplikacji Locatr Google Play Services a testowanie usług lokalizacji w emulatorze Symulowane dane lokalizacji Budowanie aplikacji Konfigurowanie Google Play Services Uprawnienia do wyznaczania lokalizacji Używanie Google Play Services Wyszukiwanie zdjęć w serwisie Flickr z użyciem geolokalizacji Pobieranie informacji o bieżącej lokalizacji) Żądanie udzielenia uprawnień po uruchomieniu aplikacji Sprawdzanie uprawnień Wyszukiwanie i wyświetlanie zdjęć z użyciem geolokalizacji Wyzwanie: uzasadnianie prośby o udzielenie uprawnień Wyzwanie: wskaźnik postępu wyszukiwania Mapy Importowanie biblioteki Play Services Maps Korzystanie z map w systemie Android Pobieranie klucza Maps API dla map Google Konfigurowanie map Pobieranie dodatkowych danych o lokalizacji Praca z mapą Rysowanie na mapie Dla dociekliwych: zespoły programistów i klucze API Interfejs Material Design Warstwy materiałów Elewacja i wartości osi Z Animatory listy stanów Narzędzia animacji Animacje typu circular reveal Transformacje współdzielonego elementu Komponenty widoków Karty Przyciski FAB Powiadomienia Snackbar Jeszcze kilka słów o interfejsie Material Design Posłowie Wyzwanie finałowe
Na okładce i stronie tytułowej: Aplikacje do zadań specjalnych ... pisz tylko w Android Studio!.
Indeks.
Poznajemy Android Studio Instalacja środowiska Android Studio Pierwsze uruchomienie i pierwszy projekt środowiska Android Studio Konfiguracja emulatora AVD Konfiguracja urządzenia fizycznego Pierwsze uruchomienie aplikacji Opis środowiska Android Studio Podstawowe elementy okna głównego Opis dostępnych okien narzędziowych Opis okna edytora kodu Podstawowe elementy edytora kodu Lokalizacja błędów w kodzie programu Funkcja lupy Podział okna edycyjnego Uzupełnianie kodu Uzupełnianie składni Generowanie kodu Informacje o parametrach metod Podgląd dokumentacji Zwijanie i rozwijanie kodu Formatowanie kodu Podstawy tworzenia interfejsu użytkownika Edytor układów Praca z układami Układ LinearLayout (Horizontal) Układ LinearLayout (Vertical) Układ RelativeLayout Układ TableLayout Układ GridLayout Układ FrameLayout Zagnieżdżanie układów Komponent ScrollView Komponenty interfejsu użytkownika Kategoria Widgets Style i tematy Style Dziedziczenie stylów Tematy Obrazy typu Nine-patch Selektory Kształty Aktywności i fragmenty Aktywności Okna dialogowe Okna dialogowe postępu Informacyjne okna dialogowe Intencje Intencje jawne Intencje domniemane Fragmenty Powiadomienia proste Powiadomienia zwierające akcje Powiadomienia z rozszerzonym widokiem Priorytety powiadomień Grupowanie powiadomień Powiadomienia z odpowiedzią Praca z komponentami interfejsu użytkownika Zachowywanie stanu aktywności Obsługa zmian konfiguracji Zmiana orientacji ekranu Pozostałe zmiany konfiguracyjne Oprogramowywanie kontrolek interfejsu użytkownika Kontrolka AutoCompleteTextView Kontrolka ListView Kontrolka Spinner Klasy ListActivity i ListFragment Klasa DialogFragment Klasy TimePicker i DatePicker Klasa SeekBar Klasa RatingBar Obrazy i animacje Praca z obrazami Klasa GridView Klasa HorizontalScrollView Klasa ImageSwitcher Obrazy w kontrolce ListView Rysowanie kształtów Klasa Canvas Rysowanie wewnątrz kontrolki Klasa Shader Animacje Animacja poklatkowa Animowanie kontrolek Zapisywanie i odczytywanie danych Zapisywanie wartości typów prostych Zapisywanie danych do pliku Dostęp do listy kontaktów Korzystanie z bazy danych Usprawnienia w pisaniu kodu Skróty klawiaturowe Szablony
Wprowadzenie do wydajności aplikacji w systemie Android (15) Wydajność aplikacji jest ważna dla jej użytkowników (16) Najgorsze scenariusze wydajnościowe: awarie (18) Wykrywanie problemów wydajnościowych aplikacji (23) Budowanie laboratorium testowego (25) Jakich urządzeń używają Twoi klienci? (25) Podział urządzeń według elementów (26) Z jakich sieci korzystają klienci? (27) Twoje urządzenia nie są takie same jak urządzenia Twoich klientów (28) Testowanie aplikacji (29) Tworzenie laboratorium testowego (29) Wydajność sprzętu a żywotność akumulatora (39) Układy urządzenia z systemem Android (39) Mniej znaczy więcej (40) Co powoduje wyczerpanie akumulatora? (41) Podstawowa analiza wykorzystania akumulatora (49) Zaawansowany monitoring akumulatora (55) Interfejs JobScheduler (70) Wydajność wyświetlacza i interfejsu użytkownika (75) Wskaźniki wydajnościowe interfejsu użytkownika (75) Interfejs użytkownika i szybkość wyświetlania treści (76) Tworzenie widoków (77) Redukcja zasobów (90) Analiza pomijania ramek (95) Nie tylko pomijanie ramek (99) Postrzegana wydajność aplikacji (112) Wydajność pamięci (117) Jak działa pamięć w systemie Android? (117) Zarządzanie pamięcią i jej wycieki w języku Java (131) Narzędzia do wykrywania wycieków pamięci (131) Procesor i jego wydajność (147) Pomiar obciążenia procesora (148) Narzędzie Systrace do analizy obciążenia procesora (149) Narzędzie Traceview (Android Device Monitor) (152) Narzędzie Traceview (Android Studio) (155) Inne narzędzia profilujące (159) Wydajność sieci (161) Sieć wi-fi i sieć komórkowa (161) Narzędzia testowe (166) Optymalizacja komunikacji sieciowej w systemie Android (173) Światowy zasięg sieci komórkowych (187) Inne technologie komunikacji radiowej (194) Badanie wrażeń użytkowników (197) Implementacja narzędzi RUM (198) Analiza RUM przykładowej aplikacji (198) Awarie (200) Ratunek w analizie wielkich ilości danych? (211) Wydajność aplikacji w firmie (215) Budowanie świadomości (ukierunkowanie zarządu na wydajność) (215) Rozmowy o wydajności (216) Tworzenie aplikacji (217) Testowanie aplikacji (217) Wskaźniki wydajnościowe (218)
Na s. tyt. i okł.: Przekonaj się, że nie taki Android straszny, jak go malują... Poznaj najpopularniejszy system operacyjny dla urządzeń mobilnych. Naucz się tworzyć proste aplikacje i analizować kod przykładów. Dowiedz się, jakich narzędzi potrzebujesz, aby rozpocząć pracę.
S. tyt. i okł.: Naucz się tworzyć aplikacje w środowisku Android Studio! Instalowanie środowiska programistycznego, czyli od czego zacząć pracę. Efekty specjalne, czyli jak przygotować obrazy i animacje dla Twojej aplikacji. Programowanie w praktyce, czyli do czego potrzebna Ci jest Java.
Kody źródłowe wybranych przykładów dostępne są pod adresem internet. podanym na s. red.
Dla osób które chcą samodzielnie nauczyć się od podstaw zasad budowy oprogramowania na urządzenia mobilne i rozpocząć pisanie własnych aplikacji z wykorzystaniem szerokiego spektrum dostępnych komponentów programowych i sprzętowych.