Interfejsy API Androida 5.0

Poziom API: 21

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

Jeśli masz opublikowaną aplikację, sprawdź zmiany w zachowaniu Androida 5.0, które należy 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 korzystasz z nowych interfejsów API ani nie kierujesz jej na nowe funkcje.

Aby dowiedzieć się więcej o nowych funkcjach platformy, obejrzyj najważniejsze informacje na temat Androida Lollipop.

Zacznij tworzyć aplikacje

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

Aktualizowanie docelowego poziomu interfejsu API

Aby lepiej zoptymalizować aplikację pod kątem urządzeń z Androidem 5.0, ustaw targetSdkVersion na "21", zainstaluj aplikację na obrazie systemu Android 5.0, przetestuj ją, a potem opublikuj zaktualizowaną aplikację z tą zmianą.

Możesz używać interfejsów API Androida 5.0, a jednocześnie obsługiwać starsze wersje. W tym celu dodaj do kodu warunki, które będą sprawdzać poziom interfejsu API systemu przed uruchomieniem interfejsów API, które nie są obsługiwane przez Twój minSdkVersion. Więcej informacji o utrzymywaniu zgodności wstecznej znajdziesz w artykule Obsługa różnych wersji platformy.

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 zmiany w Androidzie 5.0 mogą na nią wpływać.

Pełne informacje znajdziesz na stronie Zmiany w Androidzie 5.0.

Interfejs

Obsługa interfejsu Material Design

Android 5.0 zapewnia obsługę nowego stylu Material Design. Aplikacje w stylu Material Design są dynamiczne i mają naturalne przejścia elementów interfejsu. Ta pomoc obejmuje:

  • motyw Material Design,
  • Wyświetl cienie
  • Widżet RecyclerView
  • rysowalne animacje i efekty stylizacji
  • Animacja Material Design i efekty przejścia aktywności
  • Animatorzy usług widoku danych na podstawie jego stanu
  • Widżety i paski aplikacji z możliwością dostosowania do własnych preferencji
  • Animowane i nieanimowane obiekty rysowane na podstawie grafiki wektorowej XML

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

Równoczesne dokumenty i działania na ekranie ostatnich

W poprzednich wersjach ekran najnowszych wersji mógł wyświetlać tylko jedno zadanie dla każdej aplikacji, z którą użytkownik ostatnio korzystał. W razie potrzeby aplikacja może teraz otwierać więcej zadań związanych z dodatkowymi działaniami równoczesnymi w przypadku dokumentów. Ta funkcja ułatwia wielozadaniowość, umożliwiając użytkownikom szybkie przełączanie się między poszczególnymi czynnościami i dokumentami z poziomu ekranu ostatnich oraz spójne przełączanie się między wszystkimi aplikacjami. Przykładami takich zadań mogą być otwarte karty w przeglądarce, dokumenty w aplikacji zwiększającej produktywność, równoczesne mecze w grze czy czaty w aplikacji do obsługi wiadomości. Aplikacja może zarządzać swoimi zadaniami na zajęciach ActivityManager.AppTask.

Aby wstawić przerwę logiczną, dzięki której system będzie traktować Twoją aktywność jako nowe zadanie, użyj funkcji FLAG_ACTIVITY_NEW_DOCUMENT podczas uruchamiania działania za pomocą polecenia startActivity(). Możesz też uzyskać takie działanie, ustawiając w pliku manifestu atrybut documentLaunchMode elementu <activity> na "intoExisting" lub "always".

Aby nie zaśmiecać ekranu ostatnich, możesz ustawić maksymalną liczbę zadań aplikacji, które mogą się na nim pojawiać. Aby to zrobić, ustaw atrybut <application> android:maxRecents. Obecnie możesz określić maksymalnie 50 zadań na użytkownika (25 w przypadku urządzeń z małą ilością pamięci RAM).

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

Aktualizacje WebView

Android 5.0 aktualizuje wdrożenie WebView do Chromium M37, dodając ulepszenia w zakresie bezpieczeństwa i stabilności oraz poprawki błędów. Domyślny ciąg znaków klienta użytkownika dla aplikacji WebView korzystającej z Androida 5.0 został zaktualizowany, by uwzględnić numer wersji 37.0.0.0.

W tej wersji wprowadziliśmy klasę PermissionRequest, która umożliwia aplikacji przyznawanie uprawnień WebView dostępu do zabezpieczonych zasobów, takich jak kamera i mikrofon, za pomocą internetowych interfejsów API takich jak getUserMedia(). Aby aplikacja mogła przyznawać uprawnienia do WebView, aplikacja musi mieć odpowiednie uprawnienia Androida do tych zasobów.

Dzięki nowej metodzie onShowFileChooser() możesz teraz korzystać z pola formularza do wprowadzania danych w interfejsie WebView oraz uruchomić selektor plików, aby wybrać obrazy i pliki na urządzeniu z Androidem.

Dodatkowo ta wersja obsługuje otwarte standardy WebAudio, WebGL i WebRTC. Więcej informacji o nowych funkcjach wprowadzonych w tej wersji znajdziesz w artykule WebView na Androida.

Przechwytywanie i udostępnianie ekranu

Dzięki nowym interfejsom API android.media.projection możesz dodać do aplikacji funkcje przechwytywania ekranu i udostępniania go. Ta funkcja jest przydatna, gdy na przykład chcesz włączyć udostępnianie ekranu w aplikacji do rozmów wideo.

Nowa metoda createVirtualDisplay() umożliwia aplikacji przechwytywanie zawartości ekranu głównego (ekranu domyślnego) do obiektu Surface, który aplikacja może następnie wysyłać przez sieć. Interfejs API umożliwia przechwytywanie tylko niezabezpieczonych treści z ekranu, a nie dźwięku z systemu. Aby rozpocząć przechwytywanie ekranu, aplikacja musi najpierw poprosić użytkownika o zgodę, uruchamiając okno zrzutu ekranu za pomocą metody Intent uzyskanej za pomocą metody createScreenCaptureIntent().

Przykład wykorzystania 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. Użytkownicy mogą w Ustawieniach zezwolić na wyświetlanie poufnych treści powiadomień na bezpiecznym ekranie blokady.

Aplikacja może kontrolować poziom szczegółów widoczny, gdy jej powiadomienia są wyświetlane na bezpiecznym ekranie blokady. Aby kontrolować poziom widoczności, wywołaj funkcję setVisibility() i określ jedną z tych wartości:

Jeśli poziom widoczności to VISIBILITY_PRIVATE, możesz też udostępnić wersję powiadomienia z pominięciem, która ukrywa dane osobowe. Aplikacja do obsługi SMS-ów może na przykład wyświetlać powiadomienie „Masz 3 nowe SMS-y”, ale treść i nadawców nie są widoczne. Aby udostępnić to alternatywne powiadomienie, najpierw utwórz powiadomienie o wymianie za pomocą Notification.Builder. Gdy utworzysz obiekt powiadomienia prywatnego, załącz do niego powiadomienie o zmianie za pomocą metody setPublicVersion().

Metadane powiadomień

Android 5.0 używa metadanych powiązanych z powiadomieniami z aplikacji, aby inteligentniej sortować powiadomienia. Aby ustawić metadane, podczas tworzenia powiadomienia wywołaj w Notification.Builder te metody:

  • setCategory(): informuje system, jak ma obsługiwać powiadomienia z aplikacji, gdy urządzenie jest w trybie priorytetowym (np. jeśli powiadomienie przedstawia połączenie przychodzące, wiadomość czatu lub alarm).
  • setPriority(): oznacza powiadomienie jako ważniejsze lub mniej ważne niż normalne. Powiadomienia z polem priorytetu ustawionym na PRIORITY_MAX lub PRIORITY_HIGH pojawiają się w małym pływającym oknie, jeśli powiadomienie ma też dźwięk lub wibracje.
  • addPerson(): pozwala dodać jedną lub więcej osób, których dotyczy powiadomienie. Aplikacja może użyć tych informacji, aby zasygnalizować systemowi, że powinna grupować powiadomienia od określonych osób lub traktować powiadomienia od tych osób jako ważniejsze.

Grafika

Obsługa OpenGL ES 3.1

Android 5.0 dodaje interfejsy Java i wbudowaną obsługę OpenGL ES 3.1. Najważniejsze nowe funkcje dostępne w OpenGL ES 3.1 to:

  • Programy do cieniowania Compute
  • Oddziel obiekty cieniowania
  • Pośrednie polecenia rysowania
  • Wiele próbek i tekstur szablonowych
  • Ulepszenia języka cieniowania
  • Rozszerzenia do zaawansowanych trybów mieszania i debugowania
  • Zgodność wsteczna z platformą OpenGL ES 2.0 i 3.0

Interfejs Java dla OpenGL ES 3.1 na Androidzie jest udostępniany z GLES31. Jeśli używasz OpenGL ES 3.1, zadeklaruj to 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 korzystaniu z OpenGL ES, w tym o sprawdzaniu obsługiwanej wersji OpenGL ES w czasie działania urządzenia, znajdziesz w przewodniku po interfejsie OpenGL ES API.

Pakiet rozszerzeń na Androida

Oprócz OpenGL ES 3.1 ta wersja zawiera pakiet rozszerzeń z interfejsami Java i wbudowaną obsługą zaawansowanych funkcji graficznych. Android traktuje te rozszerzenia jako jeden pakiet. Jeśli występuje rozszerzenie ANDROID_extension_pack_es31a, aplikacja może wykorzystać wszystkie rozszerzenia w pakiecie i włączyć funkcje cieniowania za pomocą pojedynczej instrukcji #extension.

Pakiet rozszerzeń obsługuje:

  • Gwarantowana obsługa cieniowania fragmentów dla buforów pamięci, obrazów i atomowych funkcji cieniowania (obsługa programu do cieniowania fragmentów jest opcjonalna w OpenGL ES 3.1).
  • cieniowanie geometryczne i tessellingu;
  • Format kompresji tekstur ASTC (LDR)
  • Interpolacja i cieniowanie w poszczególnych próbkach
  • Różne tryby mieszania dla każdego załączonego koloru w buforze ramki

Interfejs Java pakietu rozszerzeń jest dostępny w GLES31Ext. W pliku manifestu aplikacji możesz zadeklarować, że aplikacja może być zainstalowana tylko na urządzeniach obsługujących pakiet rozszerzeń. Na przykład:

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

Multimedia

Interfejs API aparatu do zaawansowanych funkcji aparatu

W Androidzie 5.0 wprowadziliśmy nowy interfejs API android.hardware.camera2, który ułatwia precyzyjne robienie zdjęć i ich przetwarzanie. Teraz możesz automatycznie uzyskiwać dostęp do aparatów dostępnych w systemie getCameraIdList() i łączyć się z konkretnym urządzeniem za pomocą openCamera(). Aby zacząć robić zdjęcia, utwórz CameraCaptureSession i określ obiekty Surface, które mają wysyłać zrobione obrazy. Aparat CameraCaptureSession można skonfigurować tak, aby robił pojedyncze ujęcia lub wiele zdjęć serii.

Aby otrzymywać powiadomienia o zrobionych nowych obrazach, zaimplementuj detektor CameraCaptureSession.CaptureCallback i skonfiguruj go w żądaniu zapisu. Teraz, gdy system wykona żądanie wykonania obrazu, odbiornik CameraCaptureSession.CaptureCallback otrzyma wywołanie onCaptureCompleted(), które dostarczy Ci metadane zapisu obrazu w pliku CaptureResult.

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

  • Wszystkie urządzenia obsługują co najmniej poziom sprzętowy INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, który zapewnia możliwości mniej więcej takie same jak wycofanego interfejsu API Camera.
  • Urządzenia obsługujące poziom sprzętowy INFO_SUPPORTED_HARDWARE_LEVEL_FULL mogą ręcznie sterować przechwytywaniem i przetwarzaniem oraz nagrywaniem obrazów o wysokiej rozdzielczości z dużą liczbą 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

Ta wersja zawiera te zmiany w AudioTrack:

  • Twoja aplikacja może teraz przesyłać dane audio w formacie zmiennoprzecinkowej (ENCODING_PCM_FLOAT). Zapewnia to większy zakres dynamiczny, bardziej spójną precyzję i większy potencjał. Arytmetyka liczna zmiennoprzecinkowa jest szczególnie przydatna przy obliczeniach pośrednich. Punkty końcowe odtwarzania używają w przypadku danych audio formatu liczb całkowitych o mniejszej głębi bitowej. W Androidzie 5.0 części wewnętrznego potoku nie są jeszcze zmiennoprzecinkowe.
  • Twoja aplikacja może teraz dostarczać dane dźwiękowe jako ByteBuffer, w tym samym formacie, jaki zapewnia MediaCodec.
  • Opcja WRITE_NON_BLOCKING może uprościć buforowanie i wielowątkowość w przypadku niektórych aplikacji.

Sterowanie odtwarzaniem multimediów

Dzięki nowym interfejsom API powiadomień i multimediów możesz mieć pewność, że interfejs systemu wie o odtwarzanych multimediach, a także może wyodrębniać i wyświetlać okładki albumów. Sterowanie odtwarzaniem multimediów w interfejsie i usłudze jest teraz łatwiejsze dzięki nowym klasom MediaSession i MediaController.

Nowa klasa MediaSession zastępuje wycofaną klasę RemoteControlClient i udostępnia pojedynczy zestaw metod wywołania zwrotnego do obsługi elementów sterujących transportem i przycisków multimediów. Jeśli Twoja aplikacja umożliwia odtwarzanie multimediów i działa na platformie Android TV lub Wear, użyj klasy MediaSession do obsługi elementów sterujących transportu za pomocą tych samych metod wywołania zwrotnego.

Teraz możesz utworzyć własną aplikację kontrolera multimediów przy użyciu nowej klasy MediaController. Ta klasa zapewnia bezpieczny w wątku sposób monitorowania i kontrolowania odtwarzania multimediów z poziomu procesu interfejsu aplikacji. Podczas tworzenia kontrolera określ obiekt MediaSession.Token, aby aplikacja mogła wchodzić w interakcje z podanym obiektem MediaSession. Korzystając z metod MediaController.TransportControls, możesz wysyłać polecenia takie jak play(), stop(), skipToNext() i setRating(), aby sterować odtwarzaniem multimediów podczas tej sesji. Za pomocą kontrolera możesz też zarejestrować obiekt MediaController.Callback, aby nasłuchiwać zmian metadanych i stanu sesji.

Dodatkowo w nowej klasie Notification.MediaStyle możesz tworzyć rozszerzone powiadomienia, które umożliwiają sterowanie odtwarzaniem związane z sesją multimediów.

Przeglądanie multimediów

Android 5.0 umożliwia aplikacjom przeglądanie biblioteki treści multimedialnych innej aplikacji za pomocą nowego interfejsu API android.media.Przeglądaj. Aby udostępnić treści multimedialne w aplikacji, rozszerz klasę MediaBrowserService. Twoja implementacja MediaBrowserService powinna zapewniać dostęp do interfejsu MediaSession.Token, który umożliwia aplikacjom odtwarzanie treści multimedialnych dostarczanych przez Twoją usługę.

Do interakcji 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 do odtwarzania treści udostępnianych przez tę usługę.

Pamięć

Wybór katalogu

Android 5.0 rozszerza platformę Storage Access Framework, aby umożliwić użytkownikom wybranie całego poddrzewa katalogu, co daje 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 drzewa podrzędnego, umożliwiając użytkownikowi przeglądanie i wybieranie katalogu. Zwrócony identyfikator URI reprezentuje dostęp do wybranego poddrzewa. Do zbadania poddrzewa możesz używać buildChildDocumentsUriUsingTree() i buildDocumentUriUsingTree() oraz query().

Nowa metoda createDocument() umożliwia tworzenie nowych dokumentów i katalogów w dowolnym miejscu w poddrzewie. Do zarządzania istniejącymi dokumentami używaj renameDocument() i deleteDocument(). Sprawdź COLUMN_FLAGS, aby sprawdzić, czy pracownik obsługi klienta obsługuje te połączenia, zanim je wyślesz.

Jeśli implementujesz element DocumentsProvider i chcesz obsługiwać wybór poddrzewa, zaimplementuj isChildDocument() i dodaj FLAG_SUPPORTS_IS_CHILD w elemencie COLUMN_FLAGS.

Android 5.0 wprowadza też nowe katalogi pakietów w pamięci współdzielonej, w których aplikacja może umieszczać pliki multimedialne, aby uwzględnić je w MediaStore. Nowy getExternalMediaDirs() zwraca ścieżki do tych katalogów na wszystkich urządzeniach pamięci współdzielonej. Podobnie jak w przypadku getExternalFilesDir(), aplikacja nie potrzebuje żadnych dodatkowych uprawnień, aby uzyskać dostęp do zwróconych ścieżek. Platforma okresowo skanuje katalogi w poszukiwaniu nowych treści, ale możesz też użyć narzędzia MediaScannerConnection, aby bezpośrednio skanować w poszukiwaniu nowych treści.

Łączność bezprzewodowa

Wiele połączeń sieciowych

Android 5.0 udostępnia nowe interfejsy API do obsługi wielu sieci, które pozwalają aplikacji dynamicznie wyszukiwać dostępne sieci o określonych funkcjach i nawiązywać z nimi połączenie. Ta funkcja jest przydatna, gdy aplikacja wymaga specjalistycznej sieci, takiej jak SUPL, MMS lub sieć płatności przez operatora, lub gdy chcesz przesył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 sieciowe oraz typ transportu, którym interesuje się Twoja aplikacja.
  3. Aby wyszukać odpowiednie sieci, wywołaj requestNetwork() lub registerNetworkCallback() i przekaż obiekt NetworkRequest oraz implementację ConnectivityManager.NetworkCallback. Użyj metody requestNetwork(), jeśli chcesz się przełączać na odpowiednią sieć po jej wykryciu. Aby otrzymywać tylko powiadomienia dotyczące zeskanowanych sieci bez aktywnego przełączania się, użyj metody registerNetworkCallback().

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

Bluetooth Low Energy

W Androidzie 4.3 w głównej roli wprowadziliśmy obsługę Bluetooth Low Energy (Bluetooth LE). Z Androidem 5.0 urządzenie z Androidem może teraz działać jako urządzenie peryferyjne Bluetooth LE. Aplikacje mogą korzystać z tej funkcji, aby potwierdzać swoją obecność urządzeniom w pobliżu. Możesz na przykład tworzyć aplikacje, które pozwalają urządzeniu działać jako krokomierz lub monitor stanu zdrowia, i przekazują dane z innego urządzenia Bluetooth LE.

Nowe interfejsy API android.bluetooth.le umożliwiają aplikacjom rozgłaszanie reklam, wyszukiwanie odpowiedzi i tworzenie połączeń z pobliskimi urządzeniami Bluetooth LE. Aby korzystać z nowych funkcji reklam i skanowania, dodaj do pliku manifestu uprawnienie BLUETOOTH_ADMIN. Gdy użytkownicy zaktualizują Twoją aplikację ze Sklepu Play lub pobiorą ją ze Sklepu Play, zobaczą prośbę o przyznanie jej następujących uprawnień: „Informacje o połączeniu Bluetooth: umożliwia aplikacji sterowanie Bluetoothem, w tym przesyłanie wiadomości do urządzeń Bluetooth w pobliżu i uzyskiwanie informacji o nich”.

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

Android 5.0 wprowadza klasę ScanFilter, aby aplikacja mogła skanować tylko w poszukiwaniu określonych typów urządzeń, które ją interesują. Aby rozpocząć skanowanie w poszukiwaniu urządzeń Bluetooth LE, wywołaj startScan() i przekaż listę filtrów. W wywołaniu metody musisz również podać implementację ScanCallback, aby raportować o znalezieniu reklamy Bluetooth LE.

Ulepszenia komunikacji NFC

Android 5.0 wprowadza te ulepszenia, aby umożliwić szersze i bardziej elastyczne korzystanie z NFC:

  • Funkcja Android Beam jest teraz dostępna w menu udostępniania.
  • Aplikacja może wywoływać Android Beam na urządzeniu użytkownika, aby udostępniać dane, wywołując funkcję invokeBeam(). Dzięki temu użytkownik nie będzie musiał ręcznie stykać się z innym urządzeniem obsługującym komunikację NFC w celu zakończenia przesyłania danych.
  • Możesz użyć nowej metody createTextRecord(), aby utworzyć rekord NDEF zawierający dane tekstowe UTF-8.
  • Jeśli tworzysz aplikację płatniczą, możesz teraz dynamicznie rejestrować identyfikator aplikacji NFC (AID), wywołując metodę registerAidsForService(). Za pomocą setPreferredService() możesz też ustawić preferowaną usługę emulacji karty, 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 dłuższą żywotność baterii. Użyj nowych interfejsów API i narzędzi, aby zrozumieć i zoptymalizować zużycie energii przez aplikację.

Planowanie zadań

Android 5.0 udostępnia nowy interfejs API JobScheduler, który umożliwia optymalizację czasu pracy na baterii przez zdefiniowanie zadań, które system będzie uruchamiać asynchronicznie w późniejszym czasie lub w określonych warunkach (np. podczas ładowania urządzenia). Planowanie zadań jest przydatne w takich sytuacjach:

  • Aplikacja zawiera zadania, które nie są dostępne dla użytkownika, i które możesz odroczyć.
  • Aplikacja ma inne zadania, na które chcesz pracować, gdy urządzenie jest podłączone.
  • Aplikacja ma zadanie, które wymaga dostępu do sieci lub połączenia Wi-Fi.
  • Aplikacja zawiera wiele zadań, które chcesz uruchamiać wsadowo w regularnych odstępach czasu.

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

Użyj klasy JobInfo.Builder do skonfigurowania sposobu uruchamiania zaplanowanego zadania. Możesz zaplanować uruchamianie zadania pod określonymi warunkami, na przykład:

  • Uruchamiaj, gdy urządzenie się ładuje
  • Uruchamiaj, gdy urządzenie jest połączone z siecią bez pomiaru
  • Uruchom, gdy urządzenie jest nieaktywne
  • Zakończ przed określonym terminem lub z minimalnym opóźnieniem

Możesz na przykład dodać taki kod, aby uruchomić zadanie w sieci bez pomiaru użycia danych:

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 było podłączone przez ponad 2 minuty, a bateria jest w stanie sprawnym), system uruchomi każde zaplanowane zadanie, które jest gotowe do uruchomienia, nawet jeśli termin wykonania zadania jeszcze nie minął.

Aby zobaczyć przykład użycia interfejsu API JobScheduler, zapoznaj się z przykładem implementacji 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 przez urządzenie, uporządkowane według unikalnego identyfikatora użytkownika (UID). Statystyki obejmują:

  • Historia zdarzeń związanych z baterią
  • Globalne statystyki dotyczące urządzenia
  • Przybliżone zużycie energii przez identyfikator UID i komponent systemu
  • Liczba ms na pakiet w ms na aplikację
  • Zbiorcze statystyki dotyczące identyfikatora UID systemu
  • Zbiorcze statystyki dla identyfikatora UID aplikacji

Aby poznać różne opcje dostosowywania wyników, użyj opcji --help. Aby np. wydrukować statystyki wykorzystania baterii przez pakiet aplikacji od ostatniego ładowania urządzenia, uruchom to polecenie:

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

Możesz użyć narzędzia Battery Historyn, aby uzyskać dane wyjściowe polecenia dumpsys, aby wygenerować wizualizację HTML zdarzeń związanych z energią z dzienników. Te informacje ułatwiają zrozumienie i zdiagnozowanie problemów z baterią.

Android w miejscu pracy i w edukacji

Zarządzana obsługa administracyjna

Android 5.0 udostępnia nowe funkcje umożliwiające uruchamianie aplikacji w środowisku firmowym. Administrator urządzenia może zainicjować proces zarządzanej obsługi administracyjnej, aby dodać powiązany, ale oddzielny profil zarządzany do urządzenia, jeśli użytkownik ma już konto osobiste. Aplikacje powiązane z profilami zarządzanymi są widoczne obok aplikacji niezarządzanych w Menu z aplikacjami, na ekranie Ostatnie i w powiadomieniach.

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

Domyślnie tylko niewielki podzbiór aplikacji jest włączony w profilu zarządzanym. Możesz zainstalować dodatkowe aplikacje w profilu zarządzanym, wywołując enableSystemApp().

Jeśli tworzysz aplikację uruchamiającą, możesz użyć nowej klasy LauncherApps, aby uzyskać listę działań dostępnych do uruchomienia dla bieżącego użytkownika i wszystkich powiązanych profili zarządzanych. Menu z aplikacjami może sprawić, że aplikacje zarządzane będą bardziej widoczne, dodając do ikony możliwej do rysowania plakietkę związaną z pracą. Aby pobrać ikonę z plakietką, zadzwoń pod numer getUserBadgedIcon().

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

Właściciel urządzenia

Android 5.0 umożliwia wdrażanie aplikacji właściciela urządzenia. Właściciel urządzenia to wyspecjalizowany typ administratora urządzenia, który ma dodatkowe możliwości 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 z klasy DevicePolicyManager, aby uzyskać szczegółową kontrolę nad konfiguracją, zabezpieczeniami i aplikacjami na urządzeniach zarządzanych. Urządzenie może mieć tylko jednego aktywnego właściciela naraz.

Aby wdrożyć i aktywować właściciela urządzenia, musisz przeprowadzić migrację danych z aplikacji programistycznej na nie z użyciem komunikacji NFC, gdy urządzenie nie będzie udostępnione. Przenoszenie danych wysyła te same informacje co w intencji udostępniania opisanej w sekcji Zarządzanie obsługą administracyjną.

Przypinanie ekranu

W Androidzie 5.0 wprowadziliśmy nowy interfejs API przypinania ekranu, który pozwala tymczasowo zablokować użytkownikom możliwość opuszczenia zadania lub ich otrzymywania. Może to być przydatne na przykład wtedy, gdy tworzysz aplikację edukacyjną, która obsługuje wysokie wymagania związane z testami na Androidzie, aplikację jednozadaniową lub aplikację kiosku. Gdy aplikacja aktywuje przypinanie ekranu, użytkownicy nie będą widzieć powiadomień, nie będą mieli dostępu do innych aplikacji ani nie będą mogli wrócić do ekranu głównego, dopóki aplikacja nie opuści tego trybu.

Przypinanie ekranu można włączyć na 2 sposoby:

  • Ręcznie: użytkownicy mogą włączyć przypinanie ekranu w sekcji Ustawienia > Zabezpieczenia > Przypinanie ekranu, a następnie wybierać zadania, które chcą przypiąć, klikając ikonę zielonej pinezki na ekranie ostatnich.
  • Automatycznie: aby włączyć przypinanie ekranu automatycznie, wywołaj polecenie startLockTask() ze swojej aplikacji. Jeśli aplikacja, która wysłała prośbę, nie jest właścicielem urządzenia, użytkownik zostanie poproszony o potwierdzenie. Aplikacja właściciela urządzenia może wywołać metodę setLockTaskPackages(), aby umożliwić przypinanie aplikacji bez konieczności potwierdzenia przez użytkownika.

Gdy blokowanie zadań jest aktywne, zachodzą te zachowania:

  • Pasek stanu jest pusty, a powiadomienia i informacje o stanie użytkowników są ukryte.
  • Przyciski Ekran główny i Ostatnie aplikacje są ukryte.
  • Inne aplikacje nie mogą uruchamiać nowych aktywności.
  • Bieżąca aplikacja może rozpoczynać nowe działania, o ile nie powoduje to tworzenia nowych zadań.
  • Po wywołaniu przypinania ekranu przez właściciela urządzenia użytkownik pozostaje zablokowany w aplikacji, dopóki aplikacja nie wywoła polecenia stopLockTask().
  • Jeśli przypinanie ekranu zostało aktywowane przez inną aplikację, która nie jest właścicielem urządzenia, lub bezpośrednio przez użytkownika, użytkownik może wyłączyć tę funkcję, przytrzymując przyciski Wstecz i Ostatnie.

Struktura drukowania

Renderuj plik PDF jako bitmapę

Korzystając z nowej klasy PdfRenderer, możesz teraz renderować strony dokumentów PDF w obrazy bitmapy do wydrukowania. Musisz określić element ParcelFileDescriptor, który można przeszukiwać (czyli treści są dostępne losowo), w którym system będzie zapisywać treści do wydrukowania. Aplikacja może pobrać stronę do renderowania za pomocą openPage(), a następnie wywołać metodę render(), aby przekształcić otwarty obiekt PdfRenderer.Page w bitmapę. Możesz też ustawić dodatkowe parametry, jeśli chcesz przekonwertować tylko część dokumentu na obraz bitmapowy (np. w celu zaimplementowania renderowania kafelkowego w celu powiększenia dokumentu).

Przykład wykorzystania nowych interfejsów API znajdziesz w przykładzie: PdfRendererBasic.

System

Statystyki użytkowania aplikacji

Dzięki nowemu interfejsowi API android.app.usage możesz teraz przeglądać historię korzystania z aplikacji na urządzeniu z Androidem. Ten interfejs API udostępnia bardziej szczegółowe informacje o wykorzystaniu niż wycofana metoda getRecentTasks(). Aby używać tego interfejsu API, musisz najpierw zadeklarować w pliku manifestu uprawnienie "android.permission.PACKAGE_USAGE_STATS". Użytkownik musi też włączyć dostęp dla tej aplikacji w sekcji Ustawienia > Zabezpieczenia > Aplikacje z dostępem do danych o użyciu.

System zbiera dane o korzystaniu z poszczególnych aplikacji i agreguje je w interwałach dziennych, tygodniowych, miesięcznych i rocznych. Maksymalny czas, przez jaki system przechowuje te dane:

  • Dane dzienne: 7 dni
  • Dane tygodniowe: z 4 tygodni
  • Dane miesięczne: 6 miesięcy
  • Dane roczne: z 2 lat

W przypadku każdej aplikacji system rejestruje te dane:

  • czas ostatniego użycia aplikacji;
  • Łączny czas, przez jaki aplikacja znajdowała się na pierwszym planie w tym przedziale czasu (wg dnia, tygodnia, miesiąca lub roku)
  • Sygnatura czasowa przechwytywania czasu, w którym komponent (zidentyfikowany na podstawie pakietu i nazwy aktywności) został przeniesiony na pierwszy plan lub w tle w ciągu dnia
  • Sygnatura czasowa przechwytywania zmiany konfiguracji urządzenia (np. zmiany orientacji urządzenia w wyniku obrotu)

Testowanie i ułatwienia dostępu

Ulepszenia testów i ułatwień dostępu

Android 5.0 dodaje następujące funkcje testowania i ułatwień dostępu:

  • Nowe metody getWindowAnimationFrameStats() i getWindowContentFrameStats() rejestrują statystyki klatek na potrzeby animacji i zawartości okien. Te metody umożliwiają pisanie testów z instrumentacją w celu oceny, czy aplikacja renderuje ramki z wystarczającą częstotliwością odświeżania, aby zapewnić płynne działanie użytkownika.
  • Nowa metoda executeShellCommand() umożliwia wykonywanie poleceń powłoki z testu z instrumentacją. Wykonanie polecenia jest podobne do uruchamiania polecenia adb shell z hosta połączonego z urządzeniem. Pozwala to korzystać z narzędzi opartych na powłoce, takich jak dumpsys, am, content i pm.
  • Usługi ułatwień dostępu i narzędzia testowe korzystające z interfejsów API ułatwień dostępu (np. UiAutomator) mogą teraz pobierać szczegółowe informacje o właściwościach okien na ekranie, z którymi widzący użytkownicy mogą wchodzić w interakcje. Aby pobrać listę obiektów AccessibilityWindowInfo, wywołaj nową metodę getWindows().
  • Nowa klasa AccessibilityNodeInfo.AccessibilityAction umożliwia definiowanie standardowych lub niestandardowych działań do wykonania na AccessibilityNodeInfo. Nowa klasa AccessibilityNodeInfo.AccessibilityAction zastępuje interfejsy API związane z działaniami, które wcześniej znajdowały się w interfejsie AccessibilityNodeInfo.
  • Android 5.0 zapewnia dokładniejszą kontrolę nad syntezą tekstu na mowę w aplikacji. Nowa klasa Voice umożliwia aplikacji korzystanie z profili głosu związanych z określonymi regionami, oceną jakości i opóźnieniami oraz parametrami specyficznymi dla mechanizmu zamiany tekstu na mowę.

IME

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

Począwszy od Androida 5.0 użytkownicy mogą łatwiej przełączać się między wszystkimi edytorami metod wprowadzania (IME) obsługiwanymi przez platformę. Wykonanie określonej czynności przełączania (zwykle kliknięcie ikony kuli ziemskiej na klawiaturze programowej) powoduje przechodzenie między wszystkimi takimi edytorami IME. Ta zmiana działania jest wprowadzana przez metodę shouldOfferSwitchingToNextInputMethod().

Dodatkowo platforma sprawdza teraz, czy kolejny edytor w ogóle zawiera mechanizm przełączania (a tym samym czy po nim można przejść na edytor IME). IME z mechanizmem przełączania nie przełącza się na edytor bez niego. Ta zmiana działania jest wprowadzana przez metodę switchToNextInputMethod().

Aby zobaczyć przykład użycia zaktualizowanych interfejsów API do przełączania IME, zapoznaj się ze zaktualizowanym przykładem implementacji klawiatury programowej w tej wersji. Więcej informacji o implementowaniu przełączania między IME znajdziesz w artykule Tworzenie metody wprowadzania.

Deklaracje w pliku manifestu

Wymagane funkcje, które można zadeklarować

Poniższe wartości są teraz obsługiwane w elemencie <uses-feature>, dzięki czemu możesz mieć pewność, że aplikacja będzie instalowana tylko na tych urządzeniach, które spełniają jej wymagania.

Uprawnienia użytkownika

W elemencie <uses-permission> obsługiwane są teraz poniższe uprawnienia do deklarowania uprawnień, których aplikacja potrzebuje do dostępu do określonych interfejsów API.

  • BIND_DREAM_SERVICE: w przypadku kierowania na interfejs API na poziomie 21 lub wyższym to uprawnienie jest wymagane przez usługę Daydream, aby mieć pewność, że tylko system może się z nią powiązać.