PROGRAMOWANIE MOBILNE: ANDROID Marcin Luckner http://mini.pw.edu.pl/~lucknerm/ mluckner@mini.pw.edu.pl
Aplikacja
Aplikacja Technicznie - zbiór komponentów Dla użytkownika - zbiór zadań Zadanie to zbiór aktywności Aplikacja może używać komponentów innych aplikacji
KOMPONENTY 1. Aktywności (Activities) aktywność odpowiada pojedynczemu ekranowi wraz z interfejsem użytkownik 2. Usługi (Services) działają w tle nie dostarczają UI 3. Dostawcy treści(content providers) zarządza dostępem do uporządkowanych zbiorów danych 4. Odbiorcy komunikatów(broadcast receivers) otrzymuje wysłane intencje (Intent)
Zadanie
Aktywności zebrane w zadanie
PIASKOWNICA Android jest systemem wielu użytkowników (Linux) Każda aplikacja ma unikalny identyfikator użytkownika Uruchomienie aplikacji to uruchomienie maszyny wirtualnej Każda aplikacja uruchamia własny proces Linuxowy
Proces aplikacji
Cykl życia aplikacji oncreate() Aplikacja startuje onlowmemory() Jeżeli systemowi brakuje pamięci i chce ograniczyć zasoby aplikacji ontrimmemory(int level) Jeżeli system chce ograniczyć zasoby dla danego procesu level określa poziom braku pamięci onterminate() Nie występuje na urządzeniach z Androidem (tylko emulator) onconfigurationchange() Jeżeli zmienia się konfiguracja urządzenia podczas działania aplikacji.
Zamykanie Android utrzymuje proces aplikacji przy życiu tak długo jak się da Używa pięcio poziomowej hierarchii, aby wybrać proces do zamknięcia.
Priorytety procesów 1. Foreground Proces właśnie wykorzystywany przez użytkownika 2. Visible Procesy których aktywności są widoczne, ale nie są aktywne (np. zatrzymane przez powiadomienie) 3. Service Proces z usługami 4. Background Proces z zatrzymanymi aktywnościami 5. Empty Proces bez aktywnych komponentów
PRZYGOTOWANIE APLIKACJI SDK generuje zarchiwizowany plik Android application package (*.apk) Plik APK zawiera skompilowane źródła i zasoby Każda aplikacja działa w piaskownicy (sandboxed environment)
WEWNĄTRZ APLIKACJI 1. Plik manifestu 1. Określa komponenty i wymagane cechy urządzenia dla danej aplikacji 2. Zasoby 1. Oddzielone od kodu aplikacji i pozwalające na optymalizację działania aplikacji dla różnych konfiguracji urządzenia 3. Podstawowe komponenty
Struktura APK AndroidManifest.xml META-INF CERT.RSA CERT.SF MANIFEST.MF classes.dex (skompilowane klasy) res drawable layout resources.arcs (skompilowane zasoby)
Plik manifestu
Plik manifestu 1. Określa pakiet Javy zawierający aplikację 2. Opisuje komponenty aplikacji 1. Określa klasy implementujące komponenty 3. Ustawia zezwolenia
<manifest> <uses-permission /> <permission /> <permission-tree /> <permission-group /> <instrumentation /> <uses-sdk /> <uses-configuration /> <uses-feature /> <supports-screens /> <compatible-screens /> <supports-gl-texture /> <application> </application>
<uses-sdk> <manifest xmlns:android=http://schemas.android.com/apk/res/ android > <uses-sdk android:minsdkversion="8" android:targetsdkversion="17" /> </manifest> Przestrzeń nazw Minimalne wymagane API Porządane API
<application> <activity> <intent-filter> <action /> <category /> <data /> </intent-filter> <meta-data /> </activity> <activity-alias> <intent-filter>... </ intent-filter> <meta-data /> </activity-alias> <service> <intent-filter>... </intent-filter> <meta-data/> </service> <receiver> <intent-filter>... </intent-filter> <meta-data /> </receiver> <provider> <grant-uri-permission /> <meta-data /> <path-permission /> </provider>
Aktywność początkowa <activity android:name=".mainactivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> MAIN aktywność nie potrzebuje początkowych danych LAUNCHER pierwsza aktywność w aplikacji android:name - package_from_manifest.class
Manifest.MF Signature-Version: 1.0 Created-By: 1.0 (Android) SHA1-Digest-Manifest: wxqneai0ua5no5qj8cgmwjkggwe=... Name: res/layout/exchange_component_back_bottom.xml SHA1-Digest: eacjmjesj7zkf0cbftz0nqwrt7w=... Name: res/drawable-hdpi/icon.png SHA1-Digest: DGEqylP8W0n0iV/ZzBx3MW0WGCA=
Zasoby
Zasoby aplikacji 1. Zasoby układu Określają układ interfejsu aplikacji Zapisane w res/layout Dostęp poprzez klasę R.layout 2. Elementy graficzne Określają grafikę jako bitmapy lub XML Zapisane w res/drawable Dostęp poprzez klasę R.drawable 3. Zasoby tekstowe Określają teksty, tablice tekstów i teksty ilościowe Zapisane w res/values Dostęp poprzez klasy R.string, R.array, R.plurals 4. Inne zasoby Inne zasoby w tym: Bool, Color, Dimension. Zapisane wres/values Dostęp poprzez klasy R.bool, R.color, R.dimen
R.plurals Teksty ilościowe (Plurals) Zasób XML z różnymi wartościami dla liczby mnogiej Wspierane wartości: zero, one, two, few, many, i other. <?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="numberofsongsavailable"> <item quantity="one">znaleziono %d piosenkę.</item> <item quantity="few">znaleziono %d piosenki.</item> <item quantity="other">znaleziono %d piosenek.</item> </plurals> </resources> int count = getnumberofsongsavailable(); Resources res = getresources(); String songsfound = res.getquantitystring(r.plurals.numberofsongsavailable, count, count); 24
DOSTĘP DO ZASOBÓW POPRZEZ XML Składnia @[<package_name>:]<resource_type>/ <resource_name> Przykład Definicja tekstu w pliku XML res/values/ strings.xml: <resources> <string name="hello">hello!</string> </ resources> XML odczytujący wartość <EditText xmlns:android="http://schemas.android.com/ apk/res/android" android:text="@string/hello" />
DOSTĘP DO ZASOBÓW W KODZIE Składnia [<package_name>.]r.<resource_type>.<resource_na me> Przykład Definicja tekstu w pliku XML res/values/strings.xml: <resources> <string name="hello">hello!</string> </ resources> Kod odczytujący wartość String string = getstring(r.string.hello)
GRUPOWANIE TYPÓW ZASOBÓW Każdy typ zasobów musi być w określonym podkatalogu katalogu res/ Pliki z zasobami nie mogą być umieszczane bezpośrednio w katalogu res/ Błąd kompilacji Przykładowa hierarchia zasobów res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
ALTERNATYWNE ZASOBY Prawie każda aplikacja wymaga zdefiniowania alternatywnych zasobów dla wsparcia szczególnej konfiguracji urządzenia Podczas uruchomienia aplikacji Android wykrywa aktualną konfigurację i wczytuje odpowiednie zasoby Tworzenie zasobów Stwórz podkatalog w res/ stosując składnię: <resources_name>-<config_qualifier> Zapisz odpowiednie zasoby w katalogu
Określenia (QUALIFIERS) MCC/MNC (mobile country code/ mobile network) mcc260 (Poland), mcc260-mnc003 (Poland-Orange) Język i rejon en, fr, en-rus, fr-rfr, fr-rca Kierunek układu ldrtl (layout-direction-right-to-left), ldltr (vice versa) Orientacja ekranu port (pionowa), land (pozioma) typ UI car, desk, television, appliance (dokowanie)
GŁÓWNE ZASADY 1. Różne typy zasobów znajdują się w różnych podkatalogach res/ 2. Zasoby alternatywne znajdują się w plikach o nazwach określonych przez konfigurację 3. Zawsze umieszczaj domyślne zasoby, aby aplikacja nie bazowała tylko na wyszczególnionych konfiguracjach
SZCZEGÓŁOWE ZASADY 1. Można użyć wielu określeń do specyfikacji zasobu drawable-en-rus-land Agielski amerykański, telefon w orientacji poziomej 2. Wymagana określona kolejność 3. Nie można zagnieżdżać alternatywnych zasobów 4. Każdy typ określenia może być użyty tylko raz dla danego zestawu zasobów
Aktywność
Aktywność Skupiona na jednym temacie Zazwyczaj powiązana z interfejsem Zadania aktywności Tworzenie UI Kontrola stanu Cel Intencji Obsługa zdarzeń UI Nadzorowanie menu
Stos aktywności Jedna aktywność na raz Najważniejsza jest aktualna aktywność Aktualna aktywność może być zmieniona przez użytkownika lub system Zmienia się wtedy stan aktywności
STANY AKTYWNOŚĆ Działająca, Running (Resumed) na pierwszym tle, aktywna dla użytkownika Zawieszona, Paused wciąż widoczna, ale przesłonięta przez inną aktywność, zakrywającą część ekranu nie reaguje na polecenia użytkownika nie wykonuje kodu Zatrzymana Stopped niewidoczna na ekranie
Akcje Uruchamianie Aktywności oncreate() onstart() onresume() Aktywna Aktywność onpause() -przez inną Aktywność onstop() -zakończona lub zniszczona ondestroy() Zamykanie Aktywności
Cykl życia
Wstrzymywanie i wznawianie
Zatrzymywanie i ponowne uruchamianie
Szczegóły akcji oncreate() Inicjacja Wywoływane tylko raz Bundle - zapis stanu onpause() Ostatnia szansa by zapisać stan! System może uśmiercić proces po zakończeniu tej metody ondestroy() Wywoływane przez finish() Wywoływane przez system by zwolnić zasoby
Aktywności i Konfiguracja Konfiguracja definiuje wszystkie informacje o konfiguracji urządzenia konfiguracja sprzętowa orientacja urządzenia lokalizacja Zmiany niszczą Aktywność onpause() ondestroy()
Zmiany orientacji
ŁĄCZENIE AKTYWNOŚCI 1. Utwórz drugą aktywność 2. Dodaj ją do manifestu 3. Utwórz Intencję 4. Uruchom drugą Aktywność
Pierwsza aktywność <activity android:name=".mainactivity" android:label="@string/ app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity>
TWORZENIE DRUGIEJ AKTYWNOŚCI Podklasy Activity muszą implementować metodę oncreate() W metodzie należy zdefiniować układ (layout) aktywności poprzez metodę setcontentview()
DODAWANIE DO MANIFESTU Wszystkie Aktywności muszą być zdefiniowane w manifeście
UTWORZENIE DRUGIEJ AKTYWNOŚCI Uruchamianie startactivity() przekazuje Intencję (Intent) Intent jest obiektem łączącym dwa osobne komponenty, takie jak dwie aktywności, gdzie jeden uruchamia drugi
Komunikacja między Aktywnościami Aktywność może dodać dodatkowe informacje do Intencji Aktywność może odczytać informacje z otrzymanej Intencji
Intencja
Rodzaje Intencji Bezpośrednia EXPLICIT INTENT Intencja określa, który komponent aplikacji ma otrzymać Intencję do realizacji Pośrednia IMPLICIT INTENT Intencja nie określa odbiorcy, ale pozwala dowolnej zainstalowanej aplikacji odpowiedzieć na Intencję
EXPLICIT INTENT Uruchamiany komponent jest określany przez klasę Zazwyczaj komponent z tej samej aplikacji
IMPLICIT INTENT Określa akcję do wykonania Komponenty z innej aplikacji mogą go obsłużyć
Implict Intent - schemat
Implict intent w działaniu
IntentFilter Określa czy Intent może być obsłużony przez komponent w pliku manifestu Klasa PacketManager nadzoruje wszyskie deklaracje
Atrybuty dla Intent i IntentFilter
Akcje ACTION_MAIN ACTION_VIEW ACTION_ATTACH_DATA ACTION_EDIT ACTION_PICK ACTION_CHOOSER ACTION_GET_CONTENT ACTION_DIAL ACTION_CALL ACTION_SEND ACTION_SENDTO ACTION_ANSWER ACTION_INSERT ACTION_DELETE ACTION_RUN ACTION_SYNC ACTION_PICK_ACTIVITY ACTION_SEARCH ACTION_WEB_SEARCH ACTION_FACTORY_TEST
Kategorie CATEGORY_DEFAULT CATEGORY_BROWSABLE CATEGORY_TAB CATEGORY_ALTERNATIVE CATEGORY_SELECTED_ALTE RNATIVE CATEGORY_LAUNCHER CATEGORY_INFO CATEGORY_HOME CATEGORY_PREFERENCE CATEGORY_TEST CATEGORY_CAR_DOCK CATEGORY_DESK_DOCK CATEGORY_LE_DESK_DOCK CATEGORY_HE_DESK_DOCK CATEGORY_CAR_MODE CATEGORY_APP_MARKET
Połączenie Intent i IntedFilter
Złożony InterFilter
Testowanie Action Category Data
Intent i Usługi (Services) Zawsze używaj bezpośredniej Intencji uruchamiając Usługi (Services) Nie deklaruj IntentFilters dla swoich usług Używanie pośredniej Intencji uruchamia usługi bez kontroli Deweloperów Użytkowników Nikt nie wie, która usługa zostanie uruchomiona!
Linki Android Security Overview The AndroidManifest.xml File Accessing Resources String Resources Providing Alternative Resources Configuration qualifier names Intent Intents and Intent Filters http://slide.es/kamilgrondys