Systemy Wbudowane Dr inż. Android maf 1
Open Handset Alliance Android - podstawy Konsorcjum (sojusz) 78 firm mający na celu rozwój otwartych standardów dla urządzeń mobilnych Google, High Tech Computer (HTC), Dell, Intel, Motorola, Qualcomm, Texas Instruments, Samsung, Produkt sojuszu: Android oparty na licencji open source Wersje systemu Android Nazwa dydstrybucji Nr wersji Wersja API % rynku (marzec 2013) Jelly Bean 4.2.x 17 1,6 Jelly Bean 4.1.x 16 14,9 Ice Cream Sandwitch 4.0.x 14-15 28,6 Honeycomb 3.x.x 11-13 1,2 Gignerbread 2.3.x 9-10 44,2 Froyo 2.2 8 7,6 Eclair 2.0 i 2.1 7 1,9 Donut 1.6 4 0,2 Cupcake 1.5 3? maf 2
Android - podstawy maf 3
Podstawowe cechy Android - podstawy Jądro Linux 2.6.x i 3.0.x (od Android 4.0) Wirtualna maszyna Dalvik (DVM) Optymalizowana dla urządzeń mobilnych Pełna wielozadaniowość Brak obsługi czasu rzeczywistego Otwarte środowisko aplikacji: wielokrotne użycie i wzajemna wymiana komponentów Relacyjna baza danych SQLite Wsparcie: Zoptymalizowana grafika ze wspomaganiem sprzętowym 2D: Google Skia, 3D: Open GL ES Obsługa multimediów (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) Telefonia GSM, Bluetooth, EDGE, 3G, Wi-Fi Obsługa aparatu fotograficznego, GPSa, akcelerometra, kompasu Zintegrowana przeglądarka oparta na silniku WebKit Obsługa HTML 5 maf 4
Android - podstawy Architektura systemu maf 5
Android - podstawy Maszyna wirtualna Dalvik (DVM) Kod bajtowy aplikacji systemu Android jest uruchamiany w Dalvik VM Charakterystyka DVM Generowanie kodu maszynowego oparte na rejestrach (w JVM na stosach redukcja liczby instrukcji) Zoptymalizowana do działania na urządzeniach o ograniczonych zasobach (pamięć, moc obliczeniowa, brak pliku wymiany) Zoptymalizowana do jednoczesnego, wydajnego uruchamiania wielu swoich instancji Pliki kodu bajtowego klas Java (*.class) przetwarzane na kod bajtowy w formacie Dalvik Executable (*.dex) Eliminacja informacji powtarzających się w plikach klas Plik DEX ma mniejszy rozmiar w stosunku do pliku JAR Od wersji Android 2.2 wbudowany kompilator JIT (Just In Time) maf 6
Android - podstawy Środowisko programowania Język Java Ponad 40 pakietów i 700 klas (najważniejsze w android.*) Możliwe wstawki C/C++ Platforma programistyczna Java 2 SE (min. JDK 5) Android SDK Eclipse IDE (min. 3.3) ADT wtyczka do Eclipse obsługująca Android SDK Emulator systemu AVD (Android Virtual Device) Symulowany 32-bitowy tryb ARM - na symulowanym procesorze uruchamiany jest Linux i platforma Android Naśladuje większość funkcji urządzenia Ograniczenia: połączenia USB i Bluetooth, obsługa słuchawek, symulacja baterii, symulacji stanu połączenia do sieci, realizacji połączeń telefonicznych maf 7
Architektura aplikacji Struktura i elementy koncepcyjne aplikacji Aplikacje są uruchamiane w oddzielnych instancjach Dalvik VM W oddzielnych procesach, w środowisku chronionej pamięci Każdy proces ma własny identyfikator ID i przydzielony priorytet Aplikacja składa się z wielu składników posiadających swój własny cykl życia Odbior. komunik. (broadcast receiver) Aktywność (activity) Usługa (service) Widok (view) Interakcje Dostawca treści (content provider) Intencja (intent) maf 8
Architektura aplikacji Aktywność (activity) Element aplikacji przeznaczona do wykonywania przez użytkownika akcji, czynności Jednostka interfejsu użytkownika - reprezentuje ekran/okno aplikacji (każdy ekran aplikacji jest oddzielną aktywnością) Może zawierać widoki (view) Aktywność wyświetla interfejs użytkownika złożony z widoków Reaguje na zdarzenia Uruchamiana przez intencję lub przez inną aktywność W danym momencie użytkownik może być w interakcji z jedną aktywnością W aplikacji możliwe jest uruchamianie aktywności z innych aplikacji Aktywności są grupowane i przechowywane na stosie Odbior. komunik. (broadcast receiver) Aktywność (activity) Usługa (service) Widok (view) Interakcje Dostawca treści (content provider) Intencja (intent) maf 9
Architektura aplikacji Widok (view) Element interfejsu użytkownika Rysowany obiekt składnik interfejsu Mający kształt etykiety, przycisku, pola edycyjnego, itp. Usługa (service) Proces działający w tle (przez dłuższy czas) Nie posiada interfejsu użytkownika Może być lokalna (w bieżącej aplikacji) lub zdalna (łączy się z innymi aplikacjami) Odbior. komunik. (broadcast receiver) Aktywność (activity) Usługa (service) Widok (view) Interakcje Dostawca treści (content provider) Intencja (intent) maf 10
Architektura aplikacji Odbiornik komunikatów (broadcast receiver) Umożliwia odbieranie komunikatów o zdarzeniach i odpowiadanie na nie (np. niski stan baterii, pobranie danych, połączenie przychodzące, wykonanie zdjęcia itp.) Komunikaty mają formę intencji (intent) i są rozgłaszane przez system lub przez inne aplikacje Nie posiada interfejsu Może tworzyć powiadomienia w pasku stanu Odbior. komunik. (broadcast receiver) Aktywność (activity) Usługa (service) Widok (view) Interakcje Dostawca treści (content provider) Intencja (intent) maf 11
Architektura aplikacji Dostawca treści (content provider): Abstrakcyjne źródło danych (dostawca lub adresat usług REST) Dla: system plików, baza SQLite, sieć Udostępnia źródło danych Zapewnia dostęp do składowanych danych Umożliwia odczyt i zapis danych Umożliwia współdzielenie danych między aplikacjami Odbior. komunik. (broadcast receiver) Aktywność (activity) Usługa (service) Widok (view) Interakcje Dostawca treści (content provider) Intencja (intent) maf 12
Intencja (intent) Architektura aplikacji Abstrakcyjny opis operacji, która ma być wykonana Definiuje możliwość wykonania czynności (np. uruchomianie aktywności, uruchomianie usługi, nadawanie komunikatu itp.) Wykorzystywana przez aplikacje lub przez system do powiadamiana różnych składników aplikacji o zdarzeniach Dla aktywności i usług intencja definiuje akcję do wykonania (VIEW, PICK, EDIT) i mogą specyfikować dane do przetworzenia (w formie URI danych) Dla odbiorników komunikatów definiuje rozgłaszany komunikat Może być jawna lub niejawna Odbior. komunik. (broadcast receiver) Aktywność (activity) Usługa (service) Widok (view) Interakcje Dostawca treści (content provider) Intencja (intent) maf 13
Cykl życia aktywności Cykl życia aplikacji Cykl życia aplikacji związany jest z cyklem życia jego składowych Cyklem życia zarządza system Aktywność zmienia stan w zależności od działań użytkownika (zamykanie okna, przywracanie itp.) Przy zmianie stanu wykonywana jest odpowiednia metoda aktywności Metoda oncreate() onstart() onrestart() onresume() onpause() onstop() Znaczenie Pierwsze utworzenie aktywności: inicjalizacja, tworzenie interfejsu użytkownika. Uruchomienie aktywności. Ponowne uruchomienie aktywności (przywrócenie na pierwszy plan), przejście ze stanu STOPPED do stanu działania. ondestroy() Przejście na pierwszy plan ze stanu PAUSED do stanu działania RESUMED. Wstrzymanie aktywności (w stan PAUSED), gdy inna aktywność przechodzi na pierwszy plan (bieżąca aktywność jest widoczna, ale częściowo zasłonięta). Ostatnia bezpieczna metoda wywoływana przed zamknięciem aplikacji. Aktywność na drugim planie (stan STOPPED, nie już widoczna). Usuwanie i zakończenie działania aktywności. maf 14
Cykl życia aktywności W pierwszej kolejności usuwane są aplikacje o niskim priorytecie, np. usługa działająca w tle ma wyższy priorytet niż aktywność znajdująca się na dnie stosu. Cykl życia aplikacji Użytkownik wywołuje aktywność Inna aplikacja żąda pamięci Inna aktywność przechodzi na pierwszy plan Aktywność przechodzi na pierwszy plan Aktywność nie jest już widoczna Aktywność kończy działanie lub jest zabijana przez system Aktywność przechodzi na pierwszy plan (użytkownik aktywuje ją) maf 15
Cykl życia aplikacji Szkielet aplikacji metody zmiany stanu (callbacks) obiekt zawierający public class PrzykladSzkieletu extends Activity { @Override poprzedni stan public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate);... // aktywność jest tworzona @Override } protected void onpause() { @Override super.onpause(); protected void onstart() { // inna atywność przejmuje fokus super.onstart(); // (ta aktywność będzie pauzowana). // aktywność ma się stać widoczna } } @Override @Override protected void onstop() { protected void onresume() { super.onstop(); super.onresume(); // aktywność jest niewidoczna // aktywność stała się widoczna // (jest zatrzymywana) // (jest wznowiona) } } @Override... protected void ondestroy() { super.ondestroy(); // aktywność będzie usunięta callbacks } } maf 16
Struktura aplikacji Budowa aplikacji Szablon generowany automatycznie po utworzeniu projektu Skład: Nazwa.java kod źródłowy głównej klasy AndroidManifest.xml deskryptor aplikacji Określa zawartość i zachowanie aplikacji Deklaruje składniki aplikacji (aktywności, usługi, dostawców treści, odbiorniki kom.), uprawnienia konieczne do działania aplikacji i wymagania sprzętowe R.java kod klasy R, identyfikatory zasobów main.xml główny plik zasobów Opis i definicja interfejsu (układu graficznego) strings.xml dodatkowe zasoby Struktura katalogów /assest /bin /gen /res /src Dowolne dane (nieskompresowane), nie traktowane jak zasoby Pliki binarne *.class, *.dex, *.apk Pliki generowane (plik R.java) posegregowane na pakiety Zasoby aplikacji Pliki źródłowe *.java posegregowane na pakiety Pliki zasobów maf 17
AndroidManifest.xml Budowa aplikacji W węzłach deklaruje składniki aplikacji, uprawnienia konieczne do działania aplikacji i inne elementy <manifest> główny węzeł pliku Musi zawierać węzeł <application> i pola: - android= przestrzeń_nazw_androida, oraz - package= nazwa_pakietu nazwę pakietu aplikacji <supports-screens> określa wymagane rozmiary ekranu: small, normal, large, extra large i rozdzielczość: low, medium, high, extra high <uses-permission> określa uprawnienia, które muszą być udzielone aplikacji w czasie instalacji Konieczne do prawidłowego działania aplikacji Przykładowe uprawnienia: READ_CONTACTS, WRITE_CONTACTS do odczytu/zapisu listy kontaktów RECEIVE_SMS, SEND_SMS do odbioru i wysyłania wiadomości SMS BLUETOOTH uprawnienie do łączenia się z urządzeniami Bluetooth maf 18
Budowa aplikacji AndroidManifest.xml Węzły (c.d.) <uses-sdk> określa kompatybilność aplikacji z wersjami Android (minimalną wymaganą wersję API i/lub docelową i/lub maksymalną) <uses-feature> określa wymagania sprzętowe np. aparat fotograficzny, Bluetooth itp. <application> deklaruje aplikację, opisuje jej właściwości, zawiera węzły: <activity> deklaruje aktywność <service> deklaruje usługę <receiver> deklaruje odbiornik komunikatów <provider> deklaruje dostawcę treści <uses-library> deklaruje użycie dodatkowych bibliotek Te elementy mogą posiadać własne filtry intencji <intent-filter> precyzujące, które intencje będą obsługiwane maf 19
Budowa aplikacji AndroidManifest.xml - przykład <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.mojpakiet" Nazwa głównego pakietu jest kojarzona android:versioncode="1" z nazwą aktywności i jej klasą: android:versionname="1.0"> org.mojpakiet.jeden <uses-sdk android:minsdkversion="10"/> wersja API (10=Android 2.3) <application android:icon="@drawable/ic_launcher" ikona aplikacji (w zasobach) android:label="@string/app_name"> nazwa aplikacji (w string.xml) <activity deklaracja aktywności android:label="@string/app_name" android:name=".jeden"> Filtr intencji dla aktywności. Definiuje jak <intent-filter > (czym) można aktywować aktywność. <action android:name="android.intent.action.main"/> <category android:name="android.intent.category.launcher"/> </intent-filter> </activity> Określenie aktywności początkowej. Przy uruchamianiu </application> aplikacji odczytywany jest plik manifestu, wyszukiwane są i </manifest> uruchamiane aktywności o akcji MAIN i kategorii LAUNCHER. maf 20
Budowa aplikacji Koncepcja interfejsu użytkownika Podstawowe składniki interfejsu Widok (View) kontrolka Widok kontroluje prostokątny obszar wewnątrz okna Podstawowy element interfejsu użytkownika Ma przypisany unikalny ID Pojemnik (GroupView) Kontener służący do przechowywania innych widoków Układ graficzny (Layout) Layout jest niewidocznym pojemnikiem rozszerzającym klasę ViewGroup Układ graficzny zarządza rozmieszczeniem kontrolek wewnątrz pojemnika Widoki mogą być opisane w plikach XML Okno Domyślnie okno aktywności zajmuje całą powierzchnię ekranu Zawartość jest podporządkowana hierarchii widoku Układy widoków są określany za pomocą obiektów klasy Layout maf 21
Budowa aplikacji Elementy interfejsu widoki maf 22
Układy graficzne Budowa aplikacji Układy graficzne (layout / layout manager) Kontenerowe klasy widoku, pełniące rolę pojemników na widoki Zarządzają rozmiarami, rozmieszczeniem i pozycjonowaniem elementów podrzędnych (kontrolek lub innych układów) Idea podobna jak w Swing maf 23
Budowa aplikacji Tworzenie interfejsu użytkownika Metoda programowa niezalecana Interfejs definiowany bezpośrednio w kodzie źródłowym Java Trudności w wiązaniu i kojarzeniu ze sobą elementów interfejsu Małe zmiany w interfejsie mogą wymagać dużych zmian w kodzie źródłowym Java Metoda deklaracyjna (deklaratywna) zalecana Metoda inspirowana modelem tworzenia aplikacji MVC Interfejs definiowany w oparciu o pliki XML zapisywane w urządzeniu w postaci binarnej Separacja warstwy prezentacji (widoku) od warstwy logiki (kodu) Można zmieniać wygląd i zachowanie aplikacji poprzez edycję plików XML Kompilowane narzędziem AAPT (ang. Android Asset Packaging Tool) Struktura pliku XML ma postać drzewa elementów, w którym każdy węzeł opisuje właściwość elementu interfejsu maf 24
Budowa aplikacji - przykład Klasa główna kod źródłowy Jeden.java metoda programowa niezalecana package org.mojpakiet; import android.app.activity; import android.os.bundle; import android.widget.linearlayout; import android.widget.textview; aktywność początkowa (najwyższego poziomu) metoda wywoływana public class Jeden extends Activity { automatycznie gdy aktywność @Override rozpoczyna działanie public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); LinearLayout mv = new LinearLayout(this); utworzenie układu graficznego TextView tv = new TextView(this); utworzenie widoku TextView tv.settext( Witaj! Tu Jeden. ); i ustawienie napisu mv.addview(tv); dodanie widoku TextView do układu setcontentview(mv); przypisanie układu do okna ekranu - wyświetlenie układu }} maf 25
Budowa aplikacji - przykład Definiowanie widoków i odnośniki w kodzie Java Zdefiniowanie widoku w pliku XML zasobów i przypisanie ID main.xml główny plik zasobów dla głównej aktywności Węzeł w pliku XML opisuje właściwości elementu interfejsu <TextView przestrzeń nazw XML xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv1" kontrolka TextView ma android:layout_width="fill_parent" identyfikator tv1 poprzez który android:layout_height="wrap_content" odwołujemy się do niej w kodzie android:text="@string/hello" /> szerokość i wysokość elementu na ekranie: napis umieszczony w etykiecie tekstowej TextView fill_parent wypełnia ekran identyfikator napisu to hello, wrap_content dostosowana zawartość napisu jest zdefiniowana w pliku strings.xml do zawartości elementu Utworzenie instancji widoku z opisu widoku (typowo w oncreate()) setcontentview(r.layout.id_pliku_zasobów) Odwołanie do widoku: view findviewbyid(r.id.id_widoku) maf 26
Budowa aplikacji - przykład Klasa główna kod źródłowy Jeden.java metoda deklaratywna zalecana package org.mojpakiet; import android.app.activity; import android.os.bundle; import android.widget.textview; public class Jeden extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); } TextView tv = (TextView) findviewbyid(r.id.tv1); } aktywność początkowa (najwyższego poziomu) metoda wywoływana automatycznie gdy aktywność rozpoczyna działanie wczytanie zasobów i wyświetlenie układu zasoby zdefiniowane w main.xml identyfikator widoku tv odwołanie się do kontrolki zdefiniowanej w XML (metoda findviewbyid) maf 27
Budowa aplikacji - przykład Główny plik zasobów main.xml Układ interfejsu zdefiniowany w main.xml jest realizowany w oknie głównej aktywności (tu: Jeden) Węzeł LinearLayout opisuje liniowy układ interfejsu użytkownika <?xml version="1.0" encoding="utf-8"?> standardowy nagłówek XML <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" układ wypełnia ekran android:orientation="vertical" > elementy interfejsu są <TextView rozkładane w poziomie android:id="@+id/tv1" węzły definiują zawartość android:layout_width="fill_parent" i opisują układ dla android:layout_height="wrap_content" elementów wewnątrz android:text="@string/hello" /> </LinearLayout> maf 28
Budowa aplikacji Składnia odnośników do zasobów Odnośnik do zasobu wiąże zasób zdefiniowany w pliku XML z jego identyfikatorem Schemat: Android:id= @[pakiet:][+]typ/identyfikator Np.: @+string/napis @string/napis symbol @ oznacza że parser ma rozwiązywać resztę łańcucha znaków pakiet nazwa pakietu (brak oznacza pakiet lokalny) + opcjonalny, oznacza, że identyfikator zostanie utworzony jeżeli jeszcze nie istnieje (jest to nowy zasób) typ rodzaj zasobu, określany przez przestrzeń nazw R.string, R.layout, R.id, R.drawable lub R.attr klasy wewnętrzne R identyfikator identyfikator zasobu (nazwa) identyfikator jest stałą typu int w pliku R.java maf 29
Budowa aplikacji - przykład Plik zasobów strings.xml Dodatkowy plik zasobów przechowuje napisy w węzłach <string> Właściwość name to identyfikator napisu <?xml version="1.0" encoding="utf-8"?> możliwe formatowanie (Java i HTML) <resources> <string name="hello">witaj! Tu <b><i>jeden</i></b>.</string> <string name="app_name">prog1</string> </resources> napis o identyfikatorze app_name Odnośniki do napisów w Java String s1 = aktywnosc.getstring(r.string.hello); Odnośniki do napisów w plikach XML <Kontrolka android:text="@string/hello" /> np. TextView referencja do obiektu aktywności napis o identyfikatorze hello maf 30
Kasa R plik R.java Budowa aplikacji - przykład Generowana automatycznie klasa R zawiera identyfikatory zasobów aplikacji z katalogu /res Dla każdego rodzaju zasobów tworzona jest klasa wewnętrzna: drawable, layout, string itd. package org.przyklad.prog1; Identyfikatory zasobów mają postać public final class R { stałych typu int. Odpowiadają zasobom, elementom zdefiniowanym public static final class attr w plikach XML, lub plikom. { } public static final class drawable { zasoby graficzne, tu: ikona public static final int ic_launcher = 0x7f020000; ic_launcher.png } public static final class layout { public static final int main = 0x7f030000; } identyfikator pliku main.xml public static final class string { public static final int app_name = 0x7f040001; public static final int hello = 0x7f040000; } } identyfikatory zasobów z pliku strings.xml maf 31
Inne aktywności Analogiczna struktura Budowa aplikacji Nazwa pliku zasobów - dowolna Rodzaje zasobów string - napisy layout układy graficzne color - kolory dimension wymiary image obrazki drawable rysowalne, kolorowe obiekty Własne pliki XML (xml) Własne pliki nieskompresowane (raw) np. pliki video Pliki dodatkowe (tzw. assest) nie są traktowane jak zasoby maf 32
Budowa aplikacji - przykład Aplikacja na emulatorze nazwa aplikacji napis etykiety TextView ekran emulowanego urządzenia Klawisze funkcyjne klawiatura numeryczna maf 33