Interfejsy API Androida 4.1

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.

Router multimediów. Nowe interfejsy API MediaRouter, MediaRouteActionProvider i MediaRouteButton zapewniają ze standardowymi mechanizmami i interfejsem użytkownika do wyboru miejsca odtwarzania multimediów.

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 systemu SYSTEM_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. z SYSTEM_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 lub SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION, aby mieć pewność, że gdy dzwonisz fitSystemWindows() sądzi, że określone granice pozostają spójne pod względem dostępnego miejsca na ekranie. Oznacza to, że po ustawieniu tej flagi fitSystemWindows() 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.