ANDROID podstawy architektury (od strony...
Transcript of ANDROID podstawy architektury (od strony...
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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