Programowanie Urządzeń Mobilnych Część II: Android Wykład 2 1
Aplikacje w systemie Android Aplikacje tworzone są w języku Java: Skompilowane pliki programów ( dex ) wraz z plikami danych umieszczane w pliku apk (Android Package), który można przesłać do urządzenia w celu instalacji. Aplikacje uruchamiane są we własnym środowisku: Domyślnie każda aplikacja jest oddzielnym użytkownikiem (otrzymuje unikalny UID) od systemu. System ustawia uprawnienia do wszystkich plików aplikacji, aby wyłącznie aplikacja miała do nich dostęp. Każda aplikacja jest uruchamiana we własnej maszynie wirtualnej. Domyślnie każda aplikacja jest uruchamiana w oddzielnym procesie Linuksowym. 2
Dzielenie zasobów Istnieje możliwość współdzielenia danych pomiędzy aplikacjami, jak również do korzystania przez aplikację z zasobów systemowych: Dwie aplikacje mogą współdzielić pliki, gdy posiadają nadany ten sam Linuksowy identyfikator użytkownika (UID). Dzięki dzieleniu tego samego UID można również spowodować, aby obie aplikacje były uruchamiane w tym samym procesie i dzieliły jedną maszynę wirtualną. Aplikacja może żądać zezwolenia do uzyskania dostępu do zasobów urządzenia (kontakty, SMS-y, pamięć masowa, kamera, interfejsu Bluetooth itp.) Zezwolenie musi zostać udzielone przez użytkownika w trakcie instalacji. 3
Komponenty aplikacji Komponenty stanowią składowe aplikacji. Każdy komponent stanowi punkt, poprzez który system steruje aplikacją. Pozwalają na określenie ogólnego zachowania aplikacji. Nie wszystkie komponenty są właściwymi punktami wejścia i niektóre komponenty powiązane są ze sobą (są od siebie zależne). Istnieją cztery rodzaje komponentów aplikacji. Każdy z nich służy do konkretnego celu i ma wyznaczony czas życia, który określa jak komponent jest tworzony i niszczony. Komponentami są: Activities (czynności), Services (usługi), Content providers (dostawcy zawartości), Broadcast receivers (odbiorcy rozgłoszeń). 4
Activity (czynność) Activity (czynność) reprezentuje pojedynczy ekran zawierający interfejs użytkownika. Przykłady (na podstawie aplikacji klienta poczty): czynność pokazująca listę nowych wiadomości e-mail, czynność pozwalająca na tworzenie wiadomości e-mail, czynność przedstawiająca treść odczytanej wiadomości. Każda z czynności jest niezależna w działaniu, chociaż tworzą spójny interfejs użytkownika. Inne aplikacje (w miarę posiadanych uprawnień) może uruchomić czynność innej aplikacji (np. aplikacja kamery może po wykonaniu zdjęcia uruchomić czynność aplikacji klienta poczty, aby wysłać zrobione zdjęcie). Czynność jest implementowana jako podklasa klasy Activity. 5
Service (usługa) Service (usługa) jest komponentem pracującym w tle, którego zadaniem jest wykonywanie długoterminowych operacji lub operacji dla zdalnych procesów. Przykłady: odtwarzanie muzyki w tle (użytkownik może w tym czasie pracować z inną aplikacją), pobieranie danych w tle (dane mogą być pobierane bez blokowania interakcji użytkownika z aplikacją). Usługa nie zapewnia interfejsu użytkownika. Inne komponenty (np. Activity) mogą uruchamiać usługi (startservice) lub wiązać się z nimi (bindservice). Usługa uruchomiona pracuje bez końca, powiązana kończy się, gdy znikną wszystkie powiązania. Usługa jest implementowana jako podklasa klasy Service. 6
Content provider (dostawca zawartości) Content provider (dostawca zawartości) zarządza zbiorami danych aplikacji. Dane mogą być przechowywane w plikach (systemie plików), bazie danych SQLite, w sieci web lub innym miejscu dostępnym dla aplikacji. Dzięki dostawcy inne aplikacje mogą uzyskiwać dane lub je modyfikować (jeżeli dostawca im na to pozwoli). Na przykład książka adresowa jest dostępna przez dostawcę zawartości. Aplikacje posiadające uprawnienia mogą odpytywać dostawcę i uzyskiwać informacje o wpisach w książce. Dostawca zawartości nie musi być publiczny i można go wykorzystywać do zarządzania danymi prywatnymi. Dostawca zawartości jest implementowany jako podklasa klasy ContentProvider. 7
Broadcast receiver (odbiorca rozgłoszeń) Broadcast receiver (odbiorca rozgłoszeń) służy do odbierania komunikatów rozgłoszeniowych. Źródłem komunikatów rozgłoszeniowych może być system (np. wyłączenie ekranu, niski poziom naładowania baterii) lub aplikacja (np. pobranie danych z sieci). Odbiorca rozgłoszeń nie wyświetla interfejsu użytkownika, może jednak tworzyć powiadomienia na pasku stanu. Odbiorca rozgłoszeń jest implementowany jako podklasa klasy BroadcastReceiver. 8
Uruchamianie komponentów Trzy typy komponentów (czynności, usługi i odbiorcy rozgłoszeń) tworzone są za pomocą asynchronicznego komunikatu nazywanego intencją (intent). Uruchomienie komponentów poszczególnych typów następuje poprzez: Czynność za pomocą startactivity() lub startactivityforresult(), Usługa za pomocą startservice() (lub jeżeli chcemy powiązać się z usługą za pomocą bindservice()), Rozgłoszenie za pomocą sendbroadcast(), sendorderedbroadcast() lub sendstickybroadcast(), Dostawca zawartości można go odpytywać za pomocą metody query() na obiekcie ContentResolver. W każdym przypadku konieczne jest utworzenie intencji (obiektu klasy Intent), która będzie zawierała dane przekazywane uruchamianemu komponentowi. 9
Intent (intencja) Intencja wiąże jeden komponent z innym niezależnie czy drugi komponent należy do uruchamiającej aplikacji, czy innej. Intencja jest obiektem klasy Intent, która określa komunikaty niezbędne do uruchomienia komponentu. Intencja opisuje następujące cechy: akcja (action) ogólna akcja, która ma być wykonana, np. ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, itd., dane (data) dane, które mają być przekazane komponentowi, określające np. osobę z książki adresowej, kategoria (category) dodatkowe informacje, typ (type) typ MIME danych, komponent (component) jawne określenie komponentu (domyślnie system sam określa na podstawie danych), dodatki (extras) dodatkowe elementy zapisane w obiekcie klasy Bundle. 10
Manifest Plik AndroidManifest.xml zawiera informacje o aplikacji, jak: definicje komponentów, które mogą być tworzone przez system, pozwolenia, jakie mają być uzyskane od użytkownika (np. dostęp do kontaktów, Internetu itp.), deklaracje minimalnego poziomu API wymaganego przez aplikację, deklaracje zasobów sprzętowych i programowych wymaganych przez aplikację, biblioteki, które mają być dołączone (poza bibliotekami Android API), np. biblioteka Google Maps. 11
Dziękuję za uwagę :) 12