Architektura systemu. Środowisko programistyczne. Emulator
Transkrypt
Architektura systemu. Środowisko programistyczne. Emulator
WSTĘP DO PROGRAMOWANIA APLIKACJI MOBILNYCH DLA SYSTEMU ANDROID Architektura systemu. Środowisko programistyczne. Emulator systemu Android. Przegląd podstawowych pojęć. Pierwszy program. Wykorzystane materiały: http://developer.android.com; Conder, Darcey „Programowanie aplikacji na urz. przen.; Wikipedia APLIKACJE MOBILNE Architektura systemu APLIKACJE MOBILNE Opis warstw APLIKACJE MOBILNE Linux Kernel (jądro linuksowe) Android opiera się na wersji jądra 2.6 dla podstawowych usług systemowych, takich jak bezpieczeństwo, zarządzanie pamięcią, zarządzanie procesami, stos sieciowy i model sterownika. Jądro działa również jako warstwa abstrakcji pomiędzy sprzętem i resztą stosu oprogramowania. Android Runtime (środowisko uruchomieniowe) Android zawiera zbiór bibliotek, które dostarczają większość funkcji dostępnych w bibliotekach podstawowych języka Java. Każda aplikacja działa we własnym procesie, z własnej instancji maszyny wirtualnej Dalvik. Dalvik została napisana tak, że na urządzeniu można uruchomić wiele maszyn wirtualnych. Dalvik VM wykonuje pliki wykonywalne (.dex) skonstruowane tak, aby zużywały minimalną ilość pamięci Opis warstw (c.d.) APLIKACJE MOBILNE Libraries (biblioteki) Android zawiera zestaw bibliotek C / C++ używanych przez różne elementy systemu. Możliwości te są udostępnione programistom poprzez Application Framework. Niektóre z głównych bibliotek: System C library - implementacja standardowej systemowej biblioteki C (libc), dostrojona dla urządzeń wbudowanych opartych na Linuksie Media libraries – bazuje na OpenCORE PacketVideo; wsparcie dla odtwarzania i nagrywania wielu popularnych formatów audio i wideo, jak i statycznych plików graficznych, w tym MPEG4, H.264, MP3, AAC, AMR, JPG i PNG Surface manager - zarządza dostępem do podsystemu wyświetlania grafiki 2D i 3D z wielu aplikacji LibWebCore - silnik przeglądarki internetowej, wykorzystywany zarówno w przeglądarce jak i WebView SGL - podstawowy silnik graficzny 2D 3D libraries - realizacja w oparciu o OpenGL ES 1.0 API, biblioteki używają sprzętowej akceleracji 3D (jeśli jest dostępna) lub dołączonego, zoptymalizowanego renderera 3D SQLite - lekki silnik relacyjnych baz danych Opis warstw (c.d.) APLIKACJE MOBILNE Application Framework (framework aplikacji) Deweloperzy mają pełny dostęp do tego samego API, używanego przez aplikacje podstawowe systemu. Architektury aplikacji ma na celu uproszczenie ponownego używania komponentów, każda aplikacja może publikować swój interfejs i każda inna aplikacja może wówczas z niego skorzystać (z zastrzeżeniem ograniczeń bezpieczeństwa). Ten sam mechanizm pozwala na wymianę komponentów przez użytkownika. Framework oferuje zestaw usług i systemów, w tym Bogaty i elastyczny zestaw widoków (Views), które można wykorzystać do budowania aplikacji, w tym list, siatek, pól tekstowych, przycisków, zagnieżdżania przeglądarki internetowej (WebView) Dostawców treści (Content Providers), które pozwalają aplikacjom dostęp do danych z innych aplikacji, (np. takich jak Kontakty), lub dzielić się swoimi danymi Menedżer zasobów (Resource Manager), umożliwiając dostęp do zasobów, takich jak zlokalizowanych treści, grafik, plików układu aplikacji Notification Manager, który umożliwia wszystkim aplikacjom wyświetlanie powiadomień w pasku stanu Activity Manager, który zarządza cyklem życia aplikacji Architektura systemu (c.d.) APLIKACJE MOBILNE Każda aplikacja działa w obrębie własnej maszyny Dalvik (jest odizolowana od innych). Aplikacje są kodem zarządzanym. Każda aplikacja działa jako osobny użytkownik systemu Linux, w osobnym procesie. Każda aplikacja musi uzyskać odpowiednie uprawnienia, aby skorzystać z „czułych” elementów systemu (kontakty, rozmowy, karta SD itp.) albo z danych udostępnianych przez inne aplikacje. Aplikacje muszą być odpowiednio podpisane przy użyciu certyfikatów, aby można je było publikować i instalować. Środowisko programistyczne APLIKACJE MOBILNE Java Platform JDK 6 (JDK 7 nie jest oficjalnie wspierane) http://www.oracle.com/technetwork/java/javase/downloads/ Android SDK http://developer.android.com/sdk Jakieś IDE, np. Eclipse, Netbeans, IntelliJ IDEA, MOTODEV Studio, czasem z odpowiednią wtyczką większość przykładów w sieci jest dostosowana do Eclipse za najwygodniejsze uchodzi MOTODEV Studio ja używam Netbeans z wtyczką nbandroid… http://netbeans.org/, http://www.nbandroid.org/ … i nie narzekam Dodatkowo: Android NDK Szkielet aplikacji Androida APLIKACJE MOBILNE Główne komponenty aplikacji: akcje (actions) – funkcje wykonywane przez aplikacje grupy widoków (views) – definiujące interfejs użytkownika intencje (intents) – informujące system o planach aplikacji usługi (services) – pozwalają na przetwarzanie danych w tle powiadomienia (notifications) – informują użytkownika o wykonaniu jakiegoś zadania czy o zajściu czegoś co użytkownika może zainteresować Aplikacje wchodzą w interakcję z systemem oraz sprzętem przy użyciu kolekcji menedżerów, np. LocationManager (lokalizacja), ViewManager (interfejs użytkownika) Aplikacje mogą prowadzić wzajemne interakcje korzystając z dostawców treści (ContentProvider), bądź same udostępniając swoje dane. Najważniejsza terminologia (1) Aktywność (Activity) Podstawowy składnik aplikacji, realizujący pewne zadanie. Na przykład (aplikacja „e-Doświadczenia w fizyce”): aktywność wyświetlająca ekran początkowy aktywność wyświetlająca informacje aktywność wyświetlająca listę e-doświadczeń aktywność wyświetlająca szczegóły wybranego e-doświadczenia aktywność uruchamiająca e-doświadczenie Zwykle aktywności są skojarzone z pojedynczym ekranem interfejsu użytkownika Reprezentacja: klasa android.app.Activity UWAGA! Nie ma metody main(), za to można daną aktywność oznaczyć jako główną (w pliku manifestu – o tym później) APLIKACJE MOBILNE Najważniejsza terminologia (2) APLIKACJE MOBILNE Kontekst (Context) Centralny punkt aplikacji (obiekt Context), zapewniający dostęp do głównych funkcjonalności, np. do pobierania zasobów, preferencji, żądania usług systemowych, zarządzanie prywatnymi plikami i bazami danych, uruchamiania aktywności itp. Context context = getApplicationContext(); String jakisString = context.getResources().getString(R.string.jakis_string); Uwaga! Klasa Activity dziedziczy po klasie Context, więc czasem można jej używać, zamiast jawnie pobierać obiekt Context. Może to jednak powodować wycieki pamięci! String jakisString = getString(R.string.jakis_string); Generalnie lepiej pobierać „duże” zasoby poprzez kontekst aplikacji (przykład u góry), niewielkie zasoby mogą być pobierane poprzez kontekst aktywności (przykład u dołu). Stos aktywności Aktywności są umieszczane na stosie – tzn. np. gdy aktywność uruchamia inną aktywność, to jest odkładana na stos, a na szczycie stosu pojawia się nowo uruchomiona aktywność. APLIKACJE MOBILNE Cykl życia aktywności APLIKACJE MOBILNE onCreate(Bundle savedInstanceState) – wywoływana przy pierwszym uruchomieniu aktywności. Jej parametr zapewnia odtworzenie stanu aktywności, na wypadek gdyby system skasował ją z pamięci. Umieszczamy w niej wszelkie statyczne elementy aplikacji, np. ładujemy widok, ustawiamy Listenery itp. onResume() – wywoływana, gdy aktywność ponownie stanie się procesem na pierwszym planie, mimo że sam ekran aktywności nie musi jeszcze być wyświetlony. Można w niej np. pobrać i rozpocząć odtwarzanie muzyki czy animacji. Cykl życia aktywności APLIKACJE MOBILNE onPause() – wywoływana w momencie gdy aktywność jest spychana na dalszy plan. W metodzie zatrzymujemy odtwarzanie multimediów, zwalniamy niepotrzebne zasoby, zapisujemy dane (niepotrzebny jest przycisk „Zapisz”). onDestroy() – wywoływana w momencie usuwania aktywności, czyli gdy aktywność została planowo zakończona (finish()), bądź skasowana przez system. Te przypadki można odróżnić za pomocą metody isFinishing(), która zwróci false w tym drugim przypadku. W metodzie niszczymy to, co się da ;), tzn. usuwamy statyczne dane. UWAGA! Metody onDestroy() i onStop() mogą się nigdy nie wykonać, gdy aplikacja zostanie skasowana zaraz po wywołaniu onPause(). Model – Widok – Kontroler APLIKACJE MOBILNE Model: dane Widok: ekrany Kontroler: sterowanie W aplikacjach androidowych nie ma tak wyraźnego rozdzielenia między poszczególne warstwy wzorca MVC jak np. w iOS. Widokiem może być część aktywności ładująca układ ekranu, ale sama jest też kontrolerem. Modelem mogą być wykorzystywane struktury danych, bądź np. baza danych. Najważniejsza terminologia (3) APLIKACJE MOBILNE Intencja (Intent) Asynchroniczne żądanie (realizowane przy pomocy komunikatów) wykonania jakiegoś zadania, np. uruchomienia kolejnej aktywności należącej do aplikacji, uruchomienia przeglądarki WWW/PDF itp. Można je sobie wyobrażać jako komunikat o intencji (chęci) wykonania określonego zadania. Inaczej: służą do kojarzenia żądań wykonania konkretnego zadania z odpowiednimi aktywnościami lub usługami (co może wymagać ich uruchomienia) oraz do rozsyłania zdarzeń po systemie. Przykład: uruchomienie innej aktywności: Intent intent = new Intent(context, JakasAktywnosc.class); startActivity(intent); (wysyłamy intencję uruchomienia nowej aktywności, zakładamy wcześniejsze pobranie obiektu Context). Można też napisać: startActivity(new Intent(getApplicationContext(), JakasAktywnosc.class)); Intencje – przykłady Uruchomienie marketu z daną aplikacją: Uri marketUri = Uri.parse(„http://market.android.com/details?id=com.adobe.flashplayer”); // Można też tak (bezposrednio do marketu): // Uri marketUri = Uri.parse("market://details?id=com.adobe.flashplayer"); // ... ale np. emulator nie rozpoznaje protokulu "market„ Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri); Uruchomienie dialera: Uri number = Uri.parse(tel:123456789); Intent intent = new Intent(Intent.ACTION_DIAL, number); startActivity(intent); APLIKACJE MOBILNE Widoki i układy (1) APLIKACJE MOBILNE Układy (Layouts) i Widoki (Views) – tworzą układy zawartości ekranu Statyczne układy i widoki umieszczamy w katalogu /res/layout projektu Dla różnych rozmiarów ekranu: xlarge – co najmniej 960dp x 720dp large – co najmniej 640dp x 480dp normal – co najmniej 470dp x 320dp (tzw. baseline) small – co najmniej 426dp x 320dp tworzymy osobne układy, umieszczane np, w katalogu /res/layout-xlarge UWAGA! – patrz kolejny slajd Widoki i układy (2) APLIKACJE MOBILNE Od wersji 14 (Android 3.2 i nowsze), zalecane są nowe kwalifikatory: sw<N>dp – minimalna wymagana szerokość ekranu (smallestWidth), np. sw720dp (niezależnie od orientacji ekranu!) czyli na przykład: res/layout/main_activity.xml res/layout-sw600dp/main_activity.xml res/layout-sw720dp/main_activity.xml # dla smartfonów # dla tabletów 7’’ # dla tabletów 10’’ Pozostałe kwalifikatory: w<N>dp – dostępna szerokość ekranu, np. w720dp, w1024dp h<N>dp – dostępna wysokość ekranu, np. h720dp, h1024dp Widoki i układy (3) Dopuszczalne rozmiary ekranów należy zapisać w pliku AndroidManifest.xml, np. <manifest ... > <supports-screens android:requiresSmallestWidthDp="600" /> ... </manifest> albo (w starszych wersjach) <supports-screens android:smallScreens="false" android:normalScreens= "false" android:largeScreens="false" android:xlargeScreens="true" /> APLIKACJE MOBILNE AndroidManifest APLIKACJE MOBILNE Specjalny plik konfiguracyjny, określający nazwę aplikacji, jej ikonę, numer wersji, akceptowane wersje SDK, dopuszczalne konfiguracje sprzętowe, uprawnienia aplikacji, zestawienie aktywności i ich właściwości, filtry intencji itp. Umieszczany w katalogu głównym projektu AndroidManifest – przykład <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pl.gda.pg.mif.edoswiadczenia" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="13" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <supports-screens android:smallScreens="false" android:normalScreens= "false" android:largeScreens="false" android:xlargeScreens="true" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".StronaTytulowa" android:label="@string/app_name" android:screenOrientation="landscape" android:configChanges="locale"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> APLIKACJE MOBILNE AndroidManifest – przykład (c.d.) <activity android:name=".Info" android:screenOrientation="landscape"> </activity> <activity android:name=".ListaED" android:screenOrientation="landscape"> </activity> <activity android:name=".SzczegolyED" android:screenOrientation="landscape"> </activity> <activity android:name=".UruchomED" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:hardwareAccelerated="true" android:screenOrientation="landscape"> </activity> </application> </manifest> APLIKACJE MOBILNE Przykład układu ekranu <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=„jakiś tekst" android:textSize="12pt" /> <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Zakończ"/> </LinearLayout> APLIKACJE MOBILNE