Architektura systemu. Środowisko programistyczne. Emulator ... SYSTEMU ANDROID APLIKACJE MOBILNE...

Preview:

Citation preview

WSTĘP DO PROGRAMOWANIA APLIKACJI MOBILNYCHDLA SYSTEMU ANDROID

APLIKACJEMOBILNE

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

Architektura systemu APLIKACJEMOBILNE

Opis warstw APLIKACJEMOBILNE

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.) APLIKACJEMOBILNE

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.) APLIKACJEMOBILNE

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.) APLIKACJEMOBILNE

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 APLIKACJEMOBILNE

� 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 APLIKACJEMOBILNE

� 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) APLIKACJEMOBILNE

� 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)

Najważniejsza terminologia (2) APLIKACJEMOBILNE

� 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 APLIKACJEMOBILNE

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ść.

Cykl życia aktywności APLIKACJEMOBILNE

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 APLIKACJEMOBILNE

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 falsew 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 APLIKACJEMOBILNE

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.

Model: dane

Widok: ekrany

Kontroler: sterowanie

Najważniejsza terminologia (3) APLIKACJEMOBILNE

� 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 APLIKACJEMOBILNE

� 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);

Widoki i układy (1) APLIKACJEMOBILNE

� 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 720dplarge – co najmniej 640dp x 480dpnormal – 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) APLIKACJEMOBILNE

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 # dla smartfonówres/layout-sw600dp/main_activity.xml # dla tabletów 7’’res/layout-sw720dp/main_activity.xml # 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) APLIKACJEMOBILNE

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"

/>

AndroidManifest APLIKACJEMOBILNE

� 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 APLIKACJEMOBILNE

<?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:targetS dkVersion="13" /><uses-permission android:name="android.permission.IN TERNET"/><uses-permission android:name="android.permission.AC CESS_NETWORK_STATE"/><uses-permission android:name="android.permission.WR ITE_EXTERNAL_STORAGE" />

<supports-screensandroid:smallScreens="false"android:normalScreens= "false"android:largeScreens="false"android:xlargeScreens="true" />

<applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name">

<activityandroid: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.LAUN CHER" />

</intent-filter></activity>

AndroidManifest – przykład (c.d.) APLIKACJEMOBILNE

<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.Full screen"android:hardwareAccelerated="true"android:screenOrientation="landscape">

</activity>

</application>

</manifest>

Przykład układu ekranu APLIKACJEMOBILNE

� <?xml version="1.0" encoding="utf-8"?>� <LinearLayout� xmlns:android="http://schemas.android.com/apk/res/a ndroid"� 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>

Recommended