Funkcje i interfejsy API Androida 8.0

Android 8.0 (poziom interfejsu API 26) oferuje użytkownikom i deweloperom wiele nowych funkcji i możliwości. W tym dokumencie znajdziesz informacje o nowościach dla deweloperów.

Sprawdź też Zmiany w działaniu Androida 8.0, by dowiedzieć się, w jakich obszarach zmiany dotyczące platformy mogą mieć wpływ na Twoje aplikacje.

Jakość usług

Tryb obrazu w obrazie

Obraz w obrazie na Androidzie 8.0.

Android 8.0 (poziom interfejsu API 26) umożliwia uruchamianie działań w trybie obrazu w obrazie (PIP). PIP to specjalny typ trybu wielu okien, najczęściej używany do odtwarzania filmów. Tryb obrazu w obrazie był pierwotnie dostępny tylko na Androidzie TV, a Android 8.0 udostępnia tę funkcję na innych urządzeniach z Androidem.

Gdy aktywność jest w trybie PIP, jest ona wstrzymana, ale powinna nadal pokazywać treść. Dlatego sprawdź, czy aplikacja nie wstrzymuje odtwarzania w module obsługi onPause(). Zamiast tego wstrzymaj film w onStop() i wznów odtwarzanie za onStart(). Więcej informacji znajdziesz w artykule Cykl życia w wielu oknach.

Aby określić, że aktywność może używać trybu PIP, ustaw w pliku manifestu ustawienie android:supportsPictureInPicture na „true”. (Od Androida 8.0 tryb PIP nie wymaga atrybutu android:resizeableActivity w pliku manifestu. Jeśli Twoja aktywność obsługuje inne tryby wielu okien, musisz jednak ustawić właściwość android:resizeableActivity na „true” (prawda).

Android 8.0 (poziom interfejsu API 26) wprowadza nowy obiekt PictureInPictureParams, który przekazujesz do metod PIP, aby określać zachowanie aktywności w trybie PIP. Ten obiekt określa właściwości, takie jak preferowany współczynnik proporcji aktywności.

Istniejących metod PIP opisanych w sekcji Dodawanie obrazu w obrazie można teraz używać na wszystkich urządzeniach z Androidem, a nie tylko na Androidzie TV. Ponadto Android 8.0 udostępnia następujące metody obsługi trybu PIP:

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): włącza aktywność w trybie obrazu w obrazie. Współczynnik proporcji aktywności i inne ustawienia konfiguracji są określane przez args. Jeśli jakieś pola w argumencie args są puste, system użyje wartości ustawionych przy ostatnim wywołaniu funkcji Activity.setPictureInPictureParams().

    Określona aktywność jest wyświetlana w rogu ekranu; pozostała część ekranu jest wypełniana poprzednią aktywnością, która była widoczna na ekranie. Aktywność wchodząca w tryb PIP przechodzi w stan wstrzymania, ale pozostaje uruchomiona. Jeśli użytkownik kliknie aktywność w oknie PIP, system wyświetli menu, z którym może on wejść w interakcję. Zdarzenia dotyku nie dotrą do tej aktywności w trybie PIP.

  • Activity.setPictureInPictureParams(): aktualizuje ustawienia konfiguracji PIP aktywności. Jeśli aktywność jest obecnie w trybie PIP, ustawienia zostaną zaktualizowane. Jest to przydatne, gdy zmieni się współczynnik proporcji aktywności. Jeśli działanie nie działa w trybie PIP, te ustawienia konfiguracji są używane niezależnie od wywoływanej metody enterPictureInPictureMode().

Powiadomienia

W Androidzie 8.0 (poziom interfejsu API 26) przeprojektowaliśmy powiadomienia, aby w prostszy i spójniejszy sposób zarządzać ich ustawieniami i zachowaniem. Są to:

    menu powiadomienia wyświetlane przez naciśnięcie i przytrzymanie w Androidzie 8.0 (poziom API 26);

    Użytkownicy mogą przytrzymać ikonę programu uruchamiającego aplikacje, aby wyświetlić powiadomienia w Androidzie 8.0.

  • Kanały powiadomień: w Androidzie 8.0 pojawiły się kanały powiadomień, które umożliwiają utworzenie spersonalizowanego kanału dla każdego typu powiadomień, który chcesz wyświetlać. W interfejsie kanały powiadomień są nazywane kategoriami powiadomień. Więcej informacji o implementowaniu kanałów powiadomień znajdziesz w sekcji Zarządzanie kanałami powiadomień.
  • Kropki powiadomień: Android 8.0 obsługuje wyświetlanie kropek i plakietek na ikonach programu uruchamiającego aplikacje. Kropki powiadomień wskazują na obecność powiadomień, których użytkownik jeszcze nie odrzucił lub nie podjął żadnych działań. Więcej informacji o tym, jak korzystać z kropek z powiadomieniami, znajdziesz w sekcji Plakietki powiadomień.
  • Odkładanie: użytkownicy mogą uśpić powiadomienia, co powoduje, że na pewien czas znikają, zanim ponownie się pojawią. Powiadomienia pojawiają się ponownie z takim samym poziomem ważności, z jakim się pojawiły. Aplikacje mogą usuwać i aktualizować odłożone powiadomienia, ale zaktualizowanie ich nie powoduje ich ponownego wyświetlenia.
  • Czas oczekiwania na powiadomienia: możesz ustawić czas oczekiwania podczas tworzenia powiadomienia przy użyciu setTimeoutAfter(). Możesz użyć tej metody, aby określić czas, po którym powiadomienie ma zostać anulowane. W razie potrzeby możesz anulować powiadomienie, zanim upłynie określony czas oczekiwania.
  • Ustawienia powiadomień: możesz wywołać aplikację setSettingsText(), aby określić tekst, który będzie się wyświetlać, gdy z powiadomienia utworzysz link do ustawień powiadomień aplikacji, używając intencji Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. System może udostępniać te dodatki do filtrowania ustawień, które aplikacja musi wyświetlać użytkownikom: EXTRA_CHANNEL_ID, NOTIFICATION_TAG i NOTIFICATION_ID.
  • Odrzucanie powiadomień: użytkownicy mogą samodzielnie zamykać powiadomienia oraz usuwać je automatycznie przez aplikacje. Aby określić, kiedy powiadomienie zostanie odrzucone, a kiedy to nastąpi, zaimplementuj metodę onNotificationRemoved() z klasy NotificationListenerService.
  • Kolory tła: możesz ustawić i włączyć kolor tła powiadomienia. Używaj tej funkcji tylko w powiadomieniach o trwających zadaniach, które są ważne dla użytkownika na pierwszy rzut oka. Możesz na przykład ustawić kolor tła powiadomień związanych ze wskazówkami dojazdu lub trwającego połączenia telefonicznego. Kolor tła możesz też ustawić za pomocą właściwości setColor(). Dzięki temu możesz używać setColorized(), aby włączyć używanie koloru tła powiadomienia.
  • Styl wiadomości: w Androidzie 8.0 powiadomienia używające klasy MessagingStyle wyświetlają więcej treści w formie zwiniętej. Do obsługi powiadomień związanych z wiadomościami należy używać klasy MessagingStyle. Metody addHistoricMessage() możesz też używać do nadawania kontekstu rozmowie przez dodawanie historycznych wiadomości do powiadomień związanych z wiadomościami.

Platforma autouzupełniania

Utworzenie konta, logowanie i transakcje kartą kredytową są czasochłonne i często zawierają błędy. Aplikacje, które wymagają takich powtarzalnych zadań, mogą szybko irytować użytkowników.

Dzięki wprowadzeniu platformy autouzupełniania w Androidzie 8.0 (poziom interfejsu API 26) wypełnianie formularzy, takich jak logowanie się i formularze kart kredytowych, jest łatwiejsze. Istniejące i nowe aplikacje korzystają z platformy autouzupełniania, gdy użytkownik włączy autouzupełnianie.

Możesz wykonać kilka czynności, aby zoptymalizować sposób działania aplikacji z tą platformą. Więcej informacji znajdziesz w artykule Omówienie platformy autouzupełniania.

Czcionki do pobrania

Android 8.0 (poziom interfejsu API 26) i Biblioteka pomocy Androida 26 umożliwiają żądanie czcionek z aplikacji dostawcy, zamiast grupować czcionki w pliku APK lub zezwalać pliku APK na ich pobieranie. Ta funkcja zmniejsza rozmiar pliku APK, zwiększa współczynnik instalacji aplikacji i pozwala wielu aplikacjom korzystać z tej samej czcionki.

Więcej informacji o pobieraniu czcionek znajdziesz w artykule na temat czcionek do pobrania.

Czcionki w formacie XML

W Androidzie 8.0 (poziom interfejsu API 26) wprowadziliśmy nową funkcję – Czcionki w języku XML, która umożliwia używanie czcionek jako zasobów. Oznacza to, że nie trzeba łączyć czcionek jako zasoby. Czcionki są kompilowane w pliku R i automatycznie dostępne w systemie jako zasób. Możesz uzyskać dostęp do tych czcionek za pomocą nowego typu zasobów: font.

Biblioteka pomocy 26 w pełni obsługuje tę funkcję na urządzeniach z interfejsem API w wersji 14 lub nowszej.

Więcej informacji o używaniu czcionek jako zasobów i pobieraniu czcionek systemowych znajdziesz w artykule Czcionki w formacie XML.

Automatyczne dostosowywanie rozmiaru TextView

Android 8.0 (poziom interfejsu API 26) umożliwia ustawianie rozmiaru tekstu, który jest automatycznie rozszerzany lub zwijany na podstawie rozmiaru TextView. Oznacza to, że dużo łatwiej jest zoptymalizować rozmiar tekstu na różnych ekranach lub w treściach dynamicznych. Więcej informacji o automatycznym zmienianiu rozmiaru TextView w Androidzie 8.0 znajdziesz w artykule o automatycznym zmienianiu rozmiaru TextView.

Adaptacyjne ikony

Android 8.0 (poziom interfejsu API 26) zawiera ikony adaptacyjnego programu uruchamiającego. Ikony adaptacyjne obsługują efekty wizualne i mogą wyświetlać różne kształty na różnych modelach urządzeń. Aby dowiedzieć się, jak tworzyć ikony adaptacyjne, zapoznaj się z przewodnikiem po ikonach adaptacyjnych.

Zarządzanie kolorami

Deweloperzy aplikacji na Androida do tworzenia obrazów mogą teraz korzystać z nowych urządzeń mających wyświetlacz o szerokiej gamie kolorów. Aby wyświetlać obrazy o szerokiej gamie kolorów, aplikacje muszą włączyć flagę w pliku manifestu (dla każdej aktywności) i wczytać mapy bitowe za pomocą osadzonego szerokiego profilu kolorów (AdobeRGB, Pro Photo RGB, DCI-P3 itp.).

Interfejsy API WebView

Android 8.0 udostępnia kilka interfejsów API, które ułatwiają zarządzanie obiektami WebView, które wyświetlają treści z internetu w Twojej aplikacji. Te interfejsy API, które zwiększają stabilność i bezpieczeństwo aplikacji, obejmują:

  • Interfejs API wersji
  • Interfejs API Google SafeSearch
  • Interfejs API zakończenia obsługi
  • Interfejs API mechanizmu renderowania

Aby dowiedzieć się więcej o korzystaniu z tych interfejsów API, przeczytaj artykuł o zarządzaniu komponentami WebView.

Klasa WebView zawiera teraz interfejs API Bezpieczne przeglądanie, który zwiększa bezpieczeństwo przeglądania internetu. Więcej informacji znajdziesz w artykule o interfejsie Google Safe browsing API.

Przypinanie skrótów i widżetów

Android 8.0 (poziom interfejsu API 26) umożliwia przypinanie skrótów i widżetów w aplikacji. W aplikacji możesz tworzyć przypięte skróty i widżety do obsługiwanych programów uruchamiających (w zależności od uprawnień użytkownika).

Więcej informacji znajdziesz w przewodniku po funkcjach Przypinania skrótów i widżetów.

Maksymalny format ekranu

Android 8.0 (poziom interfejsu API 26) wprowadza zmiany w konfigurowaniu maksymalnego współczynnika proporcji aplikacji.

Po pierwsze, Android 8.0 wprowadza atrybut maxAspectRatio, za pomocą którego możesz ustawić maksymalny współczynnik proporcji aplikacji. Ponadto w Androidzie 8.0 i nowszych domyślny maksymalny współczynnik proporcji aplikacji to natywny współczynnik proporcji urządzenia, na którym aplikacja jest uruchomiona.

Więcej informacji o deklarowaniu maksymalnego formatu obrazu znajdziesz w artykule Obsługa wielu ekranów.

Obsługa kilku wyświetlaczy

Począwszy od Androida 8.0 (poziom interfejsu API 26), platforma ta umożliwia rozszerzoną obsługę wielu wyświetlaczy. Jeśli aktywność obsługuje tryb wielu okien i jest uruchomiona na urządzeniu z kilkoma wyświetlaczami, użytkownicy mogą ją przenosić z jednego ekranu na drugi. Gdy aplikacja uruchamia działanie, może określić, na którym wyświetlaczu ma się ona uruchamiać.

Uwaga: jeśli aktywność obsługuje tryb wielu okien, Android 8.0 automatycznie włącza w niej tę funkcję. Przetestuj swoją aplikację, by się upewnić, że działa prawidłowo w środowisku z wieloma wyświetlaczami.

Wznowiono tylko jedną aktywność naraz, nawet jeśli aplikacja ma wiele wyświetlaczy. Aktywność, która jest zaznaczona, jest wznowiona. Wszystkie inne widoczne działania są wstrzymywane, ale nie zatrzymane. Więcej informacji o cyklu życia aktywności, gdy widocznych jest kilka aktywności, znajdziesz w artykule Cykl życia wielu okien.

Gdy użytkownik przenosi aktywność z jednego wyświetlacza na inny, system zmienia jej rozmiar i w razie potrzeby wprowadza zmiany w czasie działania. Działanie może obsłużyć samą zmianę konfiguracji lub pozwolić systemowi na zniszczenie procesu zawierającego aktywność i odtworzenie go w nowych wymiarach. Więcej informacji znajdziesz w artykule na temat obsługi zmian konfiguracji.

ActivityOptions udostępnia 2 nowe metody obsługi wielu wyświetlaczy:

setLaunchDisplayId()
Określa wyświetlacz, na którym aktywność ma być wyświetlana po jej uruchomieniu.
getLaunchDisplayId()
Zwraca ekran bieżącego uruchomienia aktywności.

Powłoka adb została rozszerzona, aby umożliwić obsługę wielu wyświetlaczy. Polecenie shell start może teraz służyć do uruchamiania działania i określania jego docelowego wyświetlacza:

adb shell start <activity_name> --display <display_id>

Ujednolicony układ – marginesy i dopełnienie

Android 8.0 (poziom interfejsu API 26) ułatwia określanie sytuacji, w których przeciwne strony elementu View mają taki sam margines lub dopełnienie. W szczególności w plikach XML układu możesz teraz używać tych atrybutów:

Uwaga: jeśli dostosujesz sposób działania aplikacji, aby obsługiwał różne języki i kultury, w tym kierunek tekstu, pamiętaj, że te atrybuty nie wpływają na wartości atrybutów layout_marginStart, layout_marginEnd, paddingStart ani paddingEnd. Te wartości możesz ustawić samodzielnie (wraz z nowymi atrybutami układu pionowego i poziomego), by umożliwić zachowanie układu zależne od kierunku tekstu.

Przechwytywanie wskaźnika

Niektóre aplikacje, takie jak gry, pulpit zdalny i klienty wirtualizacji, bardzo sobie radzą z sterowaniem wskaźnikiem myszy. Przechwytywanie wskaźników to nowa funkcja w Androidzie 8.0 (poziom interfejsu API 26), która zapewnia taką kontrolę, wyświetlając wszystkie zdarzenia myszy w widocznym obszarze aplikacji.

Od Androida 8.0 obiekt View w aplikacji może prosić o przechwycenie wskaźnika i zdefiniować detektor w celu przetwarzania zarejestrowanych zdarzeń wskaźnika. W tym trybie wskaźnik myszy jest ukryty. Widok może zwalniać przechwytywanie wskaźnika, gdy informacje pochodzące z myszy nie są już potrzebne. System może też zwolnić zapis wskaźnika, gdy widok przestanie być aktywny, na przykład gdy użytkownik otworzy inną aplikację.

Informacje o tym, jak korzystać z tej funkcji w aplikacji, znajdziesz w artykule Przechwytywanie wskaźnika.

Kategorie aplikacji

Android 8.0 (poziom interfejsu API 26) umożliwia każdej aplikacji deklarowanie kategorii, do której należy (w stosownych przypadkach). Kategorie służą do grupowania aplikacji o podobnym przeznaczeniu lub funkcji podczas prezentowania ich użytkownikom, np. w obszarach Użycie danych, Wykorzystanie baterii lub Wykorzystanie pamięci. Kategorię aplikacji możesz zdefiniować, ustawiając atrybut android:appCategory w tagu manifestu <application>.

Program uruchamiający Androida TV

Android 8.0 (poziom interfejsu API 26) obejmuje nowy, skoncentrowany na treściach ekran główny Androida TV, który jest dostępny z emulatorem Androida TV i obrazem urządzenia Nexus Player na Androida 8.0. Na nowym ekranie głównym treści wideo są uporządkowane w rzędach odpowiadających kanałom. Z każdego z nich korzystają programy zainstalowane przez aplikację w systemie. Aplikacje mogą publikować wiele kanałów, a użytkownicy mogą decydować, które z nich mają być widoczne na ekranie głównym. Ekran główny Androida TV zawiera też wiersz Warte obejrzenia, który jest wypełniany programami z aplikacji na podstawie zwyczajów oglądania danego użytkownika. Aplikacje mogą też zawierać podglądy filmów, które są automatycznie odtwarzane, gdy użytkownik skupia się na programie. Interfejsy API służące do wypełniania kanałów i programów wchodzą w skład interfejsów API TvProvider, które są rozpowszechniane jako moduł Biblioteki pomocy na Androida w Androidzie 8.0.

AnimatorSet

Od Androida 8.0 (poziom interfejsu API 26) interfejs API AnimatorSet obsługuje teraz przewijanie i odtwarzanie odwrotne. Przewijanie pozwala ustawić pozycję animacji na konkretny punkt w czasie. Odtwarzanie odwrotne jest przydatne, jeśli aplikacja zawiera animacje, które można cofnąć. Zamiast definiować 2 osobne zestawy animacji, możesz odtworzyć ten sam odwrotnie.

Wprowadzanie i nawigacja

Klastry nawigacyjne z klawiatury

Jeśli działanie w aplikacji używa złożonej hierarchii widoków, takiej jak ta na Rysunku 2, rozważ uporządkowanie grup elementów interfejsu w klastry, aby ułatwić nawigację za pomocą klawiatury. Użytkownicy mogą przechodzić z jednego klastra do drugiego, naciskając Meta + Tab lub klawisz wyszukiwania + Tab na Chromebookach. Dobre przykłady klastrów to: panele boczne, paski nawigacyjne, główne obszary treści oraz elementy, które mogą zawierać wiele elementów podrzędnych.

Przykładowe działanie obejmujące 5 klastrów nawigacyjnych, po których użytkownik może się poruszać za pomocą skrótu klawiszowego służącego do nawigacji. Klastry wyświetlają się w tej kolejności: panel górny, lewy panel boczny, główny obszar treści, dolny panel i pływający przycisk polecenia.
Rysunek 2. Aktywność obejmująca 5 klastrów nawigacyjnych

Aby przekształcić element View lub ViewGroup w klaster, ustaw atrybut android:keyboardNavigationCluster na true w pliku XML układu elementu lub przekaż true do setKeyboardNavigationCluster() w logice interfejsu aplikacji.

Uwaga: klastrów nie można zagnieżdżać, chociaż klastry niezagnieżdżone mogą się pojawiać na różnych poziomach hierarchii. Jeśli spróbujesz zagnieżdżać klastry, platforma traktuje jako klaster tylko element ViewGroup znajdujący się najwyżej.

Na urządzeniach z ekranami dotykowymi możesz ustawić element android:touchscreenBlocksFocus obiektu ViewGroup oznaczonym jako klaster na true, aby umożliwić nawigację do i z klastra tylko w klastrze. Jeśli zastosujesz tę konfigurację do klastra, użytkownicy nie będą mogli używać klawisza Tab ani klawiszy strzałek do przechodzenia do klastra lub opuszczania go. Będą musieli naciskać kombinację klawiszy nawigacyjnych klastra.

Wyświetl domyślny fokus

W Androidzie 8.0 (poziom interfejsu API 26) możesz przypisać element View, który powinien zostać zaznaczony po wznowieniu (odtworzonej) aktywności, a użytkownik naciśnie klawisz nawigacyjny na klawiaturze, taki jak klawisz Tab. Aby zastosować to ustawienie „domyślnie zaznaczone”, ustaw atrybut android:focusedByDefault elementu View na true w pliku XML układu zawierającym element interfejsu lub przekaż parametr true do setFocusedByDefault() w logice interfejsu aplikacji.

Generowanie mowy

Aktywności i usługi mogą używać instancji TextToSpeech do dyktowania i wymowy treści. Od Androida 8.0 (poziom interfejsu API 26) aplikacja może uzyskiwać dokładniejsze informacje o tym, kiedy mechanizm zamiany tekstu na mowę zaczyna wypowiadać pojedyncze słowa syntezowane, o ile tylko udostępnia te informacje. Możesz korzystać z tej funkcji, aby zwracać uwagę na określone słowa w miarę ich wypowiadania przez mechanizm zamiany tekstu na mowę.

Aby korzystać w aplikacji z tych ulepszeń mechanizmu zamiany tekstu na mowę, zarejestruj instancję UtteranceProgressListener. W ramach procesu rejestracji dodaj moduł obsługi metody onRangeStart().

Mechanizm zamiany tekstu na mowę wywołuje rangeStart(), aby zarejestrować moment, w którym ma się rozpocząć odtwarzanie dźwięku określonego zakresu tekstu. Gdy rozpocznie się odtwarzanie dźwięku z tego zakresu tekstowego, wykonywana jest metoda onRangeStart() Twojej aplikacji. Aplikacja może odpowiedzieć na to wywołanie zwrotne, na przykład podświetlając zakres tekstu powiązany z wypowiedzą.

Więcej informacji o śledzeniu postępu odtwarzania mechanizmu zamiany tekstu na mowę znajdziesz w dokumentacji klasy UtteranceProgressListener.

System

Nowe wzorce do wykrywania treści StrictMode

Android 8.0 (poziom interfejsu API 26) dodaje 3 nowe wzorce do wykrywania treści StrictMode, które pomagają wykrywać potencjalne błędy w aplikacji:

Dane w pamięci podręcznej

Android 8.0 (poziom interfejsu API 26) zapewnia lepsze wskazówki i działania związane z danymi zapisanymi w pamięci podręcznej. Każda aplikacja ma teraz przyznany limit miejsca na dysku na dane w pamięci podręcznej, zwracany przez funkcję getCacheQuotaBytes(UUID).

Gdy system musi zwolnić miejsce na dysku, najpierw usuwa z pamięci podręcznej pliki z aplikacji, które nie przekraczają przydzielonego limitu. Z tego względu, jeśli przechowujesz dane w pamięci podręcznej poniżej przydzielonego limitu, pliki z pamięci podręcznej są jednymi z ostatnich w systemie, które są czyszczone w razie potrzeby. Gdy system decyduje, które pliki z pamięci podręcznej należy usunąć w aplikacji, najpierw bierze pod uwagę najstarsze pliki (ustalany na podstawie czasu modyfikacji).

Dostępne są też 2 nowe zachowania, które możesz włączyć w poszczególnych katalogach, aby kontrolować sposób, w jaki system zwalnia dane z pamięci podręcznej:

  • StorageManager.setCacheBehaviorAtomic() pozwala wskazać, że katalog i cała jego zawartość należy usunąć jako pojedynczą jednostkę niepodzielną.
  • setCacheBehaviorTombstone(File, boolean) pozwala wskazać, że zamiast usuwać pliki wewnątrz katalogu, należy je skrócić do długości 0 bajtów, pozostawiając pusty plik bez zmian.

Gdy musisz przydzielić miejsce na dysku na duże pliki, rozważ użycie nowego interfejsu API allocateBytes(FileDescriptor, long), który w razie potrzeby automatycznie usuwa z pamięci podręcznej pliki należące do innych aplikacji. Aby określić, czy na urządzeniu jest wystarczająca ilość miejsca na nowe dane, wywołaj funkcję getAllocatableBytes(UUID) zamiast getUsableSpace(), ponieważ ta usługa uwzględni wszystkie dane z pamięci podręcznej, które system chce usunąć w Twoim imieniu.

Podział na strony dostawcy treści

Zaktualizowaliśmy dostawców treści, aby umożliwić ładowanie dużego zbioru danych po jednej stronie. Na przykład aplikacja do obsługi zdjęć zawierająca wiele tysięcy obrazów może zapytać o podzbiór danych prezentowanych na stronie. Każda strona z wynikami zwróconymi przez dostawcę treści jest reprezentowana przez pojedynczy obiekt kursora. Aby można było korzystać z tej funkcji, zarówno klient, jak i dostawca muszą wdrożyć stronicowanie.

Szczegółowe informacje o zmianach dotyczących dostawców treści znajdziesz na stronach ContentProvider i ContentProviderClient.

Prośby o odświeżenie treści

Klasy ContentProvider i ContentResolver zawierają teraz metodę refresh(), dzięki czemu klienci mogą łatwiej sprawdzić, czy żądane informacje są aktualne.

Możesz dodać niestandardową logikę odświeżania treści, rozszerzając ContentProvider. Pamiętaj, aby zastąpić metodę refresh() zwracającą wartość true, wskazując klientom dostawcy, że próbowano samodzielnie odświeżyć dane.

Aplikacja kliencka może jawnie żądać odświeżonej treści, wywołując inną metodę o nazwie refresh(). Wywołując tę metodę, musisz przekazać identyfikator URI danych do odświeżenia.

Uwaga: ponieważ wysyłasz żądania danych przez sieć, wywoływaj refresh() po stronie klienta tylko wtedy, gdy istnieje wyraźne oznaki, że treść jest nieaktualna. Najczęstszym powodem odświeżania treści tego typu jest to w odpowiedzi na gest przesuń, aby odświeżyć, polegający na wyraźnej prośbie o wyświetlenie aktualnej treści w bieżącym interfejsie.

Ulepszenia usługi JobScheduler

Android 8.0 (poziom interfejsu API 26) wprowadza szereg udoskonaleń w JobScheduler. Te ulepszenia ułatwiają zachowanie przez aplikację zgodności z nowymi limitami działania w tle, ponieważ ogólnie możesz używać zaplanowanych zadań, aby zastąpić objęte obecnie ograniczeniami usługi w tle lub niejawne odbiorniki transmisji.

Aktualizacje usługi JobScheduler obejmują:

  • Możesz teraz powiązać kolejkę pracy z zaplanowanym zadaniem. Aby dodać element roboczy do kolejki zadania, wywołaj JobScheduler.enqueue(). Działające zadanie może przenieść oczekujące zadania z kolejki i przetworzyć. Ta funkcja obsługuje wiele przypadków użycia, które wcześniej wymagały uruchomienia usługi w tle, w szczególności usług, które implementują IntentService.
  • Biblioteka pomocy Androida 26.0.0 wprowadza nową klasę JobIntentService, która ma te same funkcje co IntentService, ale w Androidzie 8.0 (poziom interfejsu API 26) lub nowszym korzysta z zadań, a nie usług.
  • Możesz teraz wywołać metodę JobInfo.Builder.setClipData(), aby powiązać usługę ClipData z zadaniem. Ta opcja umożliwia powiązanie przyznanych uprawnień URI z zadaniem, podobnie jak w przypadku propagowania tych uprawnień w Context.startService(). Uprawnień URI można też używać z intencjami w kolejkach roboczych.
  • Zaplanowane zadania obsługują teraz kilka nowych ograniczeń:
    JobInfo.isRequireStorageNotLow()
    Zadanie nie zostanie uruchomione, jeśli na urządzeniu jest mało miejsca.
    JobInfo.isRequireBatteryNotLow()
    Zadanie nie działa, jeśli poziom baterii jest równy lub niższy od progu krytycznego. Na tym poziomie urządzenie wyświetla okno dialogowe Ostrzeżenie o słabej baterii.
    NETWORK_TYPE_METERED
    Tak jak w przypadku większości abonamentów na komórkową transmisję danych, zadania wymagają połączenia z pomiarem użycia danych.

Niestandardowy magazyn danych

Android 8.0 (poziom interfejsu API 26) umożliwia udostępnienie niestandardowego magazynu danych zgodnie z ustawieniami. Może to być przydatne, jeśli aplikacja przechowuje preferencje w chmurze lub lokalnej bazie danych albo jeśli ustawienia są zależne od urządzenia. Więcej informacji o implementowaniu magazynu danych znajdziesz w opisie magazynu danych niestandardowych.

Ulepszenia multimediów

Narzędzie do kształtowania objętości

Pojawiły się nowe zajęcia w: VolumeShaper. Służy do wykonywania krótkich i automatycznych przejść głośności, takich jak zanikanie, wyciszanie i przenikanie. Więcej informacji znajdziesz w artykule o sterowaniu amplitudą za pomocą funkcji Volume shaper.

Ulepszenia fokusu audio

Aplikacje audio udostępniają wyjście audio na urządzeniu, wysyłając żądania dotyczące dźwięku, a potem rezygnując z koncentracji. Aplikacja obsługuje zmiany zaznaczenia, rozpoczynając lub zatrzymując odtwarzanie albo ściszając głośność. Pojawiły się nowe zajęcia w: AudioFocusRequest. Użycie tej klasy jako parametru requestAudioFocus() powoduje, że aplikacje mają nowe możliwości do obsługi zmian w koncentracji dźwięku: automatyczne wyciszanie wyciszania i opóźnione wzmocnienie ostrości.

Dane o multimediach

Nowa metoda getMetrics() zwraca obiekt PersistableBundle zawierający informacje o konfiguracji i wydajności, wyrażone w postaci mapy atrybutów i wartości. Metoda getMetrics() jest zdefiniowana dla tych klas multimediów:

Wskaźniki są zbierane oddzielnie dla każdej instancji i są przechowywane przez cały okres jej istnienia. Jeśli nie są dostępne żadne wskaźniki, metoda zwraca wartość null. Rzeczywiste zwrócone wskaźniki zależą od klasy.

Odtwarzacz multimedialny

Od Androida 8.0 (poziom interfejsu API 26) MediaPlayer może odtwarzać materiały chronione przez DRM i zaszyfrowane multimedia na poziomie próbki HLS.

W Androidzie 8.0 wprowadzono nowe przeciążone polecenie seekTo(), które zapewnia szczegółową kontrolę podczas przewijania ramki. Zawiera też drugi parametr, który określa tryb wyszukiwania:

  • SEEK_PREVIOUS_SYNC przenosi pozycję multimediów do ramki synchronizacji (lub kluczowej) powiązanej ze źródłem danych, która znajduje się tuż przed danym czasem lub w określonym momencie.
  • SEEK_NEXT_SYNC przenosi pozycję multimediów do ramki synchronizacji (lub kluczowej) powiązanej ze źródłem danych, która znajduje się tuż za lub w danym momencie.
  • SEEK_CLOSEST_SYNC przenosi pozycję multimediów do ramki synchronizacji (lub kluczowej) powiązanej ze źródłem danych, które znajduje się najbliżej danego momentu lub w danym momencie.
  • SEEK_CLOSEST przenosi pozycję multimediów do ramki (niekoniecznie synchronizacji lub klatki kluczowej) powiązanej ze źródłem danych, które znajduje się najbliżej lub w danym momencie.

Jeśli chcesz wyszukiwać w trybie ciągłym, aplikacje powinny używać dowolnego z trybów SEEK_, a nie trybu SEEK_CLOSEST, który działa stosunkowo wolniej, ale może być dokładniejszy.

Rejestrator multimediów

  • MediaRecorder obsługuje teraz format MPEG2_TS, który jest przydatny do strumieniowania:

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
    

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
    

    zobacz MediaRecorder.OutputFormat

  • MediaMuxer może teraz obsługiwać dowolną liczbę strumieni audio i wideo. Nie musisz już mieć 1 ścieżki audio i/lub 1 ścieżki wideo. Użyj addTrack(), aby wymieszać dowolną liczbę utworów.
  • Element MediaMuxer może też dodawać co najmniej 1 ścieżkę metadanych zawierającą zdefiniowane przez użytkownika informacje dla każdej ramki. Format metadanych jest definiowany przez Twoją aplikację. Ścieżka metadanych jest obsługiwana tylko w przypadku kontenerów MP4.

Metadane mogą być przydatne przy przetwarzaniu offline. Do stabilizacji wideo można użyć na przykład sygnałów żyroskopowych z czujnika.

Gdy dodajesz ścieżkę metadanych, format MIME ścieżki musi zaczynać się od prefiksu „application/”. Zapisywanie metadanych jest takie samo jak zapisywanie danych wideo/audio, z tą różnicą, że nie pochodzą one z MediaCodec. Zamiast tego przekazuje do metody writeSampleData() parametr ByteBuffer z powiązaną sygnaturą czasową. Sygnatura czasowa musi przypadać w tym samym czasie co ścieżki wideo i audio.

Wygenerowany plik MP4 korzysta z TextMetaDataSampleEntry zdefiniowanego w sekcji 12.3.3.2 dokumentu ISOBMFF do sygnalizowania formatu MIME metadanych. Podczas wyodrębniania pliku ze ścieżką metadanych za pomocą metody MediaExtractor zostanie wyodrębniony format MIME metadanych do pliku MediaFormat.

Ulepszony dostęp do plików multimedialnych

Platforma Storage Access Framework (SAF) umożliwia aplikacjom udostępnianie niestandardowego elementu DocumentsProvider, który może zapewniać innym aplikacjom dostęp do plików w źródle danych. Dostawca dokumentów może nawet zapewniać dostęp do plików przechowywanych w pamięci sieciowej lub wykorzystujących protokół taki jak Media Transfer Protocol (MTP).

Dostęp do dużych plików multimedialnych ze zdalnego źródła danych wiąże się jednak z pewnymi wyzwaniami:

  • Odtwarzacze multimediów wymagają od dostawcy dokumentów dostępu do pliku z możliwością przewijania. Jeśli duży plik multimedialny znajduje się w zdalnym źródle danych, dostawca dokumentów musi z wyprzedzeniem pobrać wszystkie dane i utworzyć deskryptor pliku zrzutu. Odtwarzacz nie może odtworzyć pliku bez deskryptora pliku, dlatego odtwarzanie nie może się rozpocząć, dopóki dostawca dokumentów nie zakończy pobierania pliku.
  • Menedżery kolekcji multimediów, np. aplikacje do zdjęć, muszą przechodzić przez szereg identyfikatorów URI dostępu, aby uzyskać dostęp do multimediów przechowywanych na zewnętrznej karcie SD w folderach z ograniczonym dostępem. Taki wzorzec dostępu sprawia, że masowe operacje na mediach, takie jak przenoszenie, kopiowanie i usuwanie, są dość powolne.
  • Menedżerowie kolekcji multimediów nie mogą określić lokalizacji dokumentu na podstawie jego identyfikatora URI. Utrudnia to aplikacjom tego typu możliwość wyboru miejsca zapisywania plików multimedialnych.

Android 8.0 radzi sobie z każdym z tych wyzwań, ulepszając system dostępu do pamięci masowej.

Dostawcy dokumentów niestandardowych

Począwszy od Androida 8.0 platforma Storage Access Framework umożliwia dostawcom niestandardowych dokumentów tworzenie deskryptorów plików, które można przeszukiwać w zdalnym źródle danych. SAF może otworzyć plik, aby uzyskać natywny deskryptor pliku z możliwością wyszukiwania. Następnie SAF dostarcza do dostawcy dokumentów żądania o dyskretnych bajtów. Ta funkcja pozwala dostawcy dokumentów zwrócić dokładny zakres bajtów, których żąda aplikacja odtwarzacza multimediów, zamiast buforować z wyprzedzeniem cały plik.

Aby użyć tej funkcji, musisz wywołać nową metodę StorageManager.openProxyFileDescriptor(). Metoda openProxyFileDescriptor() akceptuje obiekt ProxyFileDescriptorCallback jako wywołanie zwrotne. SAF wywołuje wywołanie zwrotne za każdym razem, gdy aplikacja kliencka wykonuje operacje na pliku na deskryptorze plików zwróconym przez dostawcę dokumentów.

Bezpośredni dostęp do dokumentu

Od Androida 8.0 (poziom interfejsu API 26) możesz używać metody getDocumentUri() do pobierania identyfikatora URI, który odwołuje się do tego samego dokumentu co dany element mediaUri. Zwrócony identyfikator URI jest jednak oparty na DocumentsProvider, dlatego menedżerowie kolekcji multimediów mogą bezpośrednio uzyskiwać dostęp do dokumentu bez konieczności przeszukiwania drzew katalogów o zakresie. Dzięki temu menedżerowie multimediów mogą znacznie szybciej wykonywać operacje na dokumencie.

Uwaga: metoda getDocumentUri() wyszukuje tylko pliki multimedialne i nie przyznaje aplikacjom uprawnień dostępu do tych plików. Więcej informacji o uzyskiwaniu dostępu do plików multimedialnych znajdziesz w dokumentacji referencyjnej.

Ścieżki do dokumentów

Jeśli korzystasz z platformy Storage Access Framework na Androidzie 8.0 (poziom interfejsu API 26), możesz użyć metody findDocumentPath() dostępnej zarówno w klasach DocumentsContract, jak i DocumentsProvider, aby określić ścieżkę z katalogu głównego systemu plików o określonym identyfikatorze dokumentu. Metoda zwraca tę ścieżkę w obiekcie DocumentsContract.Path. Jeśli system plików ma wiele zdefiniowanych ścieżek do tego samego dokumentu, metoda zwraca ścieżkę, która najczęściej dociera do dokumentu o danym identyfikatorze.

Ta funkcja jest szczególnie przydatna w tych przypadkach:

  • Aplikacja używa okna „Zapisz jako”, które wyświetla lokalizację konkretnego dokumentu.
  • Aplikacja wyświetla foldery w widoku wyników wyszukiwania i musi wczytać dokumenty podrzędne, które znajdują się w określonym folderze, jeśli użytkownik wybierze ten folder.

Uwaga: jeśli aplikacja ma uprawnienia dostępu tylko do niektórych dokumentów na ścieżce, wartość zwracana findDocumentPath() obejmuje tylko te foldery i dokumenty, do których aplikacja ma dostęp.

Monitorowanie odtwarzania dźwięku

Usługa systemowa AudioManager przechowuje listę aktywnych obiektów AudioPlaybackConfiguration, z których każdy zawiera informacje o konkretnej sesji odtwarzania dźwięku. Aplikacja może pobrać zestaw obecnie aktywnych konfiguracji, wywołując funkcję getActivePlaybackConfigurations().

Od Androida 8.0 (poziom interfejsu API 26) możesz zarejestrować wywołanie zwrotne, które powiadomi aplikację o zmianie co najmniej 1 obiektu AudioPlaybackConfiguration. Aby to zrobić, wywołaj registerAudioPlaybackCallback(), przekazując wystąpienie kodu AudioManager.AudioPlaybackCallback. Klasa AudioManager.AudioPlaybackCallback zawiera metodę onPlaybackConfigChanged(), która jest wywoływana przez system, gdy zmieni się konfiguracja odtwarzania dźwięku.

Połączenia

Wi-Fi

Android 8.0 (poziom interfejsu API 26) dodaje obsługę sieci Wi-Fi Aware, która opiera się na specyfikacji sieci Awareness Networking (NAN). Na urządzeniach z odpowiednim sprzętem obsługującym Wi-Fi aplikacje i urządzenia w pobliżu mogą wykrywać sieć Wi-Fi i komunikować się przez nią bez punktu dostępu do internetu. Pracujemy z naszymi partnerami sprzętowymi, aby jak najszybciej wprowadzić technologię Wi-Fi Aware na urządzenia. Informacje o integracji Wi-Fi Aware z aplikacją znajdziesz na stronie Wi-Fi Aware.

Bluetooth

Android 8.0 (poziom interfejsu API 26) wzbogaca obsługę Bluetootha na platformie o te funkcje:

  • Obsługa standardu AVRCP 1.4, który umożliwia przeglądanie biblioteki utworów.
  • Obsługa standardu Bluetooth Low-Energy (BLE) 5.0.
  • Integracja kodeka Sony LDAC ze stosem Bluetooth.

Parowanie urządzenia towarzyszącego

Android 8.0 (poziom interfejsu API 26) udostępnia interfejsy API, które umożliwiają dostosowanie okna prośby o sparowanie podczas próby sparowania urządzenia towarzyszącego przez Bluetooth, BLE lub Wi-Fi. Więcej informacji znajdziesz w artykule na temat parowania urządzenia towarzyszącego.

Więcej informacji o korzystaniu z Bluetootha na Androidzie znajdziesz w przewodniku na temat Bluetootha. Informacje o zmianach w ustawieniach Bluetooth dotyczących Androida 8.0 (poziom interfejsu API 26) można znaleźć w sekcji Bluetooth na stronie Zmiany działania w Androidzie 8.0.

Udostępnianie

Inteligentne udostępnianie

Android 8.0 (poziom interfejsu API 26) poznaje spersonalizowane preferencje użytkowników w zakresie udostępniania i lepiej rozumie poszczególne typy treści, które nadają się do udostępniania w aplikacjach. Jeśli na przykład użytkownik robi zdjęcie rachunku, Android 8.0 może zaproponować aplikację do śledzenia wydatków. Jeśli użytkownik zrobi selfie, lepiej nim obsłuży aplikacja mediów społecznościowych. Android 8.0 automatycznie uczy się tych wszystkich wzorców zgodnie ze spersonalizowanymi preferencjami użytkowników.

Inteligentne udostępnianie działa w przypadku treści innych niż image, np. audio, video, text, URL itp.

Aby włączyć inteligentne udostępnianie, dodaj do intencji udostępniającej treści ArrayList z maksymalnie 3 adnotacjami w postaci ciągów znaków. Adnotacje powinny opisywać główne składniki lub tematy w treści. Poniższy przykładowy kod pokazuje, jak dodać adnotacje do intencji:

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

Więcej informacji o adnotacjach do inteligentnego udostępniania znajdziesz tutaj: EXTRA_CONTENT_ANNOTATIONS.

Klasyfikator tekstu

Na zgodnych urządzeniach aplikacje mogą używać nowego klasyfikatora tekstu, aby sprawdzić, czy ciąg znaków pasuje do znanego typu encji klasyfikatora, i uzyskać sugerowane alternatywy do wyboru. Jednostki rozpoznawane przez system obejmują adresy, URL-e, numery telefonów i adresy e-mail. Więcej informacji: TextClassifier.

Ułatwienia dostępu

Android 8.0 (poziom interfejsu API 26) obsługuje kilka nowych ułatwień dostępu dla programistów tworzących własne usługi ułatwień dostępu:

Więcej informacji o ułatwieniach dostępu w aplikacji znajdziesz w sekcji Ułatwienia dostępu.

Prywatność i bezpieczeństwo

Uprawnienia

Android 8.0 (poziom interfejsu API 26) wprowadza kilka nowych uprawnień związanych z telefonami:

  • Uprawnienie ANSWER_PHONE_CALLS pozwala aplikacji na automatyczne odbieranie przychodzących połączeń telefonicznych. Aby obsługiwać przychodzące połączenie telefoniczne w aplikacji, możesz użyć metody acceptRingingCall().
  • Uprawnienie READ_PHONE_NUMBERS przyznaje aplikacji dostęp do odczytu numerów telefonów zapisanych na urządzeniu.

Te uprawnienia są klasyfikowane jako niebezpieczne i należą do grupy uprawnień PHONE.

Nowe interfejsy API wykrywania dostępu do kont

Android 8.0 (poziom interfejsu API 26) wprowadza kilka ulepszeń w sposobie uzyskiwania dostępu przez aplikacje do kont użytkowników. W przypadku kont, którymi zarządzają, weryfikatorzy mogą za pomocą własnych zasad decydować, czy ukrywać konta w danej aplikacji, czy je ujawniać. System Android śledzi aplikacje, które mają dostęp do konkretnego konta.

W poprzednich wersjach Androida aplikacje, które chcieli śledzić listę kont użytkowników, musiały otrzymywać aktualizacje dotyczące wszystkich kont, w tym kont o niepowiązanych typach. Android 8.0 dodaje metodę addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]), która umożliwia aplikacjom tworzenie listy rodzajów kont, w przypadku których zmiany na koncie mają zostać wprowadzone.

Zmiany interfejsu API

AccountManager udostępnia 6 nowych metod ułatwiających uwierzytelnianiem zarządzanie dostępem do konta przez aplikacje:

Android 8.0 (poziom interfejsu API 26) wprowadza 2 specjalne wartości nazwy pakietu, aby określać poziomy widoczności aplikacji, które nie zostały ustawione za pomocą metody setAccountVisibility(android.accounts.Account, java.lang.String, int). Wartość PACKAGE_NAME_KEY_LEGACY_VISIBLE widoczności jest stosowana do aplikacji z uprawnieniami GET_ACCOUNTS i docelowych wersji Androida starszych niż 8.0 lub których podpis jest zgodny z mechanizmem uwierzytelniania kierowanym na dowolną wersję Androida. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE podaje domyślną wartość widoczności aplikacji, które nie zostały wcześniej skonfigurowane i w przypadku których nie można zastosować elementu PACKAGE_NAME_KEY_LEGACY_VISIBLE.

Więcej informacji o nowych interfejsach API dostępu do konta i odkrywania znajdziesz w dokumentacji AccountManager i OnAccountsUpdateListener.

Testowanie

Testowanie z instrumentacją

Android 8.0 (poziom interfejsu API 26) zapewnia poniższe dodatkowe funkcje związane z testami narzędzi aplikacji.

Uruchom w innych niż domyślne procesy aplikacji

Możesz teraz określić, że test z instrumentacją ma być uruchamiany względem procesu spoza domyślnego procesu aplikacji. Ta konfiguracja jest przydatna, jeśli aplikacja zawiera wiele działań, które działają w różnych procesach.

Aby zdefiniować instrumentację procesów inną niż domyślna, przejdź do pliku manifestu, a następnie do odpowiedniego elementu <instrumentation>. Dodaj atrybut android:targetProcess i ustaw jego wartość na jedną z tych wartości:

  • Nazwa konkretnego procesu.
  • Rozdzielona przecinkami lista nazw procesów.
  • Symbol wieloznaczny ("*"), który umożliwia uruchamianie instrumentacji względem dowolnego uruchomionego procesu, który wykonuje kod w pakiecie określonym w atrybucie android:targetPackage.

W trakcie wykonywania testu z instrumentacją możesz sprawdzić, który proces testuje, wywołując funkcję getProcessName().

Raportowanie wyników podczas testu

Możesz teraz zgłaszać wyniki w trakcie wykonywania testu z instrumentacją (a nie po jego zakończeniu), wywołując funkcję addResults().

Imitacje intencji testów

Aby ułatwić tworzenie izolowanych, niezależnych testów interfejsu dotyczących aktywności aplikacji, w Androidzie 8.0 (poziom interfejsu API 26) wprowadziliśmy metodę onStartActivity(). Zastępujesz tę metodę w niestandardowej podklasie klasy Instrumentation.ActivityMonitor na potrzeby obsługi konkretnego zamiaru wywoływanego przez klasę testową.

Gdy klasa testowa wywołuje intencję, metoda zwraca obiekt „stub Instrumentation.ActivityResult” zamiast samej intencji. Korzystając w testach z tej pozorowanej logiki intencji, możesz się skupić na tym, jak aktywność przygotowuje i obsługuje intencje przekazywane do innego działania lub zupełnie innej aplikacji.

Środowisko wykonawcze i narzędzia

Optymalizacje platformy

Android 8.0 (poziom interfejsu API 26) wprowadza na platformę optymalizacje środowiska wykonawczego i inne optymalizacje, co przekłada się na poprawę wydajności. Optymalizacje te obejmują jednoczesne kompresowanie do czyszczenia pamięci, bardziej efektywne wykorzystanie pamięci i lokalizację kodu.

Te optymalizacje przyspieszą uruchamianie oraz wydajność zarówno w systemie operacyjnym, jak i w aplikacjach.

Zaktualizowana obsługa języka Java

Android 8.0 (poziom API 26) dodaje obsługę kilku dodatkowych interfejsów OpenJDK Java API:

Więcej informacji o klasach i metodach w tych nowo dodanych pakietach znajdziesz w dokumentacji interfejsów API.

Jeśli chcesz korzystać z funkcji językowych Java 8 w Android Studio, pobierz najnowszą wersję testową.

Zaktualizowane interfejsy ICU4J Android Framework API

Android 8.0 (poziom interfejsu API 26) stanowi rozszerzenie interfejsów API platformy ICU4J Android Framework, które są podzbiorem interfejsów API ICU4J, do użytku przez deweloperów aplikacji w ramach pakietu android.icu. Te interfejsy API korzystają z danych lokalizacyjnych dostępnych na urządzeniu, dzięki czemu możesz zmniejszyć rozmiar pliku APK, nie kompilowając bibliotek IU4J w pakiecie.

Tabela 1. Wersje ICU, CLDR i Unicode używane na Androidzie.

Poziom Android API Wersja ICU Wersja CLDR Wersja Unicode
Android 7.0 (poziom API 24), Android 7.1 (poziom API 25) 56 28 z Androidem 8.0
Android 8.0 (poziom 26 interfejsu API) 58,2 30,0.3 9.0

Więcej informacji o internacjonalizacji na Androidzie, w tym o obsłudze IU4J, znajdziesz w artykule Internacjonalizacja na Androidzie.

Android Enterprise

Na urządzeniach z Androidem 8.0 (poziom API 26) wprowadziliśmy nowe funkcje i interfejsy API dla firm. Najważniejsze funkcje:

  • Profile służbowe na w pełni zarządzanych urządzeniach pozwalają firmom oddzielić pracę od danych osobistych, jednocześnie zarządzając oboma tymi funkcjami.
  • Przekazywanie dostępu do interfejsu API umożliwia właścicielom urządzeń i właścicielom profili przypisywanie zarządzania aplikacjami do innych aplikacji.
  • Usprawnienia obsługi administracyjnej użytkowników (m.in. nowe opcje dostosowywania) skracają czas konfiguracji.
  • Nowe opcje kontroli nad Bluetoothem, Wi-Fi, kopiami zapasowymi i zabezpieczeniami umożliwiają firmom zarządzanie większą częścią urządzenia. Logowanie aktywności w sieci pomaga firmom wykrywać problemy.

Więcej informacji o tych i innych nowych interfejsach API i funkcjach Androida dla firm znajdziesz w artykule Android Enterprise.