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:
VISIBILITY_PRIVATE
: wyświetla podstawowe informacje, takie jak ikona powiadomienia, ale ukrywa pełną treść powiadomienia.VISIBILITY_PUBLIC
: pokazuje pełną treść powiadomienia.VISIBILITY_SECRET
: nie wyświetla niczego, oprócz ikony powiadomienia.
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 naPRIORITY_MAX
lubPRIORITY_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 APICamera
. - 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 zapewniaMediaCodec
. - 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ę.
Miejsce na dane
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:
- Utwórz
ConnectivityManager
. - Użyj klasy
NetworkRequest.Builder
, aby utworzyć obiektNetworkRequest
i określić funkcje sieciowe oraz typ transportu, którym interesuje się Twoja aplikacja. - Aby wyszukać odpowiednie sieci, wywołaj
requestNetwork()
lubregisterNetworkCallback()
i przekaż obiektNetworkRequest
oraz implementacjęConnectivityManager.NetworkCallback
. Użyj metodyrequestNetwork()
, 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 metodyregisterNetworkCallback()
.
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()
igetWindowContentFrameStats()
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 poleceniaadb shell
z hosta połączonego z urządzeniem. Pozwala to korzystać z narzędzi opartych na powłoce, takich jakdumpsys
,am
,content
ipm
. - 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ówAccessibilityWindowInfo
, wywołaj nową metodęgetWindows()
. - Nowa klasa
AccessibilityNodeInfo.AccessibilityAction
umożliwia definiowanie standardowych lub niestandardowych działań do wykonania naAccessibilityNodeInfo
. Nowa klasaAccessibilityNodeInfo.AccessibilityAction
zastępuje interfejsy API związane z działaniami, które wcześniej znajdowały się w interfejsieAccessibilityNodeInfo
. - 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.
FEATURE_AUDIO_OUTPUT
FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING
FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR
FEATURE_CAMERA_CAPABILITY_RAW
FEATURE_CAMERA_LEVEL_FULL
FEATURE_GAMEPAD
FEATURE_LIVE_TV
FEATURE_MANAGED_USERS
FEATURE_LEANBACK
FEATURE_OPENGLES_EXTENSION_PACK
FEATURE_SECURELY_REMOVES_USERS
FEATURE_SENSOR_AMBIENT_TEMPERATURE
FEATURE_SENSOR_HEART_RATE_ECG
FEATURE_SENSOR_RELATIVE_HUMIDITY
FEATURE_VERIFIED_BOOT
FEATURE_WEBVIEW
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ć.