ANDROID podstawy architektury (od strony...

18
ANDROID podstawy architektury (od strony programisty) Android jest stosem oprogramowania open-source opartego na systemie Linux, stworzonym dla wielu urządzeń. Poniższy schemat przedstawia główne składniki platformy Android.

Transcript of ANDROID podstawy architektury (od strony...

Page 1: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

ANDROID ndash podstawy architektury (od strony programisty)

Android jest stosem oprogramowania open-source opartego na systemie Linux

stworzonym dla wielu urządzeń Poniższy schemat przedstawia głoacutewne składniki

platformy Android

Kernela Linuksa

Podstawą platformy Android jest jądro Linuksa Na przykład Runtime Android (ART) opiera się na jądrze Linuksa w podstawowych funkcjach takich jak zarządzanie wątkami i zarządzanie pamięcią na niskim poziomie

Warstwa abstrakcji sprzętu (HAL)

Warstwa abstrakcji sprzętowej (Hardware Abstarction Layer) udostępnia standardowe interfejsy ktoacutere mapują możliwości urządzeń sprzętowych na wyższy poziom interfejsu Java API HAL składa się z wielu modułoacutew biblioteki z ktoacuterych każdy implementuje interfejs dla określonego typu składnika sprzętowego takiego jak moduł aparatu fotograficznego lub bluetooth Gdy framework API wywołuje wywołanie dostępu do sprzętu sprzętowego system Android załaduje moduł biblioteki dla tego komponentu sprzętowego

Android Runtime

W przypadku urządzeń z Androidem w wersji 50 (poziom API 21) lub wyższych każda aplikacja działa w swoim własnym procesie i zawiera własny stos Android Runtime (ART) ART jest napisany aby uruchomić wiele wirtualnych maszyn na urządzeniach o małej pamięci wykonując pliki DEX format bajtowy zaprojektowany specjalnie dla Androida zoptymalizowany pod kątem wykorzystania pamięci

Niektoacutere z głoacutewnych cech techniki ART obejmują

Kompilację w czasie rzeczywistym (AOT) i just-in-time (JIT)

Zoptymalizowanego garbage collector-a (GC)

Lepszą obsługa debugowania w tym dedykowany profiler proacutebkowania szczegoacutełowe wyjątki diagnostyczne i raportowanie awarii oraz możliwość ustawiania punktoacutew obserwacyjnych w celu monitorowania określonych dziedzin

Przed wersją Androida 50 (poziom API 21) maszyną runtime Androida był Dalvik Jeśli aplikacja działa dobrze na ART to roacutewnież powinna działać na Dalviku ale odwrotne może nie musi to prawdą

Android zawiera także zestaw podstawowych bibliotek wykonawczych ktoacutere zapewniają większość funkcjonalności języka programowania Java w tym niektoacutere funkcje języka Java 8 używane przez framework Java API

Natywne biblioteki C C ++

Wiele podstawowych elementoacutew i usług systemu Android takich jak ART i HAL zbudowane jest z kodu macierzystego ktoacutery wymaga bibliotek natywnych napisanych w języku C i C ++ Platforma Android udostępnia interfejsy Java framework umożliwiając aplikacjom działanie niektoacuterych z tych rodzimych bibliotek Na przykład można uzyskać dostęp do OpenGL ES za pośrednictwem interfejsu Java OpenGL API w systemie Android aby dodać obsługę do rysowania i manipulacji grafiką 2D i 3D w swojej aplikacji

Aplikacja ktoacutera wymaga kodu C lub C ++ może skorzystać z Android NDK aby uzyskać dostęp do niektoacuterych z tych rodzimych bibliotek platformy bezpośrednio z własnego kodu źroacutedłowego

Java Framework API

Cały zestaw funkcji systemu operacyjnego Android jest dostępny dla użytkownikoacutew za pośrednictwem interfejsoacutew API napisanych w języku Java Te interfejsy API tworzą bloki potrzebne do tworzenia aplikacji na Androida upraszczając ponowne wykorzystanie podstawowych modułowych komponentoacutew systemu i usług ktoacutere obejmują

Bogaty i rozbudowany system widokoacutew ktoacuterego można używać do tworzenia interfejsu aplikacji w tym list sieci poacutel tekstowych przyciskoacutew a nawet wbudowanej przeglądarki internetowej

Menedzer zasoboacutew (Resource Manager ) zapewniając dostęp do zasoboacutew bez kodu takich jak zlokalizowanych ciągoacutew grafiki i plikoacutew układu

Menedżer powiadomień ktoacutery pozwala na wszystkie aplikacje do wyświetlania powiadomień niestandardowych w pasku stanu

Menedżer aktywności (Activity Manager) ktoacutery zarządza cyklem życia aplikacji i zapewnia wspoacutelny system nawigacji (w tym wstecz)

Dostawcoacutew treści (Content Managers) ktoacutere umożliwiają aplikacjom dostęp do danych z innych aplikacji takich jak aplikacja Kontakty lub udostępnianie własnych danych

Deweloperzy mają pełny dostęp do tych samych frameworkoacutew API z ktoacuterych korzystają aplikacje systemu Android

Aplikacje systemowe

Aplikacje na Androida są tworzone w języku programowania Java Narzędzia Android

SDK kompilują kod wraz z wszelkimi plikami danych i zasoboacutew w archiwum APK

z Androidem ktoacutery jest plikiem archiwalnym z przyrostkiem apk Jeden plik APK

zawiera całą zawartość aplikacji na Androida i jest plikiem w ktoacuterym zainstalowano

aplikację z urządzeniami z Androidem

Każda aplikacja na Androida znajduje się w osobnej bdquopiaskownicyrdquo (sandbox)

zabezpieczona następującymi funkcjami zabezpieczeń dla Androida

System operacyjny Android jest wieloużytkownikowym systemem Linux w

ktoacuterym każda aplikacja jest innym użytkownikiem

Domyślnie system przypisuje każdej aplikację unikatowy identyfikator

użytkownika systemu Linux (identyfikator jest używany tylko przez system i jest

nieznany aplikacji) System ustawia uprawnienia dla wszystkich plikoacutew w

aplikacji dzięki czemu dostęp do nich może mieć tylko identyfikator

użytkownika przypisany do tej aplikacji

Każdy proces ma własną maszynę wirtualną (VM) więc kod aplikacji działa w

oderwaniu od innych aplikacji

Domyślnie każda aplikacja działa w swoim własnym systemie Linux System

Android uruchamia ten proces gdy ktoacuterykolwiek z elementoacutew aplikacji musi być

wykonany a następnie zamknąć proces gdy nie jest już potrzebny lub gdy

system musi odzyskać pamięć dla innych aplikacji

System Android realizuje zasadę najmniejszego przywileju Oznacza to że każda

aplikacja domyślnie ma dostęp tylko do komponentoacutew ktoacutere wymaga jego pracy i nie

więcej Tworzy to bardzo bezpieczne środowisko w ktoacuterym aplikacja nie może

uzyskać dostępu do części systemu dla ktoacuterych nie ma uprawnień Istnieją jednak

sposoby udostępniania danych przez aplikację innym aplikacjom a aplikacja ma

dostęp do usług systemowych

Możliwe jest skonfigurowanie dwoacutech aplikacji do udostępniania tego samego

identyfikatora użytkownika systemu Linux w ktoacuterym to przypadku mają dostęp

do plikoacutew innych osoacuteb Aby zachować zasoby systemu aplikacje z tym samym

identyfikatorem użytkownika mogą roacutewnież zorganizować działanie w tym

samym procesie w systemie Linux i udostępniać tę samą maszynę Aplikacje

muszą być roacutewnież podpisane z tym samym certyfikatem

Aplikacja może żądać uprawnień dostępu do danych urządzenia takich jak

kontakty użytkownika wiadomości SMS zamontowany dysk (karta SD) aparat

i Bluetooth Użytkownik musi wyraźnie przyznać te uprawnienia

Komponenty aplikacji

Komponenty aplikacji są podstawowymi bdquoklockamirdquo do zbudowania aplikacji na

Androida Każdy element to punkt wejścia przez ktoacutery system lub użytkownik może

wejść do aplikacji Niektoacutere składniki zależą od innych

Istnieją cztery roacuteżne typy elementoacutew aplikacji

Aktywności (activities)

Usługi (services)

Odbiorniki nadawcze (Broadcast receivers)

Dostawcy treści (Context managers)

Każdy typ ma swoacutej odrębny cel i ma inny cykl życia ktoacutery definiuje sposoacuteb tworzenia i

niszczenia składnika

Aktywności

Aktywność jest punktem wyjścia do interakcji z użytkownikiem Reprezentuje

pojedynczy ekran (nie widok ) z interfejsem użytkownika Na przykład aplikacja

poczty e-mail może zawierać jedną aktywność ktoacutera wyświetla listę nowych e-maili

inną aktywność w celu utworzenia wiadomości e-mail oraz inną aktywność czytania e-

maili Chociaż działania łączą się w celu stworzenia spoacutejnego doświadczenia

użytkownikoacutew w aplikacji poczty e-mail każda jest niezależna od innych W takim

przypadku inna aplikacja może rozpocząć dowolną z tych czynności jeśli aplikacja e-

mail ją zezwala Na przykład aplikacja aparatu może rozpocząć działanie w aplikacji

poczty e-mail ktoacutera tworzy nową pocztę aby umożliwić użytkownikowi udostępnianie

zdjęć Działanie ułatwiają następujące kluczowe interakcje między systemem a

aplikacją

Śledzenie tego na co użytkownik obecnie zwraca uwagę na ekranie aby

zapewnić że system nadal działa w procesie ktoacutery prowadzi działalność

Wiedząc że wcześniej stosowane procesy zawierają rzeczy do ktoacuterych

użytkownik może powroacutecić (przerwane czynności) a tym samym bardziej

wysoce priorytetowo traktować te procesy

Zapewnienie aplikacji do implementowania przepływoacutew między sobą a także

do koordynowania tych przepływoacutew

Aktywności są potomnymi klasy Activity

Usługi

Serwis (Service) jest to usłaga działająca w tle z roacuteżnych przyczyn Jest to składnik

ktoacutery działa w tle aby wykonać długotrwałe operacje lub wykonać pracę dla zdalnych

procesoacutew Usługa nie udostępnia interfejsu użytkownika Na przykład usługa może

odtwarzać muzykę w tle gdy użytkownik znajduje się w innej aplikacji lub może

pobierać dane przez sieć bez blokowania interakcji użytkownika z aktywnością Inny

składnik na przykład aktywność może uruchomić usługę i pozwolić jej uruchomić lub

związać się z nią aby z nią wspoacutełpracować Istnieją dwa rodzaje usług

Odtwarzanie muzyki jest czymś co użytkownik jest bezpośrednio świadomy

więc aplikacja moacutewi systemowi moacutewiąc że chce być pierwszym planie z

powiadomieniem aby poinformować o tym użytkownika w tym przypadku

system wie że powinien sproacutebować naprawdę ciężko aby uruchomić ten

proces ponieważ użytkownik będzie niezadowolony jeśli zniknie

Regularna usługa tła nie jest czymś co użytkownik jest świadomy że działa

więc system ma większą swobodę w zarządzaniu jego procesem Może to

pozwolić na jego zabicie (a następnie ponowne uruchomienie usługi w

poacuteźniejszym czasie) jeśli potrzebuje pamięci RAM w sprawach ktoacutere mają dla

niego bezpośrednią troskę

Ograniczone usługi działają ponieważ inna aplikacja (lub system) zakomunikowała

że chce skorzystać z tej usługi Jest to zasadniczo usługa dostarczająca interfejs API

do innego procesu System wie więc że istnieje zależność między tymi procesami

więc jeśli proces A jest związany z usługą w procesie B wie że musi zachować proces

B (i jego usługa) działający dla A Ze względu na swoją elastyczność (na lepsze lub

gorsze) usługi okazały się użytecznymi elementami budowania systemoacutew złożonych

wyższego poziomu

Usługa jest implementowana jako pochodna klasy Service

Uwaga jeśli aplikacja jest przeznaczona na Android 50 (poziom API 21) lub nowszy

należy użyc klasy JobScheduler do zaplanowania działań JobScheduler ma tę zaletę

że oszczędza baterię optymalizując harmonogram zadań aby zmniejszyć zużycie

energii

Odbiorniki nadawcze

Odbiornik transmisji to składnik ktoacutery umożliwia systemowi dostarczanie zdarzeń do

aplikacji poza regularnym przepływem użytkownikoacutew co umożliwia aplikacjom

reagowanie na ogoacutelnodostępne komunikaty

Odbiornik nadawczy jest implementowany jako pochodna BroadcastReceiver

Dostawcy treści

Dostawca treści zarządza wspoacutelnym zestawem danych aplikacji ktoacutere można zapisać

w systemie plikoacutew w bazie danych SQLite w internecie lub na dowolnym innym

vmiejscu przechowywania uporczywego że aplikacja ma dostęp Za pośrednictwem

dostawcy treści inne aplikacje mogą wyszukiwać lub modyfikować dane jeśli dostawca

treści dopuszcza Na przykład system Android udostępnia dostawcom treści ktoacutery

zarządza informacjami kontaktowymi użytkownika

Dostawca treści jest implementowany jako pochodna ContentProvider i musi

implementować standardowy zestaw interfejsoacutew API ktoacutere umożliwiają innym

aplikacjom przeprowadzanie transakcji

Zasady wspoacutełpracy komponentoacutew (intencje)

Unikalnym aspektem projektu systemu Android jest to że każda aplikacja może

uruchomić składnik innej aplikacji Jeśli na przykład użytkownik chce zrobić zdjęcie z

aparatem fotograficznym prawdopodobnie jest to że istnieje aplikacja ktoacutera to robi a

nasza aplikacja może ją używać zamiast pracować nad własną implementacją Nie

trzeba wstawiać ani nawet łączyć się z kodem z aplikacji aparatu Zamiast tego można

po prostu rozpocząć aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie Po

zakończeniu zdjęcie jest nawet zwracane do wywołującej aplikacji dzięki czemu

można go dalej przetwarzać Dla użytkownika wydaje się że aparat jest częścią

aplikacji

Gdy system inicjuje składnik rozpoczyna proces dla tej aplikacji jeśli nie jest jeszcze

uruchomiony i tworzy instancje potrzebne do kompilacji Jeśli na przykład aplikacja

rozpoczyna aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie ta aktywność

działa w procesie należącym do aplikacji aparatu a nie w jego aplikacji Dlatego w

przeciwieństwie do aplikacji na większości innych systemoacutew aplikacje na Androida nie

mają jednego punktu dostępu (nie ma żadnej funkcji main())

Ponieważ system uruchamia każdą aplikację w osobnym procesie z uprawnieniami do

plikoacutew ktoacutere ograniczają dostęp do innych aplikacji aplikacja nie może bezpośrednio

aktywować składnika z innej aplikacji Jednak system Android może utworzyć

intencję Aby uaktywnić składnik innej aplikacji wysyłana jest wiadomość do systemu

określającego zamiar rozpoczęcia danego składnika Następnie system aktywuje

komponent

Aktywowanie komponentoacutew

Trzy z czterech typoacutew komponentoacutew - aktywności usługi i odbiorniki - są uruchamiane

przez asynchroniczną wiadomość o intencji Intencje wiążą poszczegoacutelne

komponenty ze sobą podczas pracy Można myśleć o nich jako o posłankach ktoacuterzy

zażądają działania od innych składnikoacutew niezależnie od tego czy składnik należy do

tej aplikacji czy innej

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 2: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Kernela Linuksa

Podstawą platformy Android jest jądro Linuksa Na przykład Runtime Android (ART) opiera się na jądrze Linuksa w podstawowych funkcjach takich jak zarządzanie wątkami i zarządzanie pamięcią na niskim poziomie

Warstwa abstrakcji sprzętu (HAL)

Warstwa abstrakcji sprzętowej (Hardware Abstarction Layer) udostępnia standardowe interfejsy ktoacutere mapują możliwości urządzeń sprzętowych na wyższy poziom interfejsu Java API HAL składa się z wielu modułoacutew biblioteki z ktoacuterych każdy implementuje interfejs dla określonego typu składnika sprzętowego takiego jak moduł aparatu fotograficznego lub bluetooth Gdy framework API wywołuje wywołanie dostępu do sprzętu sprzętowego system Android załaduje moduł biblioteki dla tego komponentu sprzętowego

Android Runtime

W przypadku urządzeń z Androidem w wersji 50 (poziom API 21) lub wyższych każda aplikacja działa w swoim własnym procesie i zawiera własny stos Android Runtime (ART) ART jest napisany aby uruchomić wiele wirtualnych maszyn na urządzeniach o małej pamięci wykonując pliki DEX format bajtowy zaprojektowany specjalnie dla Androida zoptymalizowany pod kątem wykorzystania pamięci

Niektoacutere z głoacutewnych cech techniki ART obejmują

Kompilację w czasie rzeczywistym (AOT) i just-in-time (JIT)

Zoptymalizowanego garbage collector-a (GC)

Lepszą obsługa debugowania w tym dedykowany profiler proacutebkowania szczegoacutełowe wyjątki diagnostyczne i raportowanie awarii oraz możliwość ustawiania punktoacutew obserwacyjnych w celu monitorowania określonych dziedzin

Przed wersją Androida 50 (poziom API 21) maszyną runtime Androida był Dalvik Jeśli aplikacja działa dobrze na ART to roacutewnież powinna działać na Dalviku ale odwrotne może nie musi to prawdą

Android zawiera także zestaw podstawowych bibliotek wykonawczych ktoacutere zapewniają większość funkcjonalności języka programowania Java w tym niektoacutere funkcje języka Java 8 używane przez framework Java API

Natywne biblioteki C C ++

Wiele podstawowych elementoacutew i usług systemu Android takich jak ART i HAL zbudowane jest z kodu macierzystego ktoacutery wymaga bibliotek natywnych napisanych w języku C i C ++ Platforma Android udostępnia interfejsy Java framework umożliwiając aplikacjom działanie niektoacuterych z tych rodzimych bibliotek Na przykład można uzyskać dostęp do OpenGL ES za pośrednictwem interfejsu Java OpenGL API w systemie Android aby dodać obsługę do rysowania i manipulacji grafiką 2D i 3D w swojej aplikacji

Aplikacja ktoacutera wymaga kodu C lub C ++ może skorzystać z Android NDK aby uzyskać dostęp do niektoacuterych z tych rodzimych bibliotek platformy bezpośrednio z własnego kodu źroacutedłowego

Java Framework API

Cały zestaw funkcji systemu operacyjnego Android jest dostępny dla użytkownikoacutew za pośrednictwem interfejsoacutew API napisanych w języku Java Te interfejsy API tworzą bloki potrzebne do tworzenia aplikacji na Androida upraszczając ponowne wykorzystanie podstawowych modułowych komponentoacutew systemu i usług ktoacutere obejmują

Bogaty i rozbudowany system widokoacutew ktoacuterego można używać do tworzenia interfejsu aplikacji w tym list sieci poacutel tekstowych przyciskoacutew a nawet wbudowanej przeglądarki internetowej

Menedzer zasoboacutew (Resource Manager ) zapewniając dostęp do zasoboacutew bez kodu takich jak zlokalizowanych ciągoacutew grafiki i plikoacutew układu

Menedżer powiadomień ktoacutery pozwala na wszystkie aplikacje do wyświetlania powiadomień niestandardowych w pasku stanu

Menedżer aktywności (Activity Manager) ktoacutery zarządza cyklem życia aplikacji i zapewnia wspoacutelny system nawigacji (w tym wstecz)

Dostawcoacutew treści (Content Managers) ktoacutere umożliwiają aplikacjom dostęp do danych z innych aplikacji takich jak aplikacja Kontakty lub udostępnianie własnych danych

Deweloperzy mają pełny dostęp do tych samych frameworkoacutew API z ktoacuterych korzystają aplikacje systemu Android

Aplikacje systemowe

Aplikacje na Androida są tworzone w języku programowania Java Narzędzia Android

SDK kompilują kod wraz z wszelkimi plikami danych i zasoboacutew w archiwum APK

z Androidem ktoacutery jest plikiem archiwalnym z przyrostkiem apk Jeden plik APK

zawiera całą zawartość aplikacji na Androida i jest plikiem w ktoacuterym zainstalowano

aplikację z urządzeniami z Androidem

Każda aplikacja na Androida znajduje się w osobnej bdquopiaskownicyrdquo (sandbox)

zabezpieczona następującymi funkcjami zabezpieczeń dla Androida

System operacyjny Android jest wieloużytkownikowym systemem Linux w

ktoacuterym każda aplikacja jest innym użytkownikiem

Domyślnie system przypisuje każdej aplikację unikatowy identyfikator

użytkownika systemu Linux (identyfikator jest używany tylko przez system i jest

nieznany aplikacji) System ustawia uprawnienia dla wszystkich plikoacutew w

aplikacji dzięki czemu dostęp do nich może mieć tylko identyfikator

użytkownika przypisany do tej aplikacji

Każdy proces ma własną maszynę wirtualną (VM) więc kod aplikacji działa w

oderwaniu od innych aplikacji

Domyślnie każda aplikacja działa w swoim własnym systemie Linux System

Android uruchamia ten proces gdy ktoacuterykolwiek z elementoacutew aplikacji musi być

wykonany a następnie zamknąć proces gdy nie jest już potrzebny lub gdy

system musi odzyskać pamięć dla innych aplikacji

System Android realizuje zasadę najmniejszego przywileju Oznacza to że każda

aplikacja domyślnie ma dostęp tylko do komponentoacutew ktoacutere wymaga jego pracy i nie

więcej Tworzy to bardzo bezpieczne środowisko w ktoacuterym aplikacja nie może

uzyskać dostępu do części systemu dla ktoacuterych nie ma uprawnień Istnieją jednak

sposoby udostępniania danych przez aplikację innym aplikacjom a aplikacja ma

dostęp do usług systemowych

Możliwe jest skonfigurowanie dwoacutech aplikacji do udostępniania tego samego

identyfikatora użytkownika systemu Linux w ktoacuterym to przypadku mają dostęp

do plikoacutew innych osoacuteb Aby zachować zasoby systemu aplikacje z tym samym

identyfikatorem użytkownika mogą roacutewnież zorganizować działanie w tym

samym procesie w systemie Linux i udostępniać tę samą maszynę Aplikacje

muszą być roacutewnież podpisane z tym samym certyfikatem

Aplikacja może żądać uprawnień dostępu do danych urządzenia takich jak

kontakty użytkownika wiadomości SMS zamontowany dysk (karta SD) aparat

i Bluetooth Użytkownik musi wyraźnie przyznać te uprawnienia

Komponenty aplikacji

Komponenty aplikacji są podstawowymi bdquoklockamirdquo do zbudowania aplikacji na

Androida Każdy element to punkt wejścia przez ktoacutery system lub użytkownik może

wejść do aplikacji Niektoacutere składniki zależą od innych

Istnieją cztery roacuteżne typy elementoacutew aplikacji

Aktywności (activities)

Usługi (services)

Odbiorniki nadawcze (Broadcast receivers)

Dostawcy treści (Context managers)

Każdy typ ma swoacutej odrębny cel i ma inny cykl życia ktoacutery definiuje sposoacuteb tworzenia i

niszczenia składnika

Aktywności

Aktywność jest punktem wyjścia do interakcji z użytkownikiem Reprezentuje

pojedynczy ekran (nie widok ) z interfejsem użytkownika Na przykład aplikacja

poczty e-mail może zawierać jedną aktywność ktoacutera wyświetla listę nowych e-maili

inną aktywność w celu utworzenia wiadomości e-mail oraz inną aktywność czytania e-

maili Chociaż działania łączą się w celu stworzenia spoacutejnego doświadczenia

użytkownikoacutew w aplikacji poczty e-mail każda jest niezależna od innych W takim

przypadku inna aplikacja może rozpocząć dowolną z tych czynności jeśli aplikacja e-

mail ją zezwala Na przykład aplikacja aparatu może rozpocząć działanie w aplikacji

poczty e-mail ktoacutera tworzy nową pocztę aby umożliwić użytkownikowi udostępnianie

zdjęć Działanie ułatwiają następujące kluczowe interakcje między systemem a

aplikacją

Śledzenie tego na co użytkownik obecnie zwraca uwagę na ekranie aby

zapewnić że system nadal działa w procesie ktoacutery prowadzi działalność

Wiedząc że wcześniej stosowane procesy zawierają rzeczy do ktoacuterych

użytkownik może powroacutecić (przerwane czynności) a tym samym bardziej

wysoce priorytetowo traktować te procesy

Zapewnienie aplikacji do implementowania przepływoacutew między sobą a także

do koordynowania tych przepływoacutew

Aktywności są potomnymi klasy Activity

Usługi

Serwis (Service) jest to usłaga działająca w tle z roacuteżnych przyczyn Jest to składnik

ktoacutery działa w tle aby wykonać długotrwałe operacje lub wykonać pracę dla zdalnych

procesoacutew Usługa nie udostępnia interfejsu użytkownika Na przykład usługa może

odtwarzać muzykę w tle gdy użytkownik znajduje się w innej aplikacji lub może

pobierać dane przez sieć bez blokowania interakcji użytkownika z aktywnością Inny

składnik na przykład aktywność może uruchomić usługę i pozwolić jej uruchomić lub

związać się z nią aby z nią wspoacutełpracować Istnieją dwa rodzaje usług

Odtwarzanie muzyki jest czymś co użytkownik jest bezpośrednio świadomy

więc aplikacja moacutewi systemowi moacutewiąc że chce być pierwszym planie z

powiadomieniem aby poinformować o tym użytkownika w tym przypadku

system wie że powinien sproacutebować naprawdę ciężko aby uruchomić ten

proces ponieważ użytkownik będzie niezadowolony jeśli zniknie

Regularna usługa tła nie jest czymś co użytkownik jest świadomy że działa

więc system ma większą swobodę w zarządzaniu jego procesem Może to

pozwolić na jego zabicie (a następnie ponowne uruchomienie usługi w

poacuteźniejszym czasie) jeśli potrzebuje pamięci RAM w sprawach ktoacutere mają dla

niego bezpośrednią troskę

Ograniczone usługi działają ponieważ inna aplikacja (lub system) zakomunikowała

że chce skorzystać z tej usługi Jest to zasadniczo usługa dostarczająca interfejs API

do innego procesu System wie więc że istnieje zależność między tymi procesami

więc jeśli proces A jest związany z usługą w procesie B wie że musi zachować proces

B (i jego usługa) działający dla A Ze względu na swoją elastyczność (na lepsze lub

gorsze) usługi okazały się użytecznymi elementami budowania systemoacutew złożonych

wyższego poziomu

Usługa jest implementowana jako pochodna klasy Service

Uwaga jeśli aplikacja jest przeznaczona na Android 50 (poziom API 21) lub nowszy

należy użyc klasy JobScheduler do zaplanowania działań JobScheduler ma tę zaletę

że oszczędza baterię optymalizując harmonogram zadań aby zmniejszyć zużycie

energii

Odbiorniki nadawcze

Odbiornik transmisji to składnik ktoacutery umożliwia systemowi dostarczanie zdarzeń do

aplikacji poza regularnym przepływem użytkownikoacutew co umożliwia aplikacjom

reagowanie na ogoacutelnodostępne komunikaty

Odbiornik nadawczy jest implementowany jako pochodna BroadcastReceiver

Dostawcy treści

Dostawca treści zarządza wspoacutelnym zestawem danych aplikacji ktoacutere można zapisać

w systemie plikoacutew w bazie danych SQLite w internecie lub na dowolnym innym

vmiejscu przechowywania uporczywego że aplikacja ma dostęp Za pośrednictwem

dostawcy treści inne aplikacje mogą wyszukiwać lub modyfikować dane jeśli dostawca

treści dopuszcza Na przykład system Android udostępnia dostawcom treści ktoacutery

zarządza informacjami kontaktowymi użytkownika

Dostawca treści jest implementowany jako pochodna ContentProvider i musi

implementować standardowy zestaw interfejsoacutew API ktoacutere umożliwiają innym

aplikacjom przeprowadzanie transakcji

Zasady wspoacutełpracy komponentoacutew (intencje)

Unikalnym aspektem projektu systemu Android jest to że każda aplikacja może

uruchomić składnik innej aplikacji Jeśli na przykład użytkownik chce zrobić zdjęcie z

aparatem fotograficznym prawdopodobnie jest to że istnieje aplikacja ktoacutera to robi a

nasza aplikacja może ją używać zamiast pracować nad własną implementacją Nie

trzeba wstawiać ani nawet łączyć się z kodem z aplikacji aparatu Zamiast tego można

po prostu rozpocząć aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie Po

zakończeniu zdjęcie jest nawet zwracane do wywołującej aplikacji dzięki czemu

można go dalej przetwarzać Dla użytkownika wydaje się że aparat jest częścią

aplikacji

Gdy system inicjuje składnik rozpoczyna proces dla tej aplikacji jeśli nie jest jeszcze

uruchomiony i tworzy instancje potrzebne do kompilacji Jeśli na przykład aplikacja

rozpoczyna aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie ta aktywność

działa w procesie należącym do aplikacji aparatu a nie w jego aplikacji Dlatego w

przeciwieństwie do aplikacji na większości innych systemoacutew aplikacje na Androida nie

mają jednego punktu dostępu (nie ma żadnej funkcji main())

Ponieważ system uruchamia każdą aplikację w osobnym procesie z uprawnieniami do

plikoacutew ktoacutere ograniczają dostęp do innych aplikacji aplikacja nie może bezpośrednio

aktywować składnika z innej aplikacji Jednak system Android może utworzyć

intencję Aby uaktywnić składnik innej aplikacji wysyłana jest wiadomość do systemu

określającego zamiar rozpoczęcia danego składnika Następnie system aktywuje

komponent

Aktywowanie komponentoacutew

Trzy z czterech typoacutew komponentoacutew - aktywności usługi i odbiorniki - są uruchamiane

przez asynchroniczną wiadomość o intencji Intencje wiążą poszczegoacutelne

komponenty ze sobą podczas pracy Można myśleć o nich jako o posłankach ktoacuterzy

zażądają działania od innych składnikoacutew niezależnie od tego czy składnik należy do

tej aplikacji czy innej

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 3: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Wiele podstawowych elementoacutew i usług systemu Android takich jak ART i HAL zbudowane jest z kodu macierzystego ktoacutery wymaga bibliotek natywnych napisanych w języku C i C ++ Platforma Android udostępnia interfejsy Java framework umożliwiając aplikacjom działanie niektoacuterych z tych rodzimych bibliotek Na przykład można uzyskać dostęp do OpenGL ES za pośrednictwem interfejsu Java OpenGL API w systemie Android aby dodać obsługę do rysowania i manipulacji grafiką 2D i 3D w swojej aplikacji

Aplikacja ktoacutera wymaga kodu C lub C ++ może skorzystać z Android NDK aby uzyskać dostęp do niektoacuterych z tych rodzimych bibliotek platformy bezpośrednio z własnego kodu źroacutedłowego

Java Framework API

Cały zestaw funkcji systemu operacyjnego Android jest dostępny dla użytkownikoacutew za pośrednictwem interfejsoacutew API napisanych w języku Java Te interfejsy API tworzą bloki potrzebne do tworzenia aplikacji na Androida upraszczając ponowne wykorzystanie podstawowych modułowych komponentoacutew systemu i usług ktoacutere obejmują

Bogaty i rozbudowany system widokoacutew ktoacuterego można używać do tworzenia interfejsu aplikacji w tym list sieci poacutel tekstowych przyciskoacutew a nawet wbudowanej przeglądarki internetowej

Menedzer zasoboacutew (Resource Manager ) zapewniając dostęp do zasoboacutew bez kodu takich jak zlokalizowanych ciągoacutew grafiki i plikoacutew układu

Menedżer powiadomień ktoacutery pozwala na wszystkie aplikacje do wyświetlania powiadomień niestandardowych w pasku stanu

Menedżer aktywności (Activity Manager) ktoacutery zarządza cyklem życia aplikacji i zapewnia wspoacutelny system nawigacji (w tym wstecz)

Dostawcoacutew treści (Content Managers) ktoacutere umożliwiają aplikacjom dostęp do danych z innych aplikacji takich jak aplikacja Kontakty lub udostępnianie własnych danych

Deweloperzy mają pełny dostęp do tych samych frameworkoacutew API z ktoacuterych korzystają aplikacje systemu Android

Aplikacje systemowe

Aplikacje na Androida są tworzone w języku programowania Java Narzędzia Android

SDK kompilują kod wraz z wszelkimi plikami danych i zasoboacutew w archiwum APK

z Androidem ktoacutery jest plikiem archiwalnym z przyrostkiem apk Jeden plik APK

zawiera całą zawartość aplikacji na Androida i jest plikiem w ktoacuterym zainstalowano

aplikację z urządzeniami z Androidem

Każda aplikacja na Androida znajduje się w osobnej bdquopiaskownicyrdquo (sandbox)

zabezpieczona następującymi funkcjami zabezpieczeń dla Androida

System operacyjny Android jest wieloużytkownikowym systemem Linux w

ktoacuterym każda aplikacja jest innym użytkownikiem

Domyślnie system przypisuje każdej aplikację unikatowy identyfikator

użytkownika systemu Linux (identyfikator jest używany tylko przez system i jest

nieznany aplikacji) System ustawia uprawnienia dla wszystkich plikoacutew w

aplikacji dzięki czemu dostęp do nich może mieć tylko identyfikator

użytkownika przypisany do tej aplikacji

Każdy proces ma własną maszynę wirtualną (VM) więc kod aplikacji działa w

oderwaniu od innych aplikacji

Domyślnie każda aplikacja działa w swoim własnym systemie Linux System

Android uruchamia ten proces gdy ktoacuterykolwiek z elementoacutew aplikacji musi być

wykonany a następnie zamknąć proces gdy nie jest już potrzebny lub gdy

system musi odzyskać pamięć dla innych aplikacji

System Android realizuje zasadę najmniejszego przywileju Oznacza to że każda

aplikacja domyślnie ma dostęp tylko do komponentoacutew ktoacutere wymaga jego pracy i nie

więcej Tworzy to bardzo bezpieczne środowisko w ktoacuterym aplikacja nie może

uzyskać dostępu do części systemu dla ktoacuterych nie ma uprawnień Istnieją jednak

sposoby udostępniania danych przez aplikację innym aplikacjom a aplikacja ma

dostęp do usług systemowych

Możliwe jest skonfigurowanie dwoacutech aplikacji do udostępniania tego samego

identyfikatora użytkownika systemu Linux w ktoacuterym to przypadku mają dostęp

do plikoacutew innych osoacuteb Aby zachować zasoby systemu aplikacje z tym samym

identyfikatorem użytkownika mogą roacutewnież zorganizować działanie w tym

samym procesie w systemie Linux i udostępniać tę samą maszynę Aplikacje

muszą być roacutewnież podpisane z tym samym certyfikatem

Aplikacja może żądać uprawnień dostępu do danych urządzenia takich jak

kontakty użytkownika wiadomości SMS zamontowany dysk (karta SD) aparat

i Bluetooth Użytkownik musi wyraźnie przyznać te uprawnienia

Komponenty aplikacji

Komponenty aplikacji są podstawowymi bdquoklockamirdquo do zbudowania aplikacji na

Androida Każdy element to punkt wejścia przez ktoacutery system lub użytkownik może

wejść do aplikacji Niektoacutere składniki zależą od innych

Istnieją cztery roacuteżne typy elementoacutew aplikacji

Aktywności (activities)

Usługi (services)

Odbiorniki nadawcze (Broadcast receivers)

Dostawcy treści (Context managers)

Każdy typ ma swoacutej odrębny cel i ma inny cykl życia ktoacutery definiuje sposoacuteb tworzenia i

niszczenia składnika

Aktywności

Aktywność jest punktem wyjścia do interakcji z użytkownikiem Reprezentuje

pojedynczy ekran (nie widok ) z interfejsem użytkownika Na przykład aplikacja

poczty e-mail może zawierać jedną aktywność ktoacutera wyświetla listę nowych e-maili

inną aktywność w celu utworzenia wiadomości e-mail oraz inną aktywność czytania e-

maili Chociaż działania łączą się w celu stworzenia spoacutejnego doświadczenia

użytkownikoacutew w aplikacji poczty e-mail każda jest niezależna od innych W takim

przypadku inna aplikacja może rozpocząć dowolną z tych czynności jeśli aplikacja e-

mail ją zezwala Na przykład aplikacja aparatu może rozpocząć działanie w aplikacji

poczty e-mail ktoacutera tworzy nową pocztę aby umożliwić użytkownikowi udostępnianie

zdjęć Działanie ułatwiają następujące kluczowe interakcje między systemem a

aplikacją

Śledzenie tego na co użytkownik obecnie zwraca uwagę na ekranie aby

zapewnić że system nadal działa w procesie ktoacutery prowadzi działalność

Wiedząc że wcześniej stosowane procesy zawierają rzeczy do ktoacuterych

użytkownik może powroacutecić (przerwane czynności) a tym samym bardziej

wysoce priorytetowo traktować te procesy

Zapewnienie aplikacji do implementowania przepływoacutew między sobą a także

do koordynowania tych przepływoacutew

Aktywności są potomnymi klasy Activity

Usługi

Serwis (Service) jest to usłaga działająca w tle z roacuteżnych przyczyn Jest to składnik

ktoacutery działa w tle aby wykonać długotrwałe operacje lub wykonać pracę dla zdalnych

procesoacutew Usługa nie udostępnia interfejsu użytkownika Na przykład usługa może

odtwarzać muzykę w tle gdy użytkownik znajduje się w innej aplikacji lub może

pobierać dane przez sieć bez blokowania interakcji użytkownika z aktywnością Inny

składnik na przykład aktywność może uruchomić usługę i pozwolić jej uruchomić lub

związać się z nią aby z nią wspoacutełpracować Istnieją dwa rodzaje usług

Odtwarzanie muzyki jest czymś co użytkownik jest bezpośrednio świadomy

więc aplikacja moacutewi systemowi moacutewiąc że chce być pierwszym planie z

powiadomieniem aby poinformować o tym użytkownika w tym przypadku

system wie że powinien sproacutebować naprawdę ciężko aby uruchomić ten

proces ponieważ użytkownik będzie niezadowolony jeśli zniknie

Regularna usługa tła nie jest czymś co użytkownik jest świadomy że działa

więc system ma większą swobodę w zarządzaniu jego procesem Może to

pozwolić na jego zabicie (a następnie ponowne uruchomienie usługi w

poacuteźniejszym czasie) jeśli potrzebuje pamięci RAM w sprawach ktoacutere mają dla

niego bezpośrednią troskę

Ograniczone usługi działają ponieważ inna aplikacja (lub system) zakomunikowała

że chce skorzystać z tej usługi Jest to zasadniczo usługa dostarczająca interfejs API

do innego procesu System wie więc że istnieje zależność między tymi procesami

więc jeśli proces A jest związany z usługą w procesie B wie że musi zachować proces

B (i jego usługa) działający dla A Ze względu na swoją elastyczność (na lepsze lub

gorsze) usługi okazały się użytecznymi elementami budowania systemoacutew złożonych

wyższego poziomu

Usługa jest implementowana jako pochodna klasy Service

Uwaga jeśli aplikacja jest przeznaczona na Android 50 (poziom API 21) lub nowszy

należy użyc klasy JobScheduler do zaplanowania działań JobScheduler ma tę zaletę

że oszczędza baterię optymalizując harmonogram zadań aby zmniejszyć zużycie

energii

Odbiorniki nadawcze

Odbiornik transmisji to składnik ktoacutery umożliwia systemowi dostarczanie zdarzeń do

aplikacji poza regularnym przepływem użytkownikoacutew co umożliwia aplikacjom

reagowanie na ogoacutelnodostępne komunikaty

Odbiornik nadawczy jest implementowany jako pochodna BroadcastReceiver

Dostawcy treści

Dostawca treści zarządza wspoacutelnym zestawem danych aplikacji ktoacutere można zapisać

w systemie plikoacutew w bazie danych SQLite w internecie lub na dowolnym innym

vmiejscu przechowywania uporczywego że aplikacja ma dostęp Za pośrednictwem

dostawcy treści inne aplikacje mogą wyszukiwać lub modyfikować dane jeśli dostawca

treści dopuszcza Na przykład system Android udostępnia dostawcom treści ktoacutery

zarządza informacjami kontaktowymi użytkownika

Dostawca treści jest implementowany jako pochodna ContentProvider i musi

implementować standardowy zestaw interfejsoacutew API ktoacutere umożliwiają innym

aplikacjom przeprowadzanie transakcji

Zasady wspoacutełpracy komponentoacutew (intencje)

Unikalnym aspektem projektu systemu Android jest to że każda aplikacja może

uruchomić składnik innej aplikacji Jeśli na przykład użytkownik chce zrobić zdjęcie z

aparatem fotograficznym prawdopodobnie jest to że istnieje aplikacja ktoacutera to robi a

nasza aplikacja może ją używać zamiast pracować nad własną implementacją Nie

trzeba wstawiać ani nawet łączyć się z kodem z aplikacji aparatu Zamiast tego można

po prostu rozpocząć aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie Po

zakończeniu zdjęcie jest nawet zwracane do wywołującej aplikacji dzięki czemu

można go dalej przetwarzać Dla użytkownika wydaje się że aparat jest częścią

aplikacji

Gdy system inicjuje składnik rozpoczyna proces dla tej aplikacji jeśli nie jest jeszcze

uruchomiony i tworzy instancje potrzebne do kompilacji Jeśli na przykład aplikacja

rozpoczyna aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie ta aktywność

działa w procesie należącym do aplikacji aparatu a nie w jego aplikacji Dlatego w

przeciwieństwie do aplikacji na większości innych systemoacutew aplikacje na Androida nie

mają jednego punktu dostępu (nie ma żadnej funkcji main())

Ponieważ system uruchamia każdą aplikację w osobnym procesie z uprawnieniami do

plikoacutew ktoacutere ograniczają dostęp do innych aplikacji aplikacja nie może bezpośrednio

aktywować składnika z innej aplikacji Jednak system Android może utworzyć

intencję Aby uaktywnić składnik innej aplikacji wysyłana jest wiadomość do systemu

określającego zamiar rozpoczęcia danego składnika Następnie system aktywuje

komponent

Aktywowanie komponentoacutew

Trzy z czterech typoacutew komponentoacutew - aktywności usługi i odbiorniki - są uruchamiane

przez asynchroniczną wiadomość o intencji Intencje wiążą poszczegoacutelne

komponenty ze sobą podczas pracy Można myśleć o nich jako o posłankach ktoacuterzy

zażądają działania od innych składnikoacutew niezależnie od tego czy składnik należy do

tej aplikacji czy innej

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 4: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

System operacyjny Android jest wieloużytkownikowym systemem Linux w

ktoacuterym każda aplikacja jest innym użytkownikiem

Domyślnie system przypisuje każdej aplikację unikatowy identyfikator

użytkownika systemu Linux (identyfikator jest używany tylko przez system i jest

nieznany aplikacji) System ustawia uprawnienia dla wszystkich plikoacutew w

aplikacji dzięki czemu dostęp do nich może mieć tylko identyfikator

użytkownika przypisany do tej aplikacji

Każdy proces ma własną maszynę wirtualną (VM) więc kod aplikacji działa w

oderwaniu od innych aplikacji

Domyślnie każda aplikacja działa w swoim własnym systemie Linux System

Android uruchamia ten proces gdy ktoacuterykolwiek z elementoacutew aplikacji musi być

wykonany a następnie zamknąć proces gdy nie jest już potrzebny lub gdy

system musi odzyskać pamięć dla innych aplikacji

System Android realizuje zasadę najmniejszego przywileju Oznacza to że każda

aplikacja domyślnie ma dostęp tylko do komponentoacutew ktoacutere wymaga jego pracy i nie

więcej Tworzy to bardzo bezpieczne środowisko w ktoacuterym aplikacja nie może

uzyskać dostępu do części systemu dla ktoacuterych nie ma uprawnień Istnieją jednak

sposoby udostępniania danych przez aplikację innym aplikacjom a aplikacja ma

dostęp do usług systemowych

Możliwe jest skonfigurowanie dwoacutech aplikacji do udostępniania tego samego

identyfikatora użytkownika systemu Linux w ktoacuterym to przypadku mają dostęp

do plikoacutew innych osoacuteb Aby zachować zasoby systemu aplikacje z tym samym

identyfikatorem użytkownika mogą roacutewnież zorganizować działanie w tym

samym procesie w systemie Linux i udostępniać tę samą maszynę Aplikacje

muszą być roacutewnież podpisane z tym samym certyfikatem

Aplikacja może żądać uprawnień dostępu do danych urządzenia takich jak

kontakty użytkownika wiadomości SMS zamontowany dysk (karta SD) aparat

i Bluetooth Użytkownik musi wyraźnie przyznać te uprawnienia

Komponenty aplikacji

Komponenty aplikacji są podstawowymi bdquoklockamirdquo do zbudowania aplikacji na

Androida Każdy element to punkt wejścia przez ktoacutery system lub użytkownik może

wejść do aplikacji Niektoacutere składniki zależą od innych

Istnieją cztery roacuteżne typy elementoacutew aplikacji

Aktywności (activities)

Usługi (services)

Odbiorniki nadawcze (Broadcast receivers)

Dostawcy treści (Context managers)

Każdy typ ma swoacutej odrębny cel i ma inny cykl życia ktoacutery definiuje sposoacuteb tworzenia i

niszczenia składnika

Aktywności

Aktywność jest punktem wyjścia do interakcji z użytkownikiem Reprezentuje

pojedynczy ekran (nie widok ) z interfejsem użytkownika Na przykład aplikacja

poczty e-mail może zawierać jedną aktywność ktoacutera wyświetla listę nowych e-maili

inną aktywność w celu utworzenia wiadomości e-mail oraz inną aktywność czytania e-

maili Chociaż działania łączą się w celu stworzenia spoacutejnego doświadczenia

użytkownikoacutew w aplikacji poczty e-mail każda jest niezależna od innych W takim

przypadku inna aplikacja może rozpocząć dowolną z tych czynności jeśli aplikacja e-

mail ją zezwala Na przykład aplikacja aparatu może rozpocząć działanie w aplikacji

poczty e-mail ktoacutera tworzy nową pocztę aby umożliwić użytkownikowi udostępnianie

zdjęć Działanie ułatwiają następujące kluczowe interakcje między systemem a

aplikacją

Śledzenie tego na co użytkownik obecnie zwraca uwagę na ekranie aby

zapewnić że system nadal działa w procesie ktoacutery prowadzi działalność

Wiedząc że wcześniej stosowane procesy zawierają rzeczy do ktoacuterych

użytkownik może powroacutecić (przerwane czynności) a tym samym bardziej

wysoce priorytetowo traktować te procesy

Zapewnienie aplikacji do implementowania przepływoacutew między sobą a także

do koordynowania tych przepływoacutew

Aktywności są potomnymi klasy Activity

Usługi

Serwis (Service) jest to usłaga działająca w tle z roacuteżnych przyczyn Jest to składnik

ktoacutery działa w tle aby wykonać długotrwałe operacje lub wykonać pracę dla zdalnych

procesoacutew Usługa nie udostępnia interfejsu użytkownika Na przykład usługa może

odtwarzać muzykę w tle gdy użytkownik znajduje się w innej aplikacji lub może

pobierać dane przez sieć bez blokowania interakcji użytkownika z aktywnością Inny

składnik na przykład aktywność może uruchomić usługę i pozwolić jej uruchomić lub

związać się z nią aby z nią wspoacutełpracować Istnieją dwa rodzaje usług

Odtwarzanie muzyki jest czymś co użytkownik jest bezpośrednio świadomy

więc aplikacja moacutewi systemowi moacutewiąc że chce być pierwszym planie z

powiadomieniem aby poinformować o tym użytkownika w tym przypadku

system wie że powinien sproacutebować naprawdę ciężko aby uruchomić ten

proces ponieważ użytkownik będzie niezadowolony jeśli zniknie

Regularna usługa tła nie jest czymś co użytkownik jest świadomy że działa

więc system ma większą swobodę w zarządzaniu jego procesem Może to

pozwolić na jego zabicie (a następnie ponowne uruchomienie usługi w

poacuteźniejszym czasie) jeśli potrzebuje pamięci RAM w sprawach ktoacutere mają dla

niego bezpośrednią troskę

Ograniczone usługi działają ponieważ inna aplikacja (lub system) zakomunikowała

że chce skorzystać z tej usługi Jest to zasadniczo usługa dostarczająca interfejs API

do innego procesu System wie więc że istnieje zależność między tymi procesami

więc jeśli proces A jest związany z usługą w procesie B wie że musi zachować proces

B (i jego usługa) działający dla A Ze względu na swoją elastyczność (na lepsze lub

gorsze) usługi okazały się użytecznymi elementami budowania systemoacutew złożonych

wyższego poziomu

Usługa jest implementowana jako pochodna klasy Service

Uwaga jeśli aplikacja jest przeznaczona na Android 50 (poziom API 21) lub nowszy

należy użyc klasy JobScheduler do zaplanowania działań JobScheduler ma tę zaletę

że oszczędza baterię optymalizując harmonogram zadań aby zmniejszyć zużycie

energii

Odbiorniki nadawcze

Odbiornik transmisji to składnik ktoacutery umożliwia systemowi dostarczanie zdarzeń do

aplikacji poza regularnym przepływem użytkownikoacutew co umożliwia aplikacjom

reagowanie na ogoacutelnodostępne komunikaty

Odbiornik nadawczy jest implementowany jako pochodna BroadcastReceiver

Dostawcy treści

Dostawca treści zarządza wspoacutelnym zestawem danych aplikacji ktoacutere można zapisać

w systemie plikoacutew w bazie danych SQLite w internecie lub na dowolnym innym

vmiejscu przechowywania uporczywego że aplikacja ma dostęp Za pośrednictwem

dostawcy treści inne aplikacje mogą wyszukiwać lub modyfikować dane jeśli dostawca

treści dopuszcza Na przykład system Android udostępnia dostawcom treści ktoacutery

zarządza informacjami kontaktowymi użytkownika

Dostawca treści jest implementowany jako pochodna ContentProvider i musi

implementować standardowy zestaw interfejsoacutew API ktoacutere umożliwiają innym

aplikacjom przeprowadzanie transakcji

Zasady wspoacutełpracy komponentoacutew (intencje)

Unikalnym aspektem projektu systemu Android jest to że każda aplikacja może

uruchomić składnik innej aplikacji Jeśli na przykład użytkownik chce zrobić zdjęcie z

aparatem fotograficznym prawdopodobnie jest to że istnieje aplikacja ktoacutera to robi a

nasza aplikacja może ją używać zamiast pracować nad własną implementacją Nie

trzeba wstawiać ani nawet łączyć się z kodem z aplikacji aparatu Zamiast tego można

po prostu rozpocząć aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie Po

zakończeniu zdjęcie jest nawet zwracane do wywołującej aplikacji dzięki czemu

można go dalej przetwarzać Dla użytkownika wydaje się że aparat jest częścią

aplikacji

Gdy system inicjuje składnik rozpoczyna proces dla tej aplikacji jeśli nie jest jeszcze

uruchomiony i tworzy instancje potrzebne do kompilacji Jeśli na przykład aplikacja

rozpoczyna aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie ta aktywność

działa w procesie należącym do aplikacji aparatu a nie w jego aplikacji Dlatego w

przeciwieństwie do aplikacji na większości innych systemoacutew aplikacje na Androida nie

mają jednego punktu dostępu (nie ma żadnej funkcji main())

Ponieważ system uruchamia każdą aplikację w osobnym procesie z uprawnieniami do

plikoacutew ktoacutere ograniczają dostęp do innych aplikacji aplikacja nie może bezpośrednio

aktywować składnika z innej aplikacji Jednak system Android może utworzyć

intencję Aby uaktywnić składnik innej aplikacji wysyłana jest wiadomość do systemu

określającego zamiar rozpoczęcia danego składnika Następnie system aktywuje

komponent

Aktywowanie komponentoacutew

Trzy z czterech typoacutew komponentoacutew - aktywności usługi i odbiorniki - są uruchamiane

przez asynchroniczną wiadomość o intencji Intencje wiążą poszczegoacutelne

komponenty ze sobą podczas pracy Można myśleć o nich jako o posłankach ktoacuterzy

zażądają działania od innych składnikoacutew niezależnie od tego czy składnik należy do

tej aplikacji czy innej

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 5: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Dostawcy treści (Context managers)

Każdy typ ma swoacutej odrębny cel i ma inny cykl życia ktoacutery definiuje sposoacuteb tworzenia i

niszczenia składnika

Aktywności

Aktywność jest punktem wyjścia do interakcji z użytkownikiem Reprezentuje

pojedynczy ekran (nie widok ) z interfejsem użytkownika Na przykład aplikacja

poczty e-mail może zawierać jedną aktywność ktoacutera wyświetla listę nowych e-maili

inną aktywność w celu utworzenia wiadomości e-mail oraz inną aktywność czytania e-

maili Chociaż działania łączą się w celu stworzenia spoacutejnego doświadczenia

użytkownikoacutew w aplikacji poczty e-mail każda jest niezależna od innych W takim

przypadku inna aplikacja może rozpocząć dowolną z tych czynności jeśli aplikacja e-

mail ją zezwala Na przykład aplikacja aparatu może rozpocząć działanie w aplikacji

poczty e-mail ktoacutera tworzy nową pocztę aby umożliwić użytkownikowi udostępnianie

zdjęć Działanie ułatwiają następujące kluczowe interakcje między systemem a

aplikacją

Śledzenie tego na co użytkownik obecnie zwraca uwagę na ekranie aby

zapewnić że system nadal działa w procesie ktoacutery prowadzi działalność

Wiedząc że wcześniej stosowane procesy zawierają rzeczy do ktoacuterych

użytkownik może powroacutecić (przerwane czynności) a tym samym bardziej

wysoce priorytetowo traktować te procesy

Zapewnienie aplikacji do implementowania przepływoacutew między sobą a także

do koordynowania tych przepływoacutew

Aktywności są potomnymi klasy Activity

Usługi

Serwis (Service) jest to usłaga działająca w tle z roacuteżnych przyczyn Jest to składnik

ktoacutery działa w tle aby wykonać długotrwałe operacje lub wykonać pracę dla zdalnych

procesoacutew Usługa nie udostępnia interfejsu użytkownika Na przykład usługa może

odtwarzać muzykę w tle gdy użytkownik znajduje się w innej aplikacji lub może

pobierać dane przez sieć bez blokowania interakcji użytkownika z aktywnością Inny

składnik na przykład aktywność może uruchomić usługę i pozwolić jej uruchomić lub

związać się z nią aby z nią wspoacutełpracować Istnieją dwa rodzaje usług

Odtwarzanie muzyki jest czymś co użytkownik jest bezpośrednio świadomy

więc aplikacja moacutewi systemowi moacutewiąc że chce być pierwszym planie z

powiadomieniem aby poinformować o tym użytkownika w tym przypadku

system wie że powinien sproacutebować naprawdę ciężko aby uruchomić ten

proces ponieważ użytkownik będzie niezadowolony jeśli zniknie

Regularna usługa tła nie jest czymś co użytkownik jest świadomy że działa

więc system ma większą swobodę w zarządzaniu jego procesem Może to

pozwolić na jego zabicie (a następnie ponowne uruchomienie usługi w

poacuteźniejszym czasie) jeśli potrzebuje pamięci RAM w sprawach ktoacutere mają dla

niego bezpośrednią troskę

Ograniczone usługi działają ponieważ inna aplikacja (lub system) zakomunikowała

że chce skorzystać z tej usługi Jest to zasadniczo usługa dostarczająca interfejs API

do innego procesu System wie więc że istnieje zależność między tymi procesami

więc jeśli proces A jest związany z usługą w procesie B wie że musi zachować proces

B (i jego usługa) działający dla A Ze względu na swoją elastyczność (na lepsze lub

gorsze) usługi okazały się użytecznymi elementami budowania systemoacutew złożonych

wyższego poziomu

Usługa jest implementowana jako pochodna klasy Service

Uwaga jeśli aplikacja jest przeznaczona na Android 50 (poziom API 21) lub nowszy

należy użyc klasy JobScheduler do zaplanowania działań JobScheduler ma tę zaletę

że oszczędza baterię optymalizując harmonogram zadań aby zmniejszyć zużycie

energii

Odbiorniki nadawcze

Odbiornik transmisji to składnik ktoacutery umożliwia systemowi dostarczanie zdarzeń do

aplikacji poza regularnym przepływem użytkownikoacutew co umożliwia aplikacjom

reagowanie na ogoacutelnodostępne komunikaty

Odbiornik nadawczy jest implementowany jako pochodna BroadcastReceiver

Dostawcy treści

Dostawca treści zarządza wspoacutelnym zestawem danych aplikacji ktoacutere można zapisać

w systemie plikoacutew w bazie danych SQLite w internecie lub na dowolnym innym

vmiejscu przechowywania uporczywego że aplikacja ma dostęp Za pośrednictwem

dostawcy treści inne aplikacje mogą wyszukiwać lub modyfikować dane jeśli dostawca

treści dopuszcza Na przykład system Android udostępnia dostawcom treści ktoacutery

zarządza informacjami kontaktowymi użytkownika

Dostawca treści jest implementowany jako pochodna ContentProvider i musi

implementować standardowy zestaw interfejsoacutew API ktoacutere umożliwiają innym

aplikacjom przeprowadzanie transakcji

Zasady wspoacutełpracy komponentoacutew (intencje)

Unikalnym aspektem projektu systemu Android jest to że każda aplikacja może

uruchomić składnik innej aplikacji Jeśli na przykład użytkownik chce zrobić zdjęcie z

aparatem fotograficznym prawdopodobnie jest to że istnieje aplikacja ktoacutera to robi a

nasza aplikacja może ją używać zamiast pracować nad własną implementacją Nie

trzeba wstawiać ani nawet łączyć się z kodem z aplikacji aparatu Zamiast tego można

po prostu rozpocząć aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie Po

zakończeniu zdjęcie jest nawet zwracane do wywołującej aplikacji dzięki czemu

można go dalej przetwarzać Dla użytkownika wydaje się że aparat jest częścią

aplikacji

Gdy system inicjuje składnik rozpoczyna proces dla tej aplikacji jeśli nie jest jeszcze

uruchomiony i tworzy instancje potrzebne do kompilacji Jeśli na przykład aplikacja

rozpoczyna aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie ta aktywność

działa w procesie należącym do aplikacji aparatu a nie w jego aplikacji Dlatego w

przeciwieństwie do aplikacji na większości innych systemoacutew aplikacje na Androida nie

mają jednego punktu dostępu (nie ma żadnej funkcji main())

Ponieważ system uruchamia każdą aplikację w osobnym procesie z uprawnieniami do

plikoacutew ktoacutere ograniczają dostęp do innych aplikacji aplikacja nie może bezpośrednio

aktywować składnika z innej aplikacji Jednak system Android może utworzyć

intencję Aby uaktywnić składnik innej aplikacji wysyłana jest wiadomość do systemu

określającego zamiar rozpoczęcia danego składnika Następnie system aktywuje

komponent

Aktywowanie komponentoacutew

Trzy z czterech typoacutew komponentoacutew - aktywności usługi i odbiorniki - są uruchamiane

przez asynchroniczną wiadomość o intencji Intencje wiążą poszczegoacutelne

komponenty ze sobą podczas pracy Można myśleć o nich jako o posłankach ktoacuterzy

zażądają działania od innych składnikoacutew niezależnie od tego czy składnik należy do

tej aplikacji czy innej

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 6: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

poacuteźniejszym czasie) jeśli potrzebuje pamięci RAM w sprawach ktoacutere mają dla

niego bezpośrednią troskę

Ograniczone usługi działają ponieważ inna aplikacja (lub system) zakomunikowała

że chce skorzystać z tej usługi Jest to zasadniczo usługa dostarczająca interfejs API

do innego procesu System wie więc że istnieje zależność między tymi procesami

więc jeśli proces A jest związany z usługą w procesie B wie że musi zachować proces

B (i jego usługa) działający dla A Ze względu na swoją elastyczność (na lepsze lub

gorsze) usługi okazały się użytecznymi elementami budowania systemoacutew złożonych

wyższego poziomu

Usługa jest implementowana jako pochodna klasy Service

Uwaga jeśli aplikacja jest przeznaczona na Android 50 (poziom API 21) lub nowszy

należy użyc klasy JobScheduler do zaplanowania działań JobScheduler ma tę zaletę

że oszczędza baterię optymalizując harmonogram zadań aby zmniejszyć zużycie

energii

Odbiorniki nadawcze

Odbiornik transmisji to składnik ktoacutery umożliwia systemowi dostarczanie zdarzeń do

aplikacji poza regularnym przepływem użytkownikoacutew co umożliwia aplikacjom

reagowanie na ogoacutelnodostępne komunikaty

Odbiornik nadawczy jest implementowany jako pochodna BroadcastReceiver

Dostawcy treści

Dostawca treści zarządza wspoacutelnym zestawem danych aplikacji ktoacutere można zapisać

w systemie plikoacutew w bazie danych SQLite w internecie lub na dowolnym innym

vmiejscu przechowywania uporczywego że aplikacja ma dostęp Za pośrednictwem

dostawcy treści inne aplikacje mogą wyszukiwać lub modyfikować dane jeśli dostawca

treści dopuszcza Na przykład system Android udostępnia dostawcom treści ktoacutery

zarządza informacjami kontaktowymi użytkownika

Dostawca treści jest implementowany jako pochodna ContentProvider i musi

implementować standardowy zestaw interfejsoacutew API ktoacutere umożliwiają innym

aplikacjom przeprowadzanie transakcji

Zasady wspoacutełpracy komponentoacutew (intencje)

Unikalnym aspektem projektu systemu Android jest to że każda aplikacja może

uruchomić składnik innej aplikacji Jeśli na przykład użytkownik chce zrobić zdjęcie z

aparatem fotograficznym prawdopodobnie jest to że istnieje aplikacja ktoacutera to robi a

nasza aplikacja może ją używać zamiast pracować nad własną implementacją Nie

trzeba wstawiać ani nawet łączyć się z kodem z aplikacji aparatu Zamiast tego można

po prostu rozpocząć aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie Po

zakończeniu zdjęcie jest nawet zwracane do wywołującej aplikacji dzięki czemu

można go dalej przetwarzać Dla użytkownika wydaje się że aparat jest częścią

aplikacji

Gdy system inicjuje składnik rozpoczyna proces dla tej aplikacji jeśli nie jest jeszcze

uruchomiony i tworzy instancje potrzebne do kompilacji Jeśli na przykład aplikacja

rozpoczyna aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie ta aktywność

działa w procesie należącym do aplikacji aparatu a nie w jego aplikacji Dlatego w

przeciwieństwie do aplikacji na większości innych systemoacutew aplikacje na Androida nie

mają jednego punktu dostępu (nie ma żadnej funkcji main())

Ponieważ system uruchamia każdą aplikację w osobnym procesie z uprawnieniami do

plikoacutew ktoacutere ograniczają dostęp do innych aplikacji aplikacja nie może bezpośrednio

aktywować składnika z innej aplikacji Jednak system Android może utworzyć

intencję Aby uaktywnić składnik innej aplikacji wysyłana jest wiadomość do systemu

określającego zamiar rozpoczęcia danego składnika Następnie system aktywuje

komponent

Aktywowanie komponentoacutew

Trzy z czterech typoacutew komponentoacutew - aktywności usługi i odbiorniki - są uruchamiane

przez asynchroniczną wiadomość o intencji Intencje wiążą poszczegoacutelne

komponenty ze sobą podczas pracy Można myśleć o nich jako o posłankach ktoacuterzy

zażądają działania od innych składnikoacutew niezależnie od tego czy składnik należy do

tej aplikacji czy innej

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 7: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Zasady wspoacutełpracy komponentoacutew (intencje)

Unikalnym aspektem projektu systemu Android jest to że każda aplikacja może

uruchomić składnik innej aplikacji Jeśli na przykład użytkownik chce zrobić zdjęcie z

aparatem fotograficznym prawdopodobnie jest to że istnieje aplikacja ktoacutera to robi a

nasza aplikacja może ją używać zamiast pracować nad własną implementacją Nie

trzeba wstawiać ani nawet łączyć się z kodem z aplikacji aparatu Zamiast tego można

po prostu rozpocząć aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie Po

zakończeniu zdjęcie jest nawet zwracane do wywołującej aplikacji dzięki czemu

można go dalej przetwarzać Dla użytkownika wydaje się że aparat jest częścią

aplikacji

Gdy system inicjuje składnik rozpoczyna proces dla tej aplikacji jeśli nie jest jeszcze

uruchomiony i tworzy instancje potrzebne do kompilacji Jeśli na przykład aplikacja

rozpoczyna aktywność w aplikacji aparatu ktoacutera przechwytuje zdjęcie ta aktywność

działa w procesie należącym do aplikacji aparatu a nie w jego aplikacji Dlatego w

przeciwieństwie do aplikacji na większości innych systemoacutew aplikacje na Androida nie

mają jednego punktu dostępu (nie ma żadnej funkcji main())

Ponieważ system uruchamia każdą aplikację w osobnym procesie z uprawnieniami do

plikoacutew ktoacutere ograniczają dostęp do innych aplikacji aplikacja nie może bezpośrednio

aktywować składnika z innej aplikacji Jednak system Android może utworzyć

intencję Aby uaktywnić składnik innej aplikacji wysyłana jest wiadomość do systemu

określającego zamiar rozpoczęcia danego składnika Następnie system aktywuje

komponent

Aktywowanie komponentoacutew

Trzy z czterech typoacutew komponentoacutew - aktywności usługi i odbiorniki - są uruchamiane

przez asynchroniczną wiadomość o intencji Intencje wiążą poszczegoacutelne

komponenty ze sobą podczas pracy Można myśleć o nich jako o posłankach ktoacuterzy

zażądają działania od innych składnikoacutew niezależnie od tego czy składnik należy do

tej aplikacji czy innej

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 8: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Intencją jest utworzenie obiektu pochodnej klasy Intent ktoacutery definiuje wiadomość do

aktywowania określonego składnika (wyraźnego zamiaru) lub konkretnego typu

składnika (domyślna intencja)

Istnieją oddzielne metody aktywowania każdego typu składnika

Można rozpocząć działalność przekazując intencję do startActivity()

lub startActivityForResult() (zwracającą rezultat działania aktywnośc)

Z Androidem 50 (poziom API 21) i poacuteźniejszych można użyć tej klasy

JobScheduler do zaplanowania działań W starszych wersjach systemu

Android możena uruchomić usługę (lub podać nowe instrukcje do bieżącej

usługi) przekazując intencję do startService() Można roacutewnież związać

aktywną usługę przekazując intencję do bindService()

Można zainicjować transmisję przekazując intencję do metod takich

jak sendBroadcast() sendOrderedBroadcast() lub sendStickyBroadcast()

Można zapytać dostawcę treści wywołując query()o a ContentResolver

Inne typy komponentoacutew aplikacji ndash fragmenty

Fragment reprezentuje zachowanie lub część interfejsu użytkownika w

aktwyności Wiele fragmentoacutew można łączyć w jedną całość aby utworzyć

wieloplatformowy interfejs użytkownika i ponownie użyć fragmentu w wielu

działaniach Wragment można interpretować jako modułową sekcję aktywności ktoacutera

ma własny cykl życia odbiera własne zdarzenia wejściowe i ktoacutere można dodawać lub

usuwać gdy aktywna jest aktywność (rodzaj podobnej podgrupy ktoacuterą można

ponowne wykorzystanie w roacuteżnych działaniach)

Fragment musi zawsze być osadzony w aktywności a cykl życia fragmentu ma

bezpośredni wpływ na cykl życia danego hosta Na przykład gdy aktywność jest

wstrzymana to są wszystkie jej fragmenty a gdy aktywność jest zniszczona to są

wszystkie fragmenty

Inne typy komponentoacutew aplikacji ndash serwisy uruchamiające (loaders)

Wprowadzony w Androidzie 30 (poziom interfejsu API 11) interfejs Loader API

umożliwia załadowanie danych z dostawcy zawartości lub innego źroacutedła danych do

wyświetlania w aktywności lub fragmencie

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 9: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Plik manifestu

Przed uruchomieniem aplikacji Android odczytuje plik

manifestu AndroidManifestxml Aplikacja musi zadeklarować wszystkie jego

składniki w tym pliku ktoacutere muszą znajdować się w katalogu głoacutewnym katalogu

aplikacji

Manifest składa się z kilku elementoacutew oproacutecz deklarowania składnikoacutew aplikacji takich

jak

Identyfikuje uprawnienia użytkownika wymagane przez aplikację takie jak

dostęp do internetu czy dostęp do kont kontaktoacutew użytkownika z odczytem

Deklaruje minimalny poziom API wymagany przez aplikację na podstawie

ktoacuterych używane są aplikacje API

Deklaruje funkcje sprzętowe i programowe używane lub wymagające aplikacji

takie jak aparat fotograficzny usługi bluetooth lub ekran multitouch

Deklaruje bibliotekę API z ktoacuterą aplikacja musi być powiązana (poza

interfejsami API systemu Android) na przykład w bibliotece Map Google

ltxml version=10 encoding=utf-8gt

ltmanifestgt

ltuses-permission gt

ltpermission gt

ltpermission-tree gt

ltpermission-group gt

ltinstrumentation gt

ltuses-sdk gt

ltuses-configuration gt

ltuses-feature gt

ltsupports-screens gt

ltcompatible-screens gt

ltsupports-gl-texture gt

ltapplicationgt

ltactivitygt

ltintent-filtergt

ltaction gt

ltcategory gt

ltdata gt

ltintent-filtergt

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 10: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

ltmeta-data gt

ltactivitygt

ltactivity-aliasgt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltactivity-aliasgt

ltservicegt

ltintent-filtergt ltintent-filtergt

ltmeta-datagt

ltservicegt

ltreceivergt

ltintent-filtergt ltintent-filtergt

ltmeta-data gt

ltreceivergt

ltprovidergt

ltgrant-uri-permission gt

ltmeta-data gt

ltpath-permission gt

ltprovidergt

ltuses-library gt

ltapplicationgt

ltmanifestgt

Manifest - Uprawnienia

ltuses-permission androidname=androidpermissionACCESS_FINE_LOCATION gt

Najważniejsze uprawnienia i grupy uprawnień

Grupa zezwoleń

Uprawnienia

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 11: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Wersja 23 API definiuje nowe typy uprawnień ltuses-permission-sdk-23gt

Manifest - Deklarowanie komponentoacutew

Podstawowym zadaniem manifestu jest poinformowanie systemu o elementach

aplikacji Na przykład plik manifestu może zadeklarować działanie w następujący

sposoacuteb

ltxml version=10 encoding=utf-8gt ltmanifest gt

ltapplication androidicon=drawableapp_iconpng gt

ltactivity androidname=comexampleprojectExampleActivity

androidlabel=stringexample_label gt

ltactivitygt

ltapplicationgt

ltmanifestgt

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 12: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

W ltapplicationgt atrybut androidicon wskazuje zasoby dla ikony identyfikującej

aplikację

W ltactivitygt atrybut androidname określa w pełni kwalifikowaną nazwę pochodnej

klasy Activity a atrybut androidlabel atrybut określa ciąg znakoacutew używany jako

etykieta widoczna dla użytkownika

W manifeście należy zadeklarować wszystkie składniki aplikacji korzystając z

następujących elementoacutew

ltactivitygt elementy działalności

ltservicegt elementy usług

ltreceivergt elementy nadawcze

ltprovidergt elementy dostawcy treści

Manifest - Deklarowanie możliwości komponentoacutew

(Jak omoacutewiono powyżej) można użyć intencji aby rozpocząć działania usługi i

nadawcoacutew W aplikacji można roacutewnież domyślnego zamiaru ktoacutery opisuje typ

działania ktoacutery ma zostać wykonany a opcjonalnie dane na ktoacutere chcesz wykonać

akcję Intencja pozwala systemowi na znalezienie komponentu na urządzeniu ktoacutere

może wykonać akcję i uruchomić ją

Podczas deklarowania aktywności w manifestie aplikacji można opcjonalnie

uwzględniać filtry intencyjne ktoacutere zadeklarują możliwości tego działania dzięki

czemu może reagować na zamierzenia z innych aplikacji ltintent-filtergt

Na przykład tworząc aplikację poczty e-mail z działaniem na potrzeby tworzenia

nowego e-maila możesz zadeklarować filtr intencyjny aby odpowiadać na wysyłanie

(w celu wysłania nowego e-maila) jak pokazano w poniższym przykładzie

manifest gt

ltapplication gt

ltactivity androidname=comexampleprojectComposeEmailActivitygt

ltintent-filtergt

ltaction androidname=androidintentactionSEND gt

ltdata androidtype= gt

ltcategory androidname=androidintentcategoryDEFAULT gt

ltintent-filtergt

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 13: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

ltactivitygt

ltapplicationgt

ltmanifestgt

Jeśli inna aplikacja ma zamiar poprzez ACTION_SEND podjąć działanie i przekazać

ją startActivity() system może rozpocząć tę aktywnośc aby użytkownik moacutegł

sporządzić i wysłać wiadomość e-mail

Manifest - Deklarowanie wymagań aplikacji

Istnieje wiele urządzeń z Androidem a nie wszystkie oferują te same funkcje i

możliwości Aby zapobiec zainstalowaniu aplikacji na urządzeniach pozbawionych

funkcji wymaganych przez aplikację ważne jest aby jasno zdefiniować profil typoacutew

urządzeń ktoacutere obsługuje aplikacja deklarując wymagania dotyczące urządzeń i

oprogramowania w pliku manifestu Większość z tych deklaracji jest tylko informacyjna

i system nie czyta ich ale sprawdzają je usługi zewnętrzne takie jak Google Play czyta

je w celu zapewnienia filtrowania użytkownikoacutew podczas wyszukiwania aplikacji z ich

urządzenia

Jeśli na przykład aplikacja wymaga aparatu i używa interfejsoacutew API wprowadzonych

w Androidzie 21 ( poziom API 7) należy je zadeklarować jako wymagania w pliku

manifestu jak pokazano w poniższym przykładzie

ltmanifest gt

ltuses-feature androidname=androidhardwarecameraany

androidrequired=true gt

ltuses-sdk androidminSdkVersion=7 androidtargetSdkVersion=19 gt

ltmanifestgt

W przypadku oświadczeń pokazanych w przykładzie

urządzenia nieposiadające aparatu lub wersji Androida niższych niż 21 nie można

zainstalować aplikacji w Google Play Można jednak oświadczyć że aplikacja używa

aparatu ale nie wymaga tego W takim przypadku aplikacja musi

ustawić required atrybut falsei i sprawdzić w czasie wykonywania czy aparat ma

kamerę i odpowiednio wyłączyć funkcje aparatu

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 14: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Wersje systemu Android

Wersja systemu API NAZWA KODOWA

Android O 26 O

Android 711 Android 71

25 N_MR1

Android 70 24 N

Android 60 23 M

Android 51 22 LOLLIPOP_MR1

Android 50 21 LOLLIPOP

Android 44W 20 KITKAT_WATCH

Android 44 19 KITKAT

Android 43 18 JELLY_BEAN_MR2

Android 42 422 17 JELLY_BEAN_MR1

Android 41 411 16 JELLY_BEAN

Android 403 404 15 ICE_CREAM_SANDWICH_MR1

Android 40 401 402 14 ICE_CREAM_SANDWICH

Android 32 13 HONEYCOMB_MR2

Android 31x 12 HONEYCOMB_MR1

Android 30x 11 HONEYCOMB

Android 234 Android 233

10 GINGERBREAD_MR1

Android 232 Android 231 Android 23

9 GINGERBREAD

Android 22x 8 FROYO

Android 21x 7 ECLAIR_MR1

Android 201 6 ECLAIR_0_1

Android 20 5 ECLAIR

Android 16 4 DONUT

Android 15 3 CUPCAKE

Android 11 2 BASE_1_1

Android 10 1 BASE

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 15: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Zasoby aplikacji

Aplikacja na Androida składa się z więcej niż tylko kodu - wymaga zasoboacutew

niezależnych od kodu źroacutedłowego takich jak obrazy pliki audio i wszystko związane z

wizualną prezentacją aplikacji Na przykład można zdefiniować animacje menu style

kolory i układ interfejsoacutew użytkownika aktywności z plikami XML Korzystanie z

zasoboacutew aplikacji ułatwia aktualizowanie roacuteżnych cech aplikacji bez konieczności

modyfikowania kodu Udostępnianie zestawoacutew zasoboacutew alternatywnych pozwala

zoptymalizować aplikację na roacuteżne konfiguracje urządzeń takie jak roacuteżne języki i

rozmiary ekranu

Dla każdego zasobu dodanego do projektu z Androida narzędzia SDK build definiują

unikatowy identyfikator całkowity ktoacutery może służyć do odniesienia zasoboacutew z kodu

aplikacji lub z innych zasoboacutew określonych w XML Jeśli na przykład aplikacja zawiera

plik graficzny o nazwie logopng(zapisany w katalogu resdrawable) narzędzia SDK

generują identyfikator zasobu o nazwie Rdrawablelogo Ten identyfikator mapuje

liczbę całkowitą określoną dla aplikacji ktoacuterą można wykorzystać do odniesienia

obrazu i wstawienia jej do interfejsu użytkownika

Jednym z najważniejszych aspektoacutew dostarczania zasoboacutew oddzielonych od kodu

źroacutedłowego jest możliwość dostarczania alternatywnych zasoboacutew dla roacuteżnych

konfiguracji urządzeń Na przykład definiując ciągi UI w XML można przetłumaczyć

łańcuchy na inne języki i zapisać te ciągi w osobnych plikach Android stosuje

odpowiednie odpowiednie łańcuchy językowe do interfejsu użytkownika w oparciu

o kwalifikator językowy dołączony do nazwy katalogu zasobu (na przykład resvalues-

fr dla francuskich wartości ciągowych) i ustawienia języka użytkownika

Android obsługuje wiele roacuteżnych kwalifikatoroacutew alternatywnych zasoboacutew Kwalifikator

jest kroacutetkim ciągiem ktoacutery zawiera w nazwie katalogoacutew zasoboacutew w celu zdefiniowania

konfiguracji urządzenia dla ktoacuterej te zasoby powinny być używane Na przykład

chcemy utworzyć roacuteżne układy w zależności od orientacji i rozmiaru urządzenia Jeśli

ekran urządzenia znajduje się w orientacji pionowej preferowany jest układ z

przyciskami w pionie ale gdy ekran jest w orientacji poziomej (szerokie) przyciski

można wyroacutewnać poziomo Aby zmienić układ w zależności od orientacji można

zdefiniować dwa roacuteżne układy i zastosować odpowiedni kwalifikator do każdej nazwy

katalogu układu System automatycznie zastosuje odpowiedni układ w zależności od

aktualnej orientacji urządzenia

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 16: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Rysunek 1 Dwa roacuteżne urządzenia z ktoacuterych każdy korzysta z układu domyślnego

(aplikacja nie oferuje alternatywnych układoacutew)

Rysunek 2 Dwa roacuteżne urządzenia z ktoacuterych każdy wykorzystuje inny układ

dostarczony dla roacuteżnych rozmiaroacutew ekranu

Dla każdego typu zasobu można określić domyślne i wiele alternatywnych zasoboacutew

dla swojej aplikacji

Domyślnymi zasobami są te ktoacutere powinny być używane niezależnie od

konfiguracji urządzenia lub gdy nie ma innych zasoboacutew odpowiadających

aktualnej konfiguracji

Zasobami alternatywnymi są te ktoacutere zostały zaprojektowane do użytku w

określonej konfiguracji Aby określić że grupa zasoboacutew jest przeznaczona dla

konkretnej konfiguracji do nazwy katalogu należy dodać odpowiedni

kwalifikator konfiguracji

Na przykład podczas gdy domyślny układ interfejsu użytkownika jest zapisany

w katalogu reslayout można określić inny układ ktoacutery ma być używany gdy ekran

jest w orientacji poziomej zapisując ją w katalogu reslayout-land Android

automatycznie stosuje odpowiednie zasoby dopasowując aktualną konfigurację

urządzenia do nazw katalogoacutew zasoboacutew

Rysunek 1 ilustruje sposoacuteb w jaki system stosuje ten sam układ dla dwoacutech roacuteżnych

urządzeń jeśli nie ma dostępnych zasoboacutew alternatywnych Rysunek 2 przedstawia

tę samą aplikację gdy dodaje się alternatywny zasoacuteb układu dla większych ekranoacutew

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 17: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Dostęp do zasoboacutew

Do zasoboacutew można odwoływać w kodzie java używając identyfikatoroacutew R

takich jak Rdrawablemyimage

Do zasoboacutew można odwoływać w przy użyciu specjalnej składni XML np

drawablemyimage

Można też uzyskać dostęp do zasoboacutew aplikacji przy użyciu metod

w Resources

Najbardziej typowe zastosowanie

ImageView imageView = (ImageView) findViewById(Ridmyimageview)

imageViewsetImageResource(Rdrawablemyimage)

Ogoacutelna składnia

[ltpackage_namegt]Rltresource_typegtltresource_namegt

ltpackage_namegt jest nazwą pakietu w ktoacuterym znajduje się zasoacuteb (nie jest

wymagane podczas odniesienia zasoboacutew z własnego pakietu)

ltresource_typegtjest R podklasą dla typu zasobu

ltresource_namegtto nazwa pliku zasobu bez rozszerzenia

lub androidnamewartości atrybutu w elemencie XML (dla prostych wartości)

Ostrzeżenie Nigdy nie należy modyfikować pliku pliku Rjava ręcznie Wszelkie

zmiany są zastępowane podczas kompilacji

Dostęp do bdquoniezwiązanychrdquo plikoacutew

Niezbyt często może być konieczne uzyskanie dostępu do niezwiązanych plikoacutew i

katalogoacutew bez nadawania im identyfikatoroacutew Można zapisać zasoby w

assetskatalogu

Pliki zapisane w assetskatalogu nie mają identyfikatora zasobu dlatego nie można

ich odwoływać do klasy R lub z zasoboacutew XML Zamiast tego można wyszukiwać pliki

w katalogu assets jak zwykły system plikoacutew i odczytywać surowe dane przy użyci u

AssetManager

Jeśli jednak zachodzi potrzeba można czytać surowe dane (np Plik wideo lub audio)

przy użyciu openRawResource()

Dostęp do zasoboacutew z XML

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide

Page 18: ANDROID podstawy architektury (od strony programisty)andrzej.ae.jgora.pl/materialy/peryferyjne/android_podstawy_wyklad.pdfAndroid uruchamia ten proces, gdy którykolwiek z elementów

Można określić wartości niektoacuterych atrybutoacutew XML i elementoacutew używając odniesienia

do istniejącego zasobu Często to robisz podczas tworzenia plikoacutew układoacutew aby

dostarczyć ciągi i obrazy do swoich widżetoacutew

Na przykład jeśli dodano element Button do układu powinno użyć się definicji dla

tekstu przycisku

ltButton

androidlayout_width=fill_parent

androidlayout_height=wrap_content

androidtext=stringsubmit gt

WIĘCEJ NA

httpsdeveloperandroidcomguide