Interfejsy API Androida 5.0

Poziom API: 21

Android 5.0 (Lollipop) oferuje nowe funkcje dla użytkowników i programistów aplikacji. Ten dokument zawiera wprowadzenie do najbardziej znanych nowych interfejsów API.

Jeśli masz opublikowaną aplikację, zapoznaj się z zmianami w działaniu Androida 5.0, które musisz uwzględnić w swojej aplikacji. Te zmiany w działaniu mogą mieć wpływ na Twoją aplikację na urządzeniach z Androidem 5.0, nawet jeśli nie używasz nowych interfejsów API ani nie kierujesz na nie nowych funkcji.

Aby ogólnie zapoznać się z nowymi funkcjami platformy, poczytaj o najważniejszych funkcjach Androida Lollipop.

Zacznij programować

Aby zacząć tworzyć aplikacje na Androida 5.0, musisz najpierw pobrać pakiet Android SDK. Następnie za pomocą Menedżera pakietu SDK pobierz obrazy systemu i platformy pakietu SDK Androida 5.0.

Zaktualizuj docelowy poziom interfejsu API

Aby lepiej zoptymalizować aplikację na urządzenia z Androidem 5.0, ustaw targetSdkVersion na "21", zainstaluj aplikację na obrazie systemu Android 5.0, przetestuj ją, a następnie opublikuj zaktualizowaną aplikację z tą zmianą.

Możesz używać interfejsów API Androida 5.0 oraz obsługiwać starsze wersje. W tym celu dodaj do kodu warunki, które sprawdzają poziom systemowego interfejsu API przed uruchomieniem interfejsów API, które nie są obsługiwane przez minSdkVersion. Więcej informacji o zapewnianiu zgodności wstecznej znajdziesz w artykule Obsługa różnych wersji platform.

Więcej informacji o tym, jak działają poziomy interfejsu API, znajdziesz w artykule Co to jest poziom interfejsu API?

Ważne zmiany w działaniu

Jeśli masz już opublikowaną aplikację na Androida, pamiętaj, że mogą na nią wpływać zmiany w Androidzie 5.0.

Więcej informacji znajdziesz w artykule Zmiany w Androidzie 5.0.

Interfejs

Obsługa Material Design

W Androidzie 5.0 wprowadziliśmy obsługę nowego stylu interfejsu Material Design. Możesz tworzyć aplikacje z interfejsem Material Design, które mają dynamiczny styl wizualny i naturalne przejścia elementów interfejsu, które są naturalne. Obejmuje ona:

  • Motyw Material
  • Wyświetlanie cieni
  • Widżet RecyclerView
  • rysowalne animacje i efekty stylu;
  • Animacje i efekty przejścia w Material Design
  • Animatory właściwości widoku na podstawie stanu widoku
  • Dostosowywane widżety interfejsu i paski aplikacji z kontrolowaną paletą kolorów
  • Animowane i nieanimowane elementy rysunkowe oparte na grafice wektorowej XML

Więcej informacji o dodawaniu do aplikacji funkcji Material Design znajdziesz w artykule Material Design.

Równoczesne dokumenty i działania na ekranie ostatnich

W poprzednich wersjach ekran Najnowsze mógł wyświetlać tylko jedno zadanie dla każdej aplikacji, z którą użytkownik ostatnio wchodził w interakcję. W razie potrzeby aplikacja może teraz otwierać więcej zadań związanych z dodatkowymi działaniami związanymi z dokumentami. Ta funkcja ułatwia wielozadaniowość, ponieważ umożliwia użytkownikom szybkie przełączanie się między poszczególnymi działaniami i dokumentami z poziomu ekranu ostatnich czynności, zapewniając spójne przełączanie między wszystkimi aplikacjami. Przykładami takich równoczesnych zadań mogą być otwieranie kart w przeglądarce internetowej, dokumenty w aplikacji zwiększającej produktywność, równoczesne rozgrywki w grze lub czaty w aplikacji do obsługi wiadomości. Zadaniami aplikacji można zarządzać za pomocą klasy ActivityManager.AppTask.

Aby wstawić przerwę logiczną, tak aby system potraktował Twoją aktywność jako nowe zadanie, użyj FLAG_ACTIVITY_NEW_DOCUMENT przy uruchamianiu aktywności przy użyciu startActivity(). Takie działanie można też uzyskać, ustawiając w pliku manifestu atrybut documentLaunchMode elementu <activity> wartość "intoExisting" lub "always".

Aby nie zaśmiecać ekranu ostatnich działań, możesz ustawić maksymalną liczbę zadań z aplikacji, które mogą się na nim wyświetlać. W tym celu ustaw atrybut <aplikacja> android:maxRecents. Obecnie można ustawić maksymalnie 50 zadań na użytkownika (25 w przypadku urządzeń z małą ilością pamięci RAM).

Zadania na ekranie Ostatnie mogą być zachowywane po ponownym uruchomieniu. Aby kontrolować zachowanie trwałości, użyj atrybutu android:persistableMode. Możesz też zmienić właściwości wizualne aktywności na ekranie ostatnich, takie jak kolor, etykieta i ikona, wywołując metodę setTaskDescription().

Aktualizacje WebView

Android 5.0 aktualizuje implementację WebView w Chromium M37, wprowadzając ulepszenia dotyczące bezpieczeństwa i stabilności oraz poprawki błędów. Domyślny ciąg znaków klienta użytkownika dla WebView systemu Android 5.0 został zaktualizowany i zawiera numer wersji 37.0.0.0.

W tej wersji wprowadziliśmy klasę PermissionRequest, która umożliwia aplikacji przyznawanie WebView uprawnień dostępu do chronionych zasobów, takich jak kamera i mikrofon, przez internetowe interfejsy API, np. getUserMedia(). Aby aplikacja WebView mogła przyznać te uprawnienia, aplikacja musi mieć odpowiednie uprawnienia na Androidzie dotyczące tych zasobów.

Dzięki nowej metodzie onShowFileChooser() możesz teraz używać pola formularza wprowadzania danych w WebView i uruchamiać selektor plików, aby wybierać obrazy i pliki na urządzeniu z Androidem.

Dodatkowo w tej wersji wprowadzono obsługę otwartych standardów WebAudio, WebGL i WebRTC. Więcej informacji o nowych funkcjach dostępnych w tej wersji znajdziesz w artykule Komponent WebView na Androida.

Wykonywanie zrzutów ekranu i udostępnianie ich

Android 5.0 umożliwia dodawanie do aplikacji funkcji przechwytywania i udostępniania ekranu za pomocą nowych interfejsów API android.media.projection. Ta funkcja przydaje się na przykład, gdy chcesz włączyć udostępnianie ekranu w aplikacji do wideokonferencji.

Nowa metoda createVirtualDisplay() pozwala aplikacji na przechwytywanie zawartości ekranu głównego (wyświetlanego domyślnego) w obiekcie Surface, który jest następnie przesyłany w sieci. Interfejs API umożliwia przechwytywanie tylko niezabezpieczonego zawartości ekranu, a nie dźwięku systemowego. Aby rozpocząć przechwytywanie ekranu, aplikacja musi najpierw poprosić użytkownika o pozwolenie, wyświetlając okno przechwytywania ekranu za pomocą uprawnienia Intent uzyskanego za pomocą metody createScreenCaptureIntent().

Przykład korzystania z nowych interfejsów API znajdziesz w klasie MediaProjectionDemo w przykładowym projekcie.

Powiadomienia

Powiadomienia na ekranie blokady

Ekrany blokady w Androidzie 5.0 mogą wyświetlać powiadomienia. W Ustawieniach użytkownicy mogą wybrać, czy poufne informacje w powiadomieniach mają być wyświetlane na bezpiecznym ekranie blokady.

Aplikacja może kontrolować poziom szczegółowości widoczny, gdy jej powiadomienia są wyświetlane na zabezpieczonym ekranie blokady. Aby kontrolować poziom widoczności, wywołaj polecenie setVisibility() i podaj jedną z tych wartości:

  • VISIBILITY_PRIVATE: pokazuje podstawowe informacje, na przykład ikonę powiadomienia, ale ukrywa pełną treść powiadomienia.
  • VISIBILITY_PUBLIC: wyświetla pełną treść powiadomienia.
  • VISIBILITY_SECRET: nie wyświetla niczego oprócz ikony powiadomienia.

Gdy poziom widoczności wynosi VISIBILITY_PRIVATE, możesz też udostępnić zredagowaną wersję treści powiadomienia, która ukrywa dane osobowe. Na przykład aplikacja do obsługi SMS-ów może wyświetlić powiadomienie „Masz 3 nowe SMS-y”, ale ukrywa treść wiadomości i nadawców. Aby podać to alternatywne powiadomienie, najpierw utwórz powiadomienie zastępcze za pomocą elementu Notification.Builder. Podczas tworzenia obiektu powiadomienia prywatnego dołącz do niego powiadomienie o zastąpieniu, korzystając z metody setPublicVersion().

Metadane powiadomień

Android 5.0 używa metadanych powiązanych z powiadomieniami z aplikacji, aby sortować je w bardziej inteligentny sposób. Aby ustawić metadane, wywołaj w funkcji Notification.Builder te metody:

  • setCategory(): określa, jak system ma obsługiwać powiadomienia z aplikacji, gdy urządzenie jest w trybie priorytetowym (np. gdy powiadomienie dotyczy połączenia przychodzącego, wiadomości błyskawicznej lub alarmu).
  • setPriority(): oznacza powiadomienie jako bardziej lub mniej ważne niż zwykle. Powiadomienia z polem priorytetu ustawionym na PRIORITY_MAX lub PRIORITY_HIGH wyświetlają się w małym oknie, jeśli powiadomienie ma też dźwięk lub wibracje.
  • addPerson(): pozwala dodać 1 lub więcej osób powiązanych z powiadomieniem. Aplikacja może użyć tego parametru, aby zasygnalizować systemowi, że powinna grupować powiadomienia od określonych osób lub traktować je jako ważniejsze.

Grafika

Obsługa OpenGL ES 3.1

Android 5.0 zawiera interfejsy Java i natywną obsługę OpenGL ES 3.1. Najważniejsze nowe funkcje OpenGL ES 3.1 to:

  • Ściemniacze Compute
  • oddzielne obiekty cieniowania,
  • Polecenia pośredniego rysowania
  • Tekstury wielopróbkowe i szablonowe
  • Ulepszenia języka cieniowania
  • Rozszerzenia do zaawansowanych trybów mieszania i debugowania
  • Zgodność wsteczna z OpenGL ES 2.0 i 3.0

Interfejs Java w środowisku OpenGL ES 3.1 na urządzeniu z Androidem zawiera właściwość GLES31. Jeśli używasz OpenGL ES 3.1, pamiętaj, aby zadeklarować go w pliku manifestu za pomocą tagu <uses-feature> i atrybutu android:glEsVersion. Na przykład:

<manifest>
    <uses-feature android:glEsVersion="0x00030001" />
    ...
</manifest>

Więcej informacji o używaniu OpenGL ES, w tym o sprawdzaniu obsługiwanej wersji OpenGL ES na urządzeniu w czasie wykonywania, znajdziesz w przewodniku po interfejsie OpenGL ES API.

Pakiet rozszerzeń do Androida

Oprócz OpenGL ES 3.1 ta wersja zawiera pakiet rozszerzeń z interfejsami Java i natywną obsługą zaawansowanych funkcji graficznych. Te rozszerzenia są traktowane przez Androida jako pojedynczy pakiet. (jeśli jest obecne rozszerzenie ANDROID_extension_pack_es31a, aplikacja może założyć, że wszystkie rozszerzenia w pakiecie są obecne, i włączyć funkcje języka cieniowania za pomocą pojedynczego instrukcji #extension).

Pakiet rozszerzeń obsługuje:

  • Gwarantowana obsługa cieniowania fragmentów w buforach pamięci masowej cieniowania, obrazach i obiektach atomowych (w przypadku OpenGL ES 3.1 obsługa cieniowania fragmentów jest opcjonalna).
  • Shadery tesselacji i geometryczne
  • Format kompresji tekstur ASTC (LDR)
  • Interpolacja i cieniowanie na próbkę
  • różne tryby mieszania dla każdego kolorowego załącznika w buforze ramki.

Interfejs pakietu rozszerzeń w Javie udostępnia GLES31Ext. W manifeście aplikacji możesz zadeklarować, że aplikację można zainstalować tylko na urządzeniach, które obsługują pakiet rozszerzeń. Na przykład:

<manifest>
    <uses-feature android:name=“android.hardware.opengles.aep”
        android:required="true" />
    ...
</manifest>

Multimedia

Interfejs Camera API do obsługi zaawansowanych funkcji aparatu

W Androidzie 5.0 wprowadziliśmy nowy interfejs API android.hardware.camera2, który ułatwia precyzyjne robienie zdjęć i przetwarzanie obrazów. Teraz możesz automatycznie uzyskiwać dostęp do urządzeń z aparatami dostępnymi w systemie za pomocą usługi getCameraIdList() i łączyć się z konkretnymi urządzeniami za pomocą openCamera(). Aby zacząć robić zdjęcia, utwórz CameraCaptureSession i wskaż obiekty Surface, do których mają być wysyłane zdjęcia. CameraCaptureSession można skonfigurować tak, aby robił pojedyncze zdjęcia lub większą liczbę zdjęć serii.

Aby otrzymywać powiadomienia o przechwyceniu nowych obrazów, zaimplementuj detektor CameraCaptureSession.CaptureCallback i ustaw go w żądaniu przechwytywania. Teraz, gdy system zrealizuje żądanie zapisu obrazu, detektor CameraCaptureSession.CaptureCallback otrzyma wywołanie onCaptureCompleted(), co dostarczy Ci metadane przechwytywania obrazu w formacie CaptureResult.

Klasa CameraCharacteristics pozwala aplikacji wykrywać, które funkcje aparatu są dostępne na urządzeniu. Właściwość INFO_SUPPORTED_HARDWARE_LEVEL obiektu określa poziom funkcjonalności kamery.

  • Wszystkie urządzenia obsługują co najmniej poziom sprzętowy INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, który ma możliwości zbliżone do wycofanego interfejsu API Camera.
  • Urządzenia, które obsługują poziom sprzętowy INFO_SUPPORTED_HARDWARE_LEVEL_FULL, mogą ręcznie kontrolować przechwytywanie i przetwarzanie, a także robić zdjęcia o wysokiej rozdzielczości przy dużej liczbie klatek.

Aby dowiedzieć się, jak korzystać ze zaktualizowanego interfejsu API Camera, zapoznaj się z przykładami implementacji Camera2Basic i Camera2Video w tej wersji.

Odtwarzanie dźwięku

W tej wersji wprowadziliśmy następujące zmiany w AudioTrack:

  • Twoja aplikacja może teraz dostarczać dane audio w formacie zmiennoprzecinkowym (ENCODING_PCM_FLOAT). Umożliwia to większy zakres dynamiczny, bardziej spójną dokładność i większy headroom. Argumenty zmiennoprzecinkowe są szczególnie przydatne podczas obliczeń pośrednich. Punkty końcowe odtwarzania używają w przypadku danych audio formatu liczb całkowitych i mają mniejszą głębię bitową. (w Androidzie 5.0 niektóre części wewnętrznego potoku nie są jeszcze oparte na liczbach zmiennoprzecinkowych).
  • Twoja aplikacja może teraz dostarczać dane audio w postaci pliku ByteBuffer, w tym samym formacie co MediaCodec.
  • Opcja WRITE_NON_BLOCKING może uprościć buforowanie i wielowątkowe działanie niektórych aplikacji.

Sterowanie odtwarzaniem multimediów

Użyj nowych interfejsów API powiadomień i multimediów, aby interfejs użytkownika systemu wiedział o odtwarzaniu multimediów i mógł wyodrębnić oraz wyświetlić okładkę albumu. Dzięki nowym klasom MediaSession i MediaController sterowanie odtwarzaniem multimediów w interfejsie i usłudze jest teraz łatwiejsze.

Nowa klasa MediaSession zastępuje wycofaną klasę RemoteControlClient i zawiera jeden zestaw metod wywołania zwrotnego do obsługi elementów sterujących transportu i przycisków multimediów. Jeśli Twoja aplikacja umożliwia odtwarzanie multimediów i działa na Androidzietelewizor lub Wear, użyj klasy MediaSession, aby obsługiwać elementy sterujące komunikacją przy użyciu tych samych metod wywołania zwrotnego.

Teraz możesz utworzyć własną aplikację kontrolera multimediów przy użyciu nowej klasy MediaController. Ta klasa umożliwia monitorowanie i kontrolowanie odtwarzania multimediów z poziomu interfejsu aplikacji. Podczas tworzenia kontrolera określ obiekt MediaSession.Token, aby aplikacja mogła wchodzić w interakcję z danym MediaSession. Za pomocą metod MediaController.TransportControls możesz wysyłać polecenia takie jak play(), stop(), skipToNext() i setRating(), aby kontrolować odtwarzanie multimediów w tej sesji. Za pomocą kontrolera możesz też zarejestrować obiekt MediaController.Callback, aby nasłuchiwać zmian metadanych i stanu w sesji.

Możesz też tworzyć powiadomienia rozszerzone, które umożliwiają sterowanie odtwarzaniem powiązane z sesją multimediów za pomocą nowej klasy Notification.MediaStyle.

Przeglądanie multimediów

Android 5.0 umożliwia aplikacjom przeglądanie multimediów z biblioteki innej aplikacji za pomocą nowego interfejsu API android.media.browse. Aby udostępnić treści multimedialne w aplikacji, rozszerz klasę MediaBrowserService. Implementacja interfejsu MediaBrowserService powinna zapewniać dostęp do interfejsu MediaSession.Token, aby aplikacje mogły odtwarzać treści multimedialne udostępniane przez Twoją usługę.

Aby wejść w interakcję z usługą przeglądarki multimediów, użyj klasy MediaBrowser. Podaj nazwę komponentu MediaSession podczas tworzenia instancji MediaBrowser. Za pomocą tej instancji przeglądarki aplikacja może połączyć się z powiązaną usługą i uzyskać obiekt MediaSession.Token, aby odtworzyć treści udostępnione przez tę usługę.

Miejsce na dane

Wybór katalogu

Android 5.0 rozszerza platformę Storage Access Framework, pozwalając użytkownikom wybrać całe podrzędne drzewo katalogu, zapewniając aplikacjom uprawnienia do odczytu i zapisu wszystkich zawartych w nim dokumentów bez konieczności potwierdzenia przez użytkownika każdego elementu.

Aby wybrać poddrzewo katalogu, utwórz i wyślij intencję OPEN_DOCUMENT_TREE. System wyświetla wszystkie instancje DocumentsProvider, które obsługują wybór poddrzewa, pozwalając użytkownikowi przejrzeć i wybrać katalog. Zwrócony identyfikator URI reprezentuje dostęp do wybranego poddrzewa. Następnie możesz użyć funkcji buildChildDocumentsUriUsingTree() i buildDocumentUriUsingTree() oraz query() do zbadania poddrzewa.

Nowa metoda createDocument() pozwala tworzyć nowe dokumenty lub katalogi w dowolnym miejscu w poddrzewie. Aby zarządzać istniejącymi dokumentami, użyj opcji renameDocument() i deleteDocument(). Sprawdź COLUMN_FLAGS, aby uzyskać informacje o obsługiwanych przez operatora telefonach.

Jeśli wdrażasz DocumentsProvider i chcesz obsługiwać wybór poddrzewa, wdróż isChildDocument() i uwzględnij FLAG_SUPPORTS_IS_CHILD w swoim COLUMN_FLAGS.

Android 5.0 wprowadza też nowe katalogi na współdzielonym nośniku, w których aplikacja może umieszczać pliki multimedialne, aby uwzględnić je w MediaStore. Nowa funkcja getExternalMediaDirs() zwraca ścieżki do tych katalogów na wszystkich urządzeniach z udostępnionym miejscem na dane. Podobnie jak w przypadku zasady getExternalFilesDir(), aplikacja nie potrzebuje żadnych dodatkowych uprawnień, aby uzyskać dostęp do zwróconych ścieżek. Platforma okresowo skanuje te katalogi pod kątem nowych multimediów, ale możesz też użyć opcji MediaScannerConnection, aby skanować je pod kątem nowych treści.

Sieci bezprzewodowe i połączenia

Wiele połączeń sieciowych

Android 5.0 udostępnia nowe interfejsy API obsługujące wiele sieci, które umożliwiają dynamiczne skanowanie dostępnych sieci o określonych możliwościach i nawiązywanie z nimi połączenia. Ta funkcja jest przydatna, gdy Twoja aplikacja wymaga specjalistycznej sieci, takiej jak SUPL, MMS czy sieć rozliczeniowa, albo gdy chcesz wysyłać dane za pomocą określonego typu protokołu transportowego.

Aby wybrać sieć i połączyć się z nią dynamicznie z aplikacji, wykonaj te czynności:

  1. Utwórz ConnectivityManager.
  2. Użyj klasy NetworkRequest.Builder, aby utworzyć obiekt NetworkRequest i określić funkcje sieci oraz typ transportu, które interesują Twoją aplikację.
  3. Aby skanować w poszukiwaniu odpowiednich sieci, wywołaj requestNetwork() lub registerNetworkCallback() i przekaż obiekt NetworkRequest oraz implementację ConnectivityManager.NetworkCallback. Jeśli chcesz aktywnie przełączyć się na odpowiednią sieć po jej wykryciu, użyj metody requestNetwork(). Aby otrzymywać tylko powiadomienia o skanowanych sieciach bez aktywnego przełączania, użyj metody registerNetworkCallback().

Gdy system wykryje odpowiednią sieć, połączy się z nią i wywoła funkcję onAvailable(). Możesz użyć obiektu Network z wywołania zwrotnego, aby uzyskać dodatkowe informacje o sieci lub przekierować ruch do wybranej sieci.

Bluetooth Low Energy

Android 4.3 wprowadził obsługę platformy Bluetooth Low Energy (Bluetooth LE) w centralnej roli. W Androidzie 5.0 urządzenie z Androidem może pełnić funkcję urządzenia peryferyjnego Bluetootha LE. Aplikacje mogą używać tej funkcji, aby informować urządzenia w pobliżu o swojej obecności. Można na przykład tworzyć aplikacje, które pozwalają urządzeniu pełnić funkcję krokomierza lub monitora stanu zdrowia i przekazywać dane do innego urządzenia Bluetooth LE.

Nowe interfejsy API android.bluetooth.le umożliwiają aplikacjom transmitowanie reklam, skanowanie w poszukiwaniu odpowiedzi i nawiązywanie połączeń z pobliskimi urządzeniami Bluetooth LE. Aby korzystać z nowych funkcji reklamowych i skanowania, dodaj do pliku manifestu uprawnienia BLUETOOTH_ADMIN. Gdy użytkownicy aktualizują lub pobierają aplikację ze Sklepu Play, proszą o przyznanie aplikacji tych uprawnień: „Informacje o połączeniu Bluetooth: umożliwia aplikacji sterowanie Bluetoothem, w tym przesyłanie i odbieranie informacji o urządzeniach Bluetooth w pobliżu”.

Aby rozpocząć reklamowanie przez Bluetooth LE, aby inne urządzenia mogły wykryć Twoją aplikację, wywołaj funkcję startAdvertising() i przekaż implementację klasy AdvertiseCallback. Obiekt wywołania zwrotnego otrzymuje raport o udanej lub nieudanej operacji reklamowej.

Android 5.0 wprowadza klasę ScanFilter, dzięki czemu aplikacja może skanować tylko w poszukiwaniu określonych typów urządzeń, które ją interesują. Aby rozpocząć skanowanie w poszukiwaniu urządzeń Bluetooth, wywołaj startScan() i przekaż listę filtrów. W wywołaniu metody musisz też podać implementację ScanCallback, aby zgłaszać znalezienie reklamy Bluetooth LE.

Ulepszenia NFC

W Androidzie 5.0 wprowadziliśmy te ulepszenia, by umożliwić szersze i bardziej elastyczne korzystanie z NFC:

  • Android Beam jest teraz dostępny w menu udostępniania.
  • Aplikacja może wywołać Android Beam na urządzeniu użytkownika, aby udostępnić dane, wywołując funkcję invokeBeam(). Dzięki temu użytkownik nie musi ręcznie dotykać urządzenia innym urządzeniem z obsługą NFC, aby przeprowadzić transfer danych.
  • Za pomocą nowej metody createTextRecord() możesz utworzyć rekord NDEF zawierający dane tekstowe w formacie UTF-8.
  • Jeśli opracowujesz aplikację płatniczą, możesz teraz dynamicznie rejestrować identyfikator aplikacji NFC (AID) za pomocą wywołania registerAidsForService(). Możesz też użyć setPreferredService(), aby ustawić preferowaną usługę emulacji kart, która ma być używana, gdy określona aktywność działa na pierwszym planie.

Projekt Volta

Oprócz nowych funkcji Android 5.0 kładzie nacisk na wydłużenie czasu pracy baterii. Używaj nowych interfejsów API i narzędzia, aby analizować i optymalizować zużycie energii przez aplikacje.

Planowanie zadań

Android 5.0 udostępnia nowy interfejs API JobScheduler, który pozwala zoptymalizować czas pracy baterii przez definiowanie zadań do wykonania asynchronicznie w późniejszym czasie lub w określonych warunkach (np. gdy urządzenie jest ładowane). Planowanie zadań jest przydatne w tych sytuacjach:

  • Aplikacja zawiera zadania nieprzeznaczone dla użytkowników, które możesz odłożyć.
  • Aplikacja ma funkcję, którą wolisz wykonywać, gdy urządzenie jest podłączone do zasilania.
  • Aplikacja ma zadanie, które wymaga dostępu do sieci lub połączenia z Wi-Fi.
  • Aplikacja ma pewną liczbę zadań, które chcesz uruchamiać jako wsad w regularnych odstępach czasu.

Jednostka pracy jest opakowana w obiekt JobInfo. Ten obiekt określa kryteria planowania.

Aby skonfigurować sposób wykonywania zaplanowanego zadania, użyj klasy JobInfo.Builder. Możesz zaplanować wykonywanie zadania w określonych warunkach, takich jak:

  • Uruchomienie podczas ładowania urządzenia
  • Uruchamiaj, gdy urządzenie jest połączone z siecią bez pomiaru
  • Uruchamianie, gdy urządzenie jest nieaktywne
  • Ukończenie przed określonym terminem lub z minimalnym opóźnieniem

Możesz na przykład dodać kod podobny do tego, aby uruchomić zadanie w sieci bez pomiaru:

Kotlin

val uploadTask: JobInfo = JobInfo.Builder(
        jobId,
        serviceComponent /* JobService component */
).run {
    setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    build()
}
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(uploadTask)

Java

JobInfo uploadTask = new JobInfo.Builder(jobId,
                                         serviceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED)
        .build();
JobScheduler jobScheduler =
        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);

Jeśli urządzenie ma stabilne zasilanie (czyli jest podłączone przez ponad 2 minuty i bateria ma odpowiednią pojemność), system uruchomi każde zaplanowane zadanie, które jest gotowe do wykonania, nawet jeśli nie minął jeszcze jego termin.

Aby zobaczyć przykład użycia interfejsu API JobScheduler, zapoznaj się z przykładową implementacją JobSchedulerSample w tej wersji.

Narzędzia dla programistów dotyczące wykorzystania baterii

Nowe polecenie dumpsys batterystats generuje interesujące dane statystyczne o wykorzystaniu baterii urządzenia, uporządkowane według unikalnego identyfikatora użytkownika (UID). Statystyki obejmują:

  • Historia zdarzeń związanych z baterią
  • Statystyki globalne urządzenia
  • Przybliżone zużycie energii przez UID i komponent systemu
  • Liczba ms na pakiet dla poszczególnych aplikacji mobilnych
  • Statystyki zbiorcze identyfikatora UID systemu
  • Zbiorcze statystyki dotyczące identyfikatora UID aplikacji

Użyj opcji --help, aby poznać różne opcje dostosowywania danych wyjściowych. Aby na przykład wydrukować statystyki wykorzystania baterii przez dany pakiet aplikacji od ostatniego ładowania urządzenia, uruchom to polecenie:

$ adb shell dumpsys batterystats --charged <package-name>

Możesz użyć narzędzia Battery Historian na wyjściu polecenia dumpsys, aby wygenerować z dzienników wizualizację HTML zdarzeń związanych z zasilaniem. Te informacje ułatwiają zrozumienie i diagnozowanie problemów z baterią.

Android w pracy i edukacji

Zarządzana obsługa administracyjna

Android 5.0 oferuje nowe funkcje uruchamiania aplikacji w środowisku firmowym. Administrator urządzenia może rozpocząć proces zarządzanej obsługi administracyjnej w celu dodania do urządzenia współdzielonego, ale oddzielnego profilu zarządzanego, jeśli użytkownik ma już konto osobiste. Aplikacje powiązane z profilami zarządzanymi są widoczne obok aplikacji nieobjętych zarządzaniem w wyszukiwarce, na ekranie Ostatnie i w powiadomieniach.

Aby rozpocząć proces obsługi administracyjnej, wyślij ACTION_PROVISION_MANAGED_PROFILE w Intent. Jeśli wywołanie się powiedzie, system aktywuje wywołanie zwrotne onProfileProvisioningComplete(). Następnie możesz zadzwonić pod numer setProfileEnabled(), aby włączyć ten profil zarządzany.

Domyślnie w profilu zarządzanym włączona jest tylko niewielka część aplikacji. Dodatkowe aplikacje możesz zainstalować w profilu zarządzanym, wywołując metodę enableSystemApp().

Jeśli tworzysz aplikację Launcher, możesz użyć nowej klasy LauncherApps, aby uzyskać listę działań, które można uruchomić dla bieżącego użytkownika i wszystkich powiązanych profili zarządzanych. Menu z aplikacjami sprawia, że zarządzane aplikacje są dobrze widoczne, dołączając do ikony plakietkę służbową. Aby pobrać ikonę z plakietką, wywołaj getUserBadgedIcon().

Aby dowiedzieć się, jak korzystać z nowej funkcji, zapoznaj się z przykładem implementacji w tej wersji: BasicManagedProfile.

Właściciel urządzenia

Android 5.0 umożliwia wdrożenie aplikacji właściciela urządzenia. Właściciel urządzenia to specjalistyczny typ administratora urządzenia, który ma dodatkowe uprawnienia do tworzenia i usuwania użytkowników dodatkowych oraz konfigurowania ustawień globalnych na urządzeniu. Aplikacja właściciela urządzenia może używać metod klasy DevicePolicyManager, aby szczegółowo kontrolować konfigurację, zabezpieczenia i aplikacje na zarządzanych urządzeniach. Urządzenie może mieć tylko 1 aktywnego właściciela.

Aby wdrożyć i aktywować właściciela urządzenia, musisz przesłać dane NFC z aplikacji do programowania na to urządzenie bez obsługi administracyjnej. Ten transfer danych wysyła te same informacje co intencja udostępniania opisana w sekcji Zarządzanie udostępnianiem.

Przypinanie ekranu

Android 5.0 wprowadza nowy interfejs API do przypinania ekranu, który umożliwia tymczasowe ograniczenie możliwości opuszczenia zadania przez użytkowników lub przerywania im przez powiadomienia. Możesz tego użyć na przykład wtedy, gdy tworzysz aplikację edukacyjną, która obsługuje wymagania dotyczące ważnych egzaminów na Androidzie, lub aplikację kiosku do jednego celu. Gdy aplikacja aktywuje przypinanie ekranu, użytkownicy nie mogą wyświetlać powiadomień, uzyskiwać dostępu do innych aplikacji ani wracać do ekranu głównego, dopóki aplikacja nie wyjdzie z tego trybu.

Możesz aktywować przypinanie ekranu na 2 sposoby:

  • Ręcznie: użytkownicy mogą włączyć przypinanie ekranu w sekcji Ustawienia > Zabezpieczenia > Przypinanie ekranu i wybrać zadania, które chcą przypiąć, dotykając zielonej ikony szpilki na ekranie z ostatnio używanymi aplikacjami.
  • Automatycznie: aby automatycznie włączyć przypinanie ekranu, wywołaj startLockTask() w aplikacji. Jeśli aplikacja wysyłająca żądanie nie jest właścicielem urządzenia, użytkownik zobaczy prośbę o potwierdzenie. Aplikacja właściciela urządzenia może wywołać metodę setLockTaskPackages(), aby umożliwić przypinanie aplikacji bez potwierdzenia przez użytkownika.

Gdy blokowanie zadań jest aktywne, dzieje się tak:

  • Pasek stanu jest pusty, a powiadomienia i informacje o stanie użytkowników są ukryte.
  • Przyciski ekranu głównego i ostatnich aplikacji są ukryte.
  • Inne aplikacje nie mogą uruchamiać nowych aktywności.
  • Bieżąca aplikacja może uruchamiać nowe działania, o ile nie powoduje to tworzenia nowych zadań.
  • Gdy właściciel urządzenia wywoła przypięcie ekranu, użytkownik pozostanie zablokowany w aplikacji, dopóki nie wywoła funkcji stopLockTask().
  • Jeśli przypinanie ekranu zostało aktywowane przez inną aplikację, która nie jest właścicielem urządzenia, ani przez użytkownika, może on wyłączyć tę funkcję, przytrzymując przyciski Wstecz i Ostatnie.

Platforma drukowania

Renderuj plik PDF jako mapę bitową

Za pomocą nowej klasy PdfRenderer możesz teraz renderować strony dokumentu PDF na obrazy bitmapowe do drukowania. Musisz określić element ParcelFileDescriptor, który można przewijać (czyli treść może być otwierana w sposób losowy), w której system zapisuje treść do wydrukowania. Aplikacja może pobrać stronę do renderowania za pomocą funkcji openPage(), a potem wywołać funkcję render(), aby przekonwertować otwartą PdfRenderer.Page na bitmapę. Możesz też ustawić dodatkowe parametry, jeśli chcesz przekonwertować tylko część dokumentu na obraz bitmapowy (na przykład w celu wdrożenia renderowania płytkowego, aby powiększyć dokument).

Przykład użycia nowych interfejsów API znajdziesz w pliku PdfRendererBasic sample.

System

Statystyki użytkowania aplikacji

Możesz teraz uzyskać dostęp do historii korzystania z aplikacji na urządzeniu z Androidem za pomocą nowego interfejsu API android.app.usage. Ten interfejs API dostarcza bardziej szczegółowe informacje o wykorzystaniu niż wycofana metoda getRecentTasks(). Aby używać tego interfejsu API, musisz najpierw zadeklarować uprawnienia "android.permission.PACKAGE_USAGE_STATS" w pliku manifestu. Użytkownik musi też zezwolić na dostęp do tej aplikacji w sekcji Ustawienia > Bezpieczeństwo > Aplikacje z dostępem do danych.

System zbiera dane o korzystaniu z poszczególnych aplikacji, agregując je w okresach dziennych, tygodniowych, miesięcznych i rocznych. Maksymalny czas przechowywania tych danych przez system wynosi:

  • Dane dzienne: 7 dni
  • Dane tygodniowe: 4 tygodnie
  • Dane miesięczne: 6 miesięcy
  • Dane roczne: 2 lata

W przypadku każdej aplikacji system rejestruje te dane:

  • Ostatni raz, kiedy aplikacja była używana
  • Łączny czas, przez jaki aplikacja znajdowała się na pierwszym planie w tym przedziale czasu (według dnia, tygodnia, miesiąca lub roku)
  • Znak czasu rejestrujący, kiedy dany komponent (identyfikowany przez pakiet i nazwę aktywności) przeszedł na pierwszy lub drugi plan w ciągu dnia
  • Sygnatura czasowa reprezentująca moment zmiany konfiguracji urządzenia (np. zmiany orientacji urządzenia z powodu obrotu)

Testowanie i ułatwienia dostępu

Testowanie i ułatwienia dostępu

Android 5.0 zapewnia te funkcje testowania i ułatwień dostępu:

  • Nowe metody getWindowAnimationFrameStats()getWindowContentFrameStats() rejestrują statystyki dotyczące klatek dla animacji i treści okna. Te metody umożliwiają pisanie testów narzędziowych pozwalających ocenić, czy aplikacja renderuje ramki z wystarczającą częstotliwością odświeżania, aby zapewnić płynne działanie aplikacji.
  • Nowa metoda executeShellCommand()umożliwia wykonywanie poleceń powłoki z testu instrumentacji. Wykonywanie polecenia jest podobne do uruchamiania adb shell z hosta połączonego z urządzeniem, co pozwala na użycie narzędzi powłoki, takich jak dumpsys, am, content i pm.
  • Usługi ułatwień dostępu i narzędzia do testowania, które korzystają z interfejsów API ułatwień dostępu (takich jak UiAutomator), mogą teraz pobierać szczegółowe informacje o właściwościach okien na ekranie, z którymi mogą wchodzić w interakcje użytkownicy z dobrym wzrokiem. Aby pobrać listę obiektów AccessibilityWindowInfo, wywołaj nową metodę getWindows().
  • Nowa klasa AccessibilityNodeInfo.AccessibilityAction umożliwia zdefiniowanie standardowych lub niestandardowych działań do wykonania na obiekcie AccessibilityNodeInfo. Nowa klasa AccessibilityNodeInfo.AccessibilityAction zastępuje interfejsy API związane z działaniami, które wcześniej znajdowały się w AccessibilityNodeInfo.
  • Android 5.0 zapewnia dokładniejszą kontrolę nad syntezą tekstu na mowę w aplikacji. Nowa klasa Voice umożliwia aplikacji używanie profili głosowych powiązanych z określonymi językami, jakością, czasem oczekiwania oraz parametrami mechanizmu przetwarzania tekstu na mowę.

IME

Łatwiejsze przełączanie między językami wprowadzania

Począwszy od Androida 5.0 użytkownicy mogą łatwiej przełączać się między wszystkimi metodami wprowadzania (IME) obsługiwanymi przez platformę. Wybrana czynność przełączania (zwykle kliknięcie ikony kuli ziemskiej na klawiaturze programowej) powoduje przełączanie się między wszystkimi takimi edytorami. Ta zmiana w działaniu jest wdrażana przez metodę shouldOfferSwitchingToNextInputMethod().

Ponadto sprawdza teraz, czy następny IME zawiera mechanizm przełączania (czyli czy obsługuje przełączenie na następny IME). Edytor IME z mechanizmem przełączania nie przełącza się na taki sam edytor. Ta zmiana zachowania jest implementowana przez metodę switchToNextInputMethod().

Przykład użycia zaktualizowanych interfejsów API do przełączania metody IME znajdziesz w zaktualizowanym przykładzie implementacji klawiatury ekranowej w tej wersji. Więcej informacji o implementowaniu przełączania między IME znajdziesz w sekcji Tworzenie metody wprowadzania.

Deklaracje w pliku manifestu

Funkcje wymagane do zadeklarowania

Element <uses-feature> obsługuje teraz podane niżej wartości, dzięki czemu masz pewność, że aplikacja zostanie zainstalowana tylko na urządzeniach, które obsługują funkcje, których potrzebuje.

Uprawnienia użytkownika

Poniższe uprawnienie jest teraz obsługiwane w elemencie <uses-permission> w celu deklarowania uprawnień, których aplikacja potrzebuje w celu uzyskania dostępu do określonych interfejsów API.

  • BIND_DREAM_SERVICE: w przypadku kierowania na interfejs API na poziomie 21 lub wyższym usługa Daydream wymaga tego uprawnienia, aby zapewnić, że tylko system będzie mógł się z nią łączyć.