Poziom API: 16
Android 4.1 (JELLY_BEAN
)
stanowi rozwinięcie platformy,
oferując udoskonalone
wydajności i wygody użytkowników. Dodaje nowe funkcje dla użytkowników i aplikacji
dla programistów. Dokument ten przedstawia najważniejsze i najważniejsze
nowych, przydatnych
interfejsach API
dla deweloperów aplikacji.
Jako programista aplikacji możesz korzystać z Androida 4.1 SDK Manager jako obraz systemu, uruchamianie w emulatorze Androida i na platformie SDK, na podstawie której możesz tworzyć aplikacje. Zalecenia jak najszybciej pobierz obraz systemu i platformę, aby utworzyć i przetestować jest dostępna na Androida 4.1.
Aby lepiej zoptymalizować aplikację na urządzeniach z Androidem 4.1,
ustaw targetSdkVersion
na
"16"
, zainstaluj ją w obrazie systemu Android 4.1
przetestować ją, a następnie opublikować aktualizację z tą zmianą.
Ty
można korzystać z interfejsów API w Androidzie 4.1, a także obsługiwać starsze wersje przez dodanie
w kodzie, które sprawdzają poziom interfejsu API systemu przed jego wykonaniem
minSdkVersion
nie obsługuje interfejsów API.
Aby dowiedzieć się więcej o:
zachowywania zgodności wstecznej można znaleźć w artykule Tworzenie zgodności wstecznej
Interfejsy użytkownika.
Więcej informacji o sposobie działania poziomów interfejsu API znajdziesz w artykule Co to jest interfejs API Poziom?
Komponenty aplikacji
Usługi izolowane
Określając android:isolatedProcess="true"
w
<service>
, Service
będzie działać jako
własnego, wyodrębnionego procesu identyfikatora użytkownika, który nie ma własnych uprawnień.
Zarządzanie pamięcią
Na pierwszym planie znajdują się nowe stałe ComponentCallbacks2
, np. TRIM_MEMORY_RUNNING_LOW
i TRIM_MEMORY_RUNNING_CRITICAL
przetwarza dodatkowe informacje o
stanu pamięci, zanim system wywoła onLowMemory()
.
Nowa metoda getMyMemoryState(ActivityManager.RunningAppProcessInfo)
umożliwia:
pobierze ogólny stan pamięci.
Dostawcy treści
Nowa metoda (acquireUnstableContentProviderClient()
) umożliwia uzyskanie dostępu do elementu ContentProviderClient
, który może być „niestabilny” aby aplikacja nie uległa awarii, jeśli
niż dostawca treści. Jest to przydatne, gdy korzystasz z usług dostawców treści w osobnym
.
Animowane tapety
Nowy protokół intencji umożliwiający bezpośrednie uruchamianie podglądu animowanej tapety, użytkownicy mogą łatwo wybrać Twoją animowaną tapetę bez zmuszania ich do jej opuszczenia. aplikację i wybierz selektor tapet na ekranie głównym.
Aby uruchomić selektor tapet animowanych, zadzwoń do użytkownika startActivity()
i użyj polecenia Intent
za pomocą
ACTION_CHANGE_LIVE_WALLPAPER
i dodatkowy
określające animowaną tapetę ComponentName
jako ciąg znaków w polu EXTRA_LIVE_WALLPAPER_COMPONENT
.
Nawigacja po stosie aplikacji
Android 4.1 ułatwia wdrożenie prawidłowych wzorców projektowania nawigacji w górę.
Wystarczy, że dodasz android:parentActivityName
do każdego elementu <activity>
w
pliku manifestu. System wykorzystuje te informacje do uruchomienia odpowiedniej aktywności, gdy użytkownik
naciśnie przycisk W górę na pasku działań (jednocześnie zakończy bieżące działanie). Jeśli więc
określ android:parentActivityName
dla każdej aktywności, nie potrzebujesz metody onOptionsItemSelected()
do obsługi kliknięć
zdarzeń na ikonie aplikacji na pasku działań – system obsługuje teraz to zdarzenie i wznawia
tworzy odpowiednie działanie.
Jest to szczególnie przydatne w sytuacjach, gdy użytkownik wchodzi w jedną z aktywności w aplikacji
pogłębiając wiedzę, Zamiar, np. z powiadomienia lub zamiaru
innej aplikacji (zgodnie z opisem w przewodniku po projektowaniu w artykule Poruszanie się między aplikacjami). Kiedy
użytkownik rozpoczyna aktywność w ten sposób, aplikacja może nie mieć
stosunku wstecznego
czynności, które mogą być wznawiane w miarę przechodzenia użytkownika przez użytkownika. Jeśli jednak podasz atrybut android:parentActivityName
dla swoich aktywności, system rozpozna
informacje o tym, czy aplikacja zawiera już tylny stos działań nadrzędnych, a jeśli nie, to konstrukcje;
syntetyczny stos wsteczny, który zawiera wszystkie działania nadrzędne.
Uwaga: gdy użytkownik wykona w Twojej aplikacji aktywność związaną z głęboką integracją i tworzy nowe zadanie dla aplikacji, system faktycznie wstawia stos działań nadrzędnych w to zadanie. Dlatego naciśnięcie przycisku Wstecz powoduje też przejście wstecz po stosie elementu nadrzędnego. aktywności.
Gdy system tworzy syntetyczny stos wsteczny Twojej aplikacji, buduje podstawowy Intent
, aby utworzyć nowe wystąpienie każdej aktywności nadrzędnej. Nie ma więc znaczenia,
zapisano stan aktywności nadrzędnych w taki sposób, w jaki użytkownik mógł się naturalnie poruszać.
Przez
dla każdej aktywności. Jeśli któraś z aktywności nadrzędnych zwykle wyświetla interfejs zależny od tego,
użytkownika, brakuje takich informacji i należy je przesłać, gdy
użytkownik
przechodzenie wstecz po stosie. Jeśli na przykład użytkownik wyświetla album
w aplikacji muzycznej, przejście do niej może spowodować wyświetlenie aktywności, która wyświetla wszystkie albumy w wybranym
gatunek muzyczny. W takim przypadku, gdy trzeba utworzyć stos, musisz poinformować o tym rodzica
gatunek, do którego należy bieżący album, tak aby rodzic mógł wyświetlić właściwą listę jako
czy użytkownik faktycznie pochodzi z tej aktywności. Aby dostarczyć takie informacje do syntetycznego wydawcy nadrzędnego
aktywności, musisz zastąpić metodę onPrepareNavigateUpTaskStack()
. Ten
udostępnia obiekt TaskStackBuilder
utworzony przez system,
syntetyzować aktywności nadrzędne. TaskStackBuilder
zawiera Intent
obiekty, których system używa do tworzenia poszczególnych aktywności nadrzędnych. W
implementacji onPrepareNavigateUpTaskStack()
, możesz zmienić odpowiednią Intent
, aby
Udostępniać dodatkowe dane, na podstawie których aktywność nadrzędna może określić odpowiedni kontekst i wyświetlać
z odpowiednim interfejsem użytkownika.
Gdy system tworzy obiekt TaskStackBuilder
, dodaje obiekty Intent
używane do tworzenia działań nadrzędnych w ich obiektach logicznych
w kolejności, zaczynając od góry drzewa aktywności. Zatem ostatnie pole Intent
dodane do tablicy wewnętrznej jest bezpośrednim elementem nadrzędnym bieżącej aktywności. Jeśli
jeśli chcesz zmienić Intent
dla elementu nadrzędnego aktywności, najpierw określ
długość tablicy z parametrem getIntentCount()
i przekazać tę wartość
na editIntentAt()
.
Jeśli struktura Twojej aplikacji jest bardziej złożona, możesz skorzystać z kilku innych interfejsów API które pozwalają obsługiwać nawigację w górę oraz całkowicie dostosować syntetyczny stos wsteczny. Niektóre interfejsy API, które dają dodatkowe grupa kontrolna to m.in.:
onNavigateUp()
- Zastąp to ustawienie, aby wykonać niestandardową czynność, gdy użytkownik naciśnie przycisk w górę.
navigateUpTo(Intent)
- Wywołaj tę czynność, by zakończyć bieżącą aktywność i przejść do aktywności wskazanej przez
podano
Intent
. Jeśli aktywność znajduje się w stosie wstecz, ale nie jest najbliższym elementem nadrzędnym, to wszystkie pozostałe działania pomiędzy bieżącą aktywnością określone działanie określone z intencją. getParentActivityIntent()
- Wywołaj to, aby uzyskać
Intent
, która zainicjuje zadanie logiczne elementu nadrzędnego dla bieżącej aktywności. shouldUpRecreateTask(Intent)
- Wywołaj to, aby zapytać, czy trzeba utworzyć syntetyczny stos wsteczny w celu nawigowania w górę. Zwraca wartość „prawda”, jeśli trzeba utworzyć stos syntetyczny, lub „fałsz”, jeśli jest właściwy stos już istnieje.
finishAffinity()
- Wywołaj ten element, aby zakończyć bieżącą aktywność i wszystkie aktywności rodziców z tą samą czynnością
koligacja zadań, które są powiązane z bieżącym działaniem.
Jeśli zastąpisz domyślne zachowania, takie jak
onNavigateUp()
, należy wywołać tę metodę, gdy tworzy syntetyczny stos wsteczny po przejściu do nawigacji w górę. onCreateNavigateUpTaskStack
- Zastąp to ustawienie, jeśli chcesz w pełni kontrolować sposób tworzenia stosu zadań syntetycznych. Jeśli chcesz po prostu dodać trochę dodatkowych danych do intencji dotyczących stosu wstecznego, zastąp
onPrepareNavigateUpTaskStack()
Większość aplikacji nie musi jednak korzystać z tych interfejsów API ani implementować interfejsu onPrepareNavigateUpTaskStack()
. Wystarczy w tym celu
dodając android:parentActivityName
do każdego elementu <activity>
.
Multimedia
Kodeki multimediów
Klasa MediaCodec
zapewnia dostęp do kodeków multimediów niskiego poziomu na potrzeby kodowania.
i dekodowanie multimediów. Możesz utworzyć instancję MediaCodec
, wywołując metodę createEncoderByType()
w celu zakodowania multimediów lub wywołanie createDecoderByType()
w celu zdekodowania multimediów. Każda z tych opcji
wybiera typ MIME odpowiadający typowi multimediów, które chcesz zakodować lub zdekodować, na przykład "video/3gpp"
lub "audio/vorbis"
.
Po utworzeniu instancji MediaCodec
możesz wywołać configure()
, aby określić właściwości, takie jak format multimediów lub
czy treść jest zaszyfrowana.
Niezależnie od tego, czy kodujesz, czy dekodujesz multimedia, reszta procesu przebiega tak samo po
utwórz: MediaCodec
. Pierwsze wywołanie metody getInputBuffers()
w celu uzyskania tablicy danych wejściowych ByteBuffer
i getOutputBuffers()
, aby uzyskać tablicę obiektów wyjściowych ByteBuffer
.
Gdy wszystko będzie gotowe do zakodowania lub dekodowania, wywołaj dequeueInputBuffer()
, aby uzyskać pozycję indeksu ByteBuffer
(z tablicy buforów wejściowych), której należy użyć do przesyłania w źródle.
multimediów. Gdy wypełnisz ByteBuffer
multimediami źródłowymi, zwolnij własność
zapełnienia bufora przez wywołanie metody queueInputBuffer()
.
Podobnie w przypadku bufora wyjściowego wywołaj dequeueOutputBuffer()
, by uzyskać pozycję indeksu ByteBuffer
otrzymasz wyniki. Gdy przeczytasz dane wyjściowe z ByteBuffer
,
zwolnić własność, wywołując metodę releaseOutputBuffer()
.
Możesz obsługiwać zaszyfrowane dane multimediów w kodekach, wywołując funkcję queueSecureInputBuffer()
w połączeniu z:
interfejsów API MediaCrypto
, a nie zwykłego queueInputBuffer()
.
Więcej informacji na temat korzystania z kodeków znajdziesz w dokumentacji MediaCodec
.
Nagrywaj dźwięk we właściwym momencie
Nowa metoda zezwala na: startRecording()
rozpocząć nagrywanie dźwięku na podstawie wskazówki zdefiniowanej przez MediaSyncEvent
.
MediaSyncEvent
określa sesję audio.
(np. zdefiniowane przez MediaPlayer
), które po ukończeniu uruchamiają
dyktafon, aby rozpocząć nagrywanie. Możesz użyć tej funkcji na przykład do
odtworzy sygnał dźwiękowy, aby wskazać początek sesji nagrywania i nagrywania
automatycznie rozpocznie się, więc nie musisz ręcznie synchronizować dźwięku i początku,
nagrania.
Ścieżki tekstowe z sygnaturą czasową
MediaPlayer
obsługuje teraz zarówno ścieżki tekstowe w paśmie, jak i poza nim.
Ścieżki tekstowe w paśmie są wyświetlane jako ścieżki tekstowe w źródle multimediów MP4 lub 3GPP. Tekst spoza zakresu
ścieżki można dodawać jako zewnętrzne źródła tekstu za pomocą metody addTimedTextSource()
. Po całym tekście zewnętrznym
źródła ścieżek zostały dodane, funkcja getTrackInfo()
powinna być wywoływana, aby uzyskać dostęp
odświeżona lista wszystkich ścieżek dostępnych w źródle danych.
Aby ustawić ścieżkę do wykorzystania w usłudze MediaPlayer
, musisz
wywołaj selectTrack()
za pomocą indeksu
obok utworu, którego chcesz użyć.
Aby otrzymywać powiadomienia, gdy ścieżka tekstowa będzie gotowa do odtworzenia, zaimplementuj
MediaPlayer.OnTimedTextListener
interfejs i karta
go do: setOnTimedTextListener()
.
Efekty dźwiękowe
Zajęcia AudioEffect
obsługują teraz dodatkowy dźwięk
typów wstępnego przetwarzania dźwięku:
- Z funkcją
AcousticEchoCanceler
usuwa z przechwyconego sygnału dźwiękowego sygnał odbierany od osoby zdalnej. - Automatyczna kontrola wzmocnienia dźwięku:
AutomaticGainControl
automatycznie normalizuje wyjście przechwyconego sygnału. - Reduktor szumów (NS) z:
NoiseSuppressor
usuwa szum w tle z przechwyconego sygnału.
Możesz zastosować te efekty przed rozpoczęciem przetwarzania dźwięku do dźwięku rejestrowanego za pomocą AudioRecord
za pomocą jednego z AudioEffect
podklasy.
Uwaga: nie gwarantujemy, że wszystkie urządzenia obsługują te
pamiętaj, aby w pierwszej kolejności sprawdzić dostępność, wywołując funkcję isAvailable()
na odpowiednich
klasę efektów dźwiękowych.
Odtwarzanie bez przerw
Możesz teraz odtwarzać bez przerw między 2 osobnymi
MediaPlayer
obiekty. W każdej chwili, zanim skończy się pierwsze MediaPlayer
,
Połącz z setNextMediaPlayer()
i Androidem
próbuje uruchomić drugiego gracza w chwili zakończenia działania pierwszego.
Aparat
Ruch autofokusa
Nowy interfejs Camera.AutoFocusMoveCallback
umożliwia nasłuchiwanie
by zobaczyć zmiany w ruchu autofokusa. Możesz zarejestrować swój interfejs w setAutoFocusMoveCallback()
. Gdy kamera
jest w trybie ciągłego autofokusa (FOCUS_MODE_CONTINUOUS_VIDEO
lub
FOCUS_MODE_CONTINUOUS_PICTURE
), zadzwonimy do Ciebie
do: onAutoFocusMoving()
,
informujący, czy autofokus zaczął się poruszać czy przestał.
Dźwięki aparatu
Klasa MediaActionSound
udostępnia prosty zestaw interfejsów API do tworzenia
standardowe dźwięki emitowane przez aparat lub inne działania związane z multimediami. Do grania należy używać tych interfejsów API
odpowiedniego dźwięku podczas budowania niestandardowej klatki lub kamery wideo.
Aby odtworzyć dźwięk, po prostu utwórz instancję obiektu MediaActionSound
, wywołaj
load()
, aby wstępnie wczytać odpowiedni dźwięk, a następnie
w odpowiednim czasie, zadzwoń pod numer play()
.
Łączność
Android Beam
Android BeamTM obsługuje teraz przesyłanie dużych ładunków przez Bluetooth. Gdy zdefiniujesz dane
aby przenieść dane za pomocą nowego urządzenia setBeamPushUris()
lub nowy interfejs wywołania zwrotnego NfcAdapter.CreateBeamUrisCallback
, Android
przekazanie danych do Bluetootha lub innego środka transportu do
i uzyskać większą szybkość transferu. Jest to szczególnie przydatne w przypadku dużych ładunków, takich jak obrazy i
plików audio i nie wymaga widocznego parowania między urządzeniami. Nie musisz wykonywać żadnych dodatkowych czynności do
korzystać z transferów przez Bluetooth.
Metoda setBeamPushUris()
przyjmuje tablicę
Uri
obiekty określające dane, które chcesz przenieść z aplikacji.
Możesz też zaimplementować NfcAdapter.CreateBeamUrisCallback
który możesz określić dla swojej aktywności, wywołując funkcję setBeamPushUrisCallback()
.
Jeśli korzystasz z metody
interfejsu wywołania zwrotnego, system wywołuje metodę createBeamUris()
interfejsu, gdy
użytkownik wykonuje udostępnienie za pomocą Android Beam, dzięki czemu możesz zdefiniować identyfikatory URI, które mają być udostępniane w czasie udostępniania.
Jest to przydatne, gdy udostępniane identyfikatory URI mogą różnić się w zależności od kontekstu użytkownika w
aktywność, podczas gdy dzwonienie pod setBeamPushUris()
to
przydatne, gdy udostępniane identyfikatory URI nie zmieniają się i można je bezpiecznie zdefiniować z wyprzedzeniem.
Wykrywanie usług sieciowych
W Androidzie 4.1 dodano obsługę wykrywania usług multicast opartego na DNS, co umożliwia znajdować usługi oferowane przez urządzenia równorzędne i łączyć się z nimi przez Wi-Fi, np. na urządzeniach mobilnych; drukarki, kamery, odtwarzacze multimedialne i inne urządzenia zarejestrowane w sieci lokalnej.
Nowy pakiet android.net.nsd
zawiera nowe interfejsy API, które umożliwiają:
transmituj swoje usługi w sieci lokalnej, wykrywaj urządzenia lokalne w sieci oraz
łączyć się z urządzeniami.
Aby zarejestrować usługę, musisz najpierw utworzyć NsdServiceInfo
i zdefiniować różne właściwości usługi za pomocą metod takich jak
setServiceName()
,
setServiceType()
i
setPort()
Następnie musisz zaimplementować NsdManager.RegistrationListener
i przekaż ją firmie registerService()
dzięki urządzeniu NsdServiceInfo
.
Aby wykrywać usługi w sieci, zaimplementuj interfejs NsdManager.DiscoveryListener
i przekaż go do usługi discoverServices()
.
Kiedy NsdManager.DiscoveryListener
otrzymuje wywołania zwrotne dotyczące usług
musisz rozwiązać problem, wywołując
resolveService()
, wynik pozytywny
implementacja NsdManager.ResolveListener
, która uzyskuje
obiekt NsdServiceInfo
, który zawiera informacje o
usługi wykrywania, co pozwala zainicjować połączenie.
Wykrywanie usług Wi-Fi P2P
Interfejsy API sieci Wi-Fi P2P zostały ulepszone w Androidzie 4.1, aby ułatwić wykrywanie usług przed powiązaniem
WifiP2pManager
. Dzięki temu możesz wykrywać i filtrować w pobliżu
urządzeń według usług korzystających z Wi-Fi P2P przed połączeniem z nim, a usługa sieciowa
Wykrywanie pozwala wykryć usługę w istniejącej połączonej sieci (np. lokalnej sieci Wi-Fi
).
Aby udostępnić aplikację jako usługę przez Wi-Fi, tak aby inne urządzenia mogły wykryć
i połącz się z nią, zadzwoń pod numer addLocalService()
i podaj
Obiekt WifiP2pServiceInfo
opisujący usługi aplikacji.
Aby zainicjować wykrywanie urządzeń w pobliżu przez Wi-Fi, musisz najpierw zdecydować,
do komunikacji za pomocą Bonjour lub Upnp. Aby używać usługi Bonjour, musisz najpierw skonfigurować detektory wywołań zwrotnych z
setDnsSdResponseListeners()
, który obejmuje zarówno WifiP2pManager.DnsSdServiceResponseListener
, jak i WifiP2pManager.DnsSdTxtRecordListener
. Aby użyć Upnp, wywołaj
setUpnpServiceResponseListener()
, co zajmuje WifiP2pManager.UpnpServiceResponseListener
.
Zanim zaczniesz odkrywać usługi na urządzeniach lokalnych, musisz też zadzwonić pod numer addServiceRequest()
. Gdy WifiP2pManager.ActionListener
przekazywany do tej metody otrzymuje
oddzwonienie po pomyślnym oddzwonieniu, możesz zacząć wykrywać usługi na urządzeniach lokalnych, dzwoniąc pod numer discoverServices()
.
Po wykryciu usług lokalnych otrzymasz połączenie zwrotne pod numer WifiP2pManager.DnsSdServiceResponseListener
lub WifiP2pManager.UpnpServiceResponseListener
w zależności od tego, czy
jest zarejestrowany w celu korzystania z usług Bonjour lub Upnp. Wywołanie zwrotne w obu przypadkach zawiera
Obiekt WifiP2pDevice
reprezentujący urządzenie równorzędne.
Wykorzystanie sieci
Nowa metoda isActiveNetworkMetered()
umożliwia Ci
Sprawdź, czy urządzenie jest obecnie połączone z siecią z pomiarem użycia danych. Sprawdzając ten stan
przed intensywnymi transakcjami w sieci, możesz lepiej zarządzać wykorzystaniem danych, które może zwiększać koszty
użytkowników i zwiększać
świadome decyzje o tym, czy zrealizować transakcje teraz czy później (np. kiedy
urządzenie połączy się z siecią Wi-Fi).
Ułatwienia dostępu
Interfejsy API usługi ułatwień dostępu
Zasięg interfejsów API usługi ułatwień dostępu w Androidzie 4.1 znacznie się zwiększy. Teraz
umożliwia tworzenie usług, które monitorują większą liczbę zdarzeń wejściowych, takich jak złożone gesty, i reagują na nie.
przy użyciu: onGesture()
i innych
zdarzenia wejściowe przez dodatki do klas AccessibilityEvent
, AccessibilityNodeInfo
i AccessibilityRecord
.
Usługi ułatwień dostępu mogą też wykonywać działania w imieniu użytkownika, w tym klikać,
przewijanie i przechodzenie tekstu za pomocą narzędzi performAction
i setMovementGranularities
. Metoda performGlobalAction()
umożliwia też usługom wykonywanie działań takich jak Wstecz, Ekran główny i otwieranie ostatnich
Aplikacje i powiadomienia.
Spersonalizowana nawigacja po aplikacji
Tworząc aplikację na Androida, możesz dostosować schematy nawigacji, znajdując
elementów i widżetów do wprowadzania danych za pomocą narzędzi findFocus()
i focusSearch()
, a także ustawić ostrość.
za pomocą funkcji setAccessibilityFocused()
.
Łatwiej dostępne widżety
Nowe zajęcia w android.view.accessibility.AccessibilityNodeProvider
umożliwiają:
wyświetlania złożonych widoków niestandardowych usługom ułatwień dostępu, dzięki czemu mogą one prezentować informacje
w bardziej przystępny sposób. android.view.accessibility.AccessibilityNodeProvider
umożliwia użytkownikowi
widżet z zaawansowaną zawartością, taką jak siatka kalendarza, która prezentuje logiczną strukturę semantyczną
usługi ułatwień dostępu, które są całkowicie niezależne od struktury układu widżetu. Ta semantyka
umożliwia usługom ułatwień dostępu bardziej przydatny model interakcji dla osób,
osoba z wadą wzroku.
Kopiuj i wklej
Kopiuj i wklej z intencjami
Możesz teraz powiązać obiekt ClipData
z obiektem Intent
przy użyciu metody setClipData()
.
Jest to szczególnie przydatne, gdy przesyłasz wiele identyfikatorów URI content:
do innego
aplikacji, na przykład przy udostępnianiu wielu dokumentów. Podane identyfikatory URI content:
W ten sposób uwzględnisz też flagi intencji i oferują uprawnienia do odczytu lub zapisu, co pozwoli Ci przyznać
dostęp do wielu identyfikatorów URI w intencji. Gdy uruchamiasz intencję ACTION_SEND
lub ACTION_SEND_MULTIPLE
, identyfikatory URI podane w intencji są teraz
automatycznie rozpowszechnione w ClipData
, aby odbiorca mógł
i dostępu do nich.
Obsługa stylów HTML i ciągów znaków
Klasa ClipData
obsługuje teraz tekst ze stylem (w formacie HTML lub
Styl Androida
ciągi tekstowe). Możesz dodać tekst ze stylem HTML do sekcji ClipData
za pomocą newHtmlText()
.
Skrypt renderowania
Ulepszyliśmy funkcję obliczeń w języku Renderscript o te funkcje:
- Obsługa wielu jąder w ramach 1 skryptu.
- Obsługa odczytu z alokacji z odfiltrowanymi próbkami danych z obliczeń w nowym interfejsie API skryptu
rsSample
- Obsługa różnych poziomów dokładności odcisków palców w
#pragma
. - Obsługa zapytań o dodatkowe informacje o obiektach RS za pomocą skryptu Compute.
- Liczne ulepszenia wydajności.
Dostępne są też nowe pragmy do definiowania precyzji zmiennoprzecinkowej wymaganej przez i generować skrypty renderowania. Pozwala to włączyć funkcje NEON, takie jak szybkie operacje matematyczne wektorowe na ścieżce procesora, co w innym przypadku nie byłoby możliwe w przypadku pełnego standardu IEEE 754–2008.
Uwaga: eksperymentalny mechanizm graficzny Renderscript to teraz wycofane.
Animacja
Animacje rozpoczynania aktywności
Teraz możesz uruchomić Activity
, używając animacji powiększenia lub
tworzyć własne animacje. Aby określić animację, użyj interfejsów API ActivityOptions
do utworzenia Bundle
,
przejdź do dowolnej
metod, które rozpoczynają aktywność, na przykład startActivity()
.
Klasa ActivityOptions
zawiera inną metodę dla każdej z nich
Typ animacji, który możesz wyświetlać przy otwieraniu aktywności:
makeScaleUpAnimation()
- Tworzy animację, która skaluje okno aktywności od określonego momentu rozpoczęcia położenie na ekranie i określony rozmiar początkowy. Na przykład ekran główny w Android 4.1 używa tej funkcji podczas otwierania aplikacji.
makeThumbnailScaleUpAnimation()
- Tworzy animację, która skaluje okno aktywności, zaczynając od określonego pozycji i dostarczonego obrazu miniatury. Na przykład okno Ostatnie aplikacje w Android 4.1 używa tej funkcji podczas powrotu do aplikacji.
makeCustomAnimation()
- Tworzy animację zdefiniowaną przez Twoje zasoby: taką, która definiuje animację otwieranie aktywności i drugie za zatrzymaną aktywność.
Animator czasu
Nowa funkcja TimeAnimator
zapewnia proste wywołanie zwrotne
mechanizm TimeAnimator.TimeListener
, który powiadamia
w każdej klatce animacji. W tym Animatorze nie można określać czasu trwania, interpolacji ani wartości obiektu. Wywołanie zwrotne detektora otrzymuje informacje o każdej klatce, w tym
łączny czas, który upłynął od ostatniej klatki animacji, oraz czas, który upłynął od ostatniej klatki.
Interfejs
Powiadomienia
W Androidzie 4.1 możesz tworzyć powiadomienia z większymi regionami treści, podglądami dużych obrazów wiele przycisków poleceń i konfigurowalne priorytety.
Style powiadomień
Nowa metoda setStyle()
umożliwia określenie
jeden z trzech nowych stylów powiadomienia, że każdy z nich oferuje większy obszar treści. Do
określ styl dla dużego regionu treści, przekaż setStyle()
jeden z tych obiektów:
Notification.BigPictureStyle
- W przypadku powiadomień zawierających duży załącznik z obrazem.
Notification.BigTextStyle
- Dotyczy powiadomień, które zawierają dużo tekstu, na przykład jednego e-maila.
Notification.InboxStyle
- W przypadku powiadomień zawierających listę ciągów tekstowych, np. fragmenty z wielu e-maili.
Działania powiadomień
U dołu ekranu dostępne są teraz maksymalnie dwa przyciski poleceń. w formacie zwykłym lub większym.
Aby dodać przycisk polecenia, zadzwoń pod numer addAction()
. Przyjmuje ona 3 argumenty: obiekt rysowalny dla ikony,
tekst przycisku i PendingIntent
, który określa działanie.
do perfrom.
Priorytety
Możesz teraz wskazać systemowi, jak ważne jest powiadomienie wpływające na
kolejność powiadomień na liście według
ustaw priorytet za pomocą funkcji setPriority()
. Ty
może przekazać ten jeden z 5 różnych poziomów priorytetu zdefiniowanych przez stałe PRIORITY_*
w zajęciach Notification
. Wartość domyślna to PRIORITY_DEFAULT
. Masz 2 poziomy wyższe i 2 niższe.
Użytkownicy zwykle chcą szybko reagować na powiadomienia o wysokim priorytecie, np. nową wiadomość czatu, wiadomość tekstową lub przypomnienie o zbliżającym się wydarzeniu. Niski priorytet powiadomienia to np. wygasłe wydarzenia w kalendarzu lub promocje aplikacji.
Elementy sterujące UI systemu
Do Androida 4.0 (Ice Cream Sandwich) dodaliśmy nowe flagi sterujące widocznością interfejsu systemu.
takie jak przyciemnienie paska systemowego lub całkowite zniknięcie z ekranu telefonu.
Do Androida 4.1 dodaliśmy kilka innych flag, które dają większą kontrolę nad wyglądem systemu
elementów interfejsu i układu aktywności względem nich przez wywołanie setSystemUiVisibility()
.
i przekazując następujące flagi:
SYSTEM_UI_FLAG_FULLSCREEN
- Ukrywa niekrytyczny interfejs systemu (np. pasek stanu).
Jeśli Twoja aktywność używa paska działań w trybie nakładki (przez
włączając
android:windowActionBarOverlay
), ta flaga ukrywa również pasek działań, Dzięki skoordynowanemu animowaniu, które będą ukrywane i wyświetlane. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- Konfiguruje układ aktywności tak, by korzystać z tego samego obszaru ekranu co w przypadku
włączono
SYSTEM_UI_FLAG_FULLSCREEN
, nawet jeśli elementy interfejsu systemu są nadal widoczne. Chociaż części układu będą nałożone interfejsu systemu, przydaje się to, gdy aplikacja często ukrywa i wyświetla interfejs systemuSYSTEM_UI_FLAG_FULLSCREEN
, ponieważ eliminuje układ dostosowując się do nowych granic układu za każdym razem, gdy interfejs systemu jest ukrywany lub wyświetlany. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- Konfiguruje układ aktywności tak, by korzystać z tego samego obszaru ekranu co w przypadku
włączona
SYSTEM_UI_FLAG_HIDE_NAVIGATION
(dodana w Androidzie 4.0) nawet jeśli elementy interfejsu systemu są nadal widoczne. Chociaż fragmenty układu nakładane pasek nawigacyjny, przydaje się to, jeśli aplikacja często ukrywa i wyświetla pasek nawigacyjny. zSYSTEM_UI_FLAG_HIDE_NAVIGATION
, ponieważ eliminuje układ dostosowując się do nowych granic układu za każdym razem, gdy pasek nawigacyjny jest ukrywany lub wyświetlany. SYSTEM_UI_FLAG_LAYOUT_STABLE
- Możesz dodać tę flagę, jeśli używasz
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
lubSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
, aby mieć pewność, że gdy dzwoniszfitSystemWindows()
sądzi, że określone granice pozostają spójne pod względem dostępnego miejsca na ekranie. Oznacza to, że po ustawieniu tej flagifitSystemWindows()
działa tak, jakby widoczność elementów interfejsu systemu się nie zmieniła nawet po ukryciu całego interfejsu systemowego.
Więcej dyskusji na temat innych powiązanych flag UI systemu znajdziesz w artykule tych dodanych w Androidzie 4.0.
Widoki zdalne
GridLayout
i ViewStub
to widoki usunięte, więc można ich używać w układach
widżety aplikacji i niestandardowy układ powiadomień.
Rodziny czcionek
W Androidzie 4.1 dodaliśmy kilka kolejnych wariantów stylu czcionki Roboto, łącznie Można z nich korzystać w aplikacjach. Twoje aplikacje mają teraz dostęp do pełnego zestawu oświetlenia skrócone wersje.
Pełny zestaw dostępnych wariantów czcionek Roboto to:
- regularne
- Kursywa
- Pogrubienie
- Pogrubiona kursywa
- Jasny
- Jasna kursywa
- Skondensowany, standardowy
- Kursywa skondensowana
- Skondensowany, pogrubiony
- Skrócona, pogrubiona kursywa
Na nowej platformie fontFamily
możesz stosować dowolne z tych rozwiązań
w połączeniu z atrybutem textStyle
.
Obsługiwane wartości parametru fontFamily
to:
"sans-serif"
dla zwykłego robota"sans-serif-light"
dla robota Roboto Light"sans-serif-condensed"
dla robota Roboto Condensed
Następnie możesz zastosować pogrubienie lub kursywę za pomocą wartości textStyle
"bold"
i "italic"
. Możesz zastosować oba typy w następujący sposób: android:textStyle="bold|italic"
.
Możesz też użyć Typeface.create()
.
Na przykład: Typeface.create("sans-serif-light", Typeface.NORMAL)
.
Struktura danych wejściowych
Wiele urządzeń wejściowych
Nowa klasa InputManager
umożliwia wysyłanie zapytań
zestaw obecnie podłączonych urządzeń wejściowych i zarejestrowanych, aby otrzymywać powiadomienia, gdy nowe urządzenie
została dodana, zmieniona lub usunięta. Jest to szczególnie przydatne, jeśli tworzysz grę,
który obsługuje wiele odtwarzaczy i chcesz sprawdzić, ile podłączonych kontrolerów
a także w przypadku zmiany liczby kontrolerów.
Możesz wysłać zapytanie dotyczące wszystkich podłączonych urządzeń wejściowych, wywołując
getInputDeviceIds()
Powoduje to zwrot
tablica liczb całkowitych, z których każda stanowi identyfikator innego urządzenia wejściowego. Następnie można zadzwonić
getInputDevice()
do pozyskania
InputDevice
dla określonego identyfikatora urządzenia wejściowego.
Jeśli chcesz otrzymywać informacje o podłączeniu, zmianie lub odłączeniu nowych urządzeń wejściowych,
zaimplementować interfejs InputManager.InputDeviceListener
oraz
zarejestrować ją w registerInputDeviceListener()
.
Wibracje przy kontrolerach wejściowych
Jeśli podłączone urządzenia wejściowe mają własne funkcje wibracji, możesz teraz
wibracjami tych urządzeń przy użyciu interfejsów API Vibrator
.
dzwoniąc pod numer getVibrator()
(InputDevice
).
Uprawnienia
Oto nowe uprawnienia:
READ_EXTERNAL_STORAGE
- Zapewnia chroniony dostęp z możliwością odczytu do pamięci zewnętrznej. W Androidzie 4.1 przez domyślnie wszystkie aplikacje odczytywały dostęp. W przyszłej wersji zostanie to zmienione i wymaga, aby aplikacje były proszone dostępu do odczytu za pomocą tych uprawnień. Jeśli Twoja aplikacja już prosi o uprawnienia do zapisu, automatycznie uzyskają też uprawnienia do odczytu. Dla programistów dostępna jest nowa opcja, która umożliwia włączenie dostępu do odczytu ograniczeń, aby deweloperzy mogli testować swoje aplikacje pod kątem działania Androida w w przyszłości.
- android.Manifest.permission.READ_USER_DICTIONARY
- Zezwalaj aplikacji na odczyt słownika użytkownika. Powinno to być wymagane tylko przez IME lub edytor słownika, taki jak aplikacja Ustawienia.
READ_CALL_LOG
- Umożliwia aplikacji odczytywanie systemowego rejestru połączeń zawierającego informacje na temat: połączeń przychodzących i wychodzących.
WRITE_CALL_LOG
- Umożliwia aplikacji modyfikowanie systemowego rejestru połączeń zapisanego na telefonie
- android.Manifest.permission.WRITE_USER_DICTIONARY
- Zezwalaj aplikacji na zapis w słowniku słów użytkownika.
Funkcje urządzenia
Android 4.1 zawiera nową deklarację funkcji w przypadku urządzeń przeznaczonych
do wyświetlania interfejsu użytkownika na ekranie telewizora: FEATURE_TELEVISION
. Zadeklarowanie, że aplikacja wymaga
interfejsu telewizora, zadeklaruj tę funkcję w pliku manifestu za pomocą elementu <uses-feature>
:
<manifest ... > <uses-feature android:name="android.hardware.type.television" android:required="true" /> ... </manifest>
Ta funkcja definiuje „telewizor” jakby były typowe dla telewizora: na dużym ekranie, na którym jest to coś w rodzaju pada kierunkowego, a nie dotyk czy mysz/urządzenie-wskaźnikowe.