Interfejsy API Androida 6.0

Android 6.0 (M) oferuje nowe funkcje dla użytkowników i programistów. Ten dokument zawiera wprowadzenie do najważniejszych interfejsów API.

Zacznij programować

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

Zaktualizuj docelowy poziom interfejsu API

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

Możesz używać interfejsów API Androida, jednocześnie obsługując starsze wersje, dodając do kodu warunki, które sprawdzają poziom interfejsu API systemu przed wykonaniem interfejsów API nieobsługiwanych 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?

Uwierzytelnianie odciskiem palca

W tej wersji udostępniamy nowe interfejsy API, które umożliwiają uwierzytelnianie użytkowników za pomocą skanowania ich odcisku palca na obsługiwanych urządzeniach. Używaj tych interfejsów w połączeniu z systemem Android Keystore.

Aby uwierzytelniać użytkowników za pomocą skanu odcisku palca, pobierz instancję nowej klasy FingerprintManager i wywołaj metodę authenticate(). Aplikacja musi działać na zgodnym urządzeniu z czytnikiem linii papilarnych. W aplikacji musisz zaimplementować interfejs do procesu uwierzytelniania odciskiem palca i użyć standardowej ikony odcisku palca na Androidzie. Ikona odcisku palca Androida (c_fp_40px.png) jest dostępna w pliku z przykładem uwierzytelniania biometrycznego. Jeśli tworzysz kilka aplikacji, które korzystają z uwierzytelniania odciskiem palca, pamiętaj, że każda z nich musi niezależnie uwierzytelniać odcisk palca użytkownika.

Aby korzystać z tej funkcji w aplikacji, najpierw dodaj uprawnienie USE_FINGERPRINT w pliku manifestu.

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />
Urządzenie mobilne z funkcją uwierzytelniania odciskiem palca

Aby zobaczyć implementację uwierzytelniania odciskiem palca w aplikacji, zapoznaj się z przykładem uwierzytelniania biometrycznego. Aby dowiedzieć się, jak używać tych interfejsów API do uwierzytelniania w połączeniu z innymi interfejsami API Androida, obejrzyj film Interfejsy API odcisków palców i płatności.

Jeśli testujesz tę funkcję, wykonaj te czynności:

  1. Zainstaluj pakiet Android SDK Tools w wersji 24.3, jeśli jeszcze jej nie masz.
  2. Zarejestruj nowy odcisk palca w emulatorze, klikając Ustawienia > Zabezpieczenia > Odcisk palca, a następnie postępuj zgodnie z instrukcjami rejestracji.
  3. Użyj emulatora, aby emulować zdarzenia dotyku odcisku palca za pomocą tego polecenia. Użyj tego samego polecenia, aby emulować zdarzenia dotknięcia odcisku palca na ekranie blokady lub w aplikacji.
    adb -e emu finger touch <finger_id>
    

    W systemie Windows konieczne może być uruchomienie polecenia telnet 127.0.0.1 <emulator-id>, a następnie finger touch <finger_id>.

Potwierdź dane logowania

Aplikacja może uwierzytelniać użytkowników na podstawie tego, jak dawno temu odblokowali oni swoje urządzenie. Dzięki tej funkcji użytkownicy nie muszą zapamiętywać dodatkowych haseł do aplikacji i nie musisz wdrażać własnego interfejsu uwierzytelniania. Aplikacja powinna używać tej funkcji w połączeniu z implementacją klucza publicznego lub tajnego na potrzeby uwierzytelniania użytkownika.

Aby ustawić czas oczekiwania, w którym ten sam klucz może być ponownie użyty po uwierzytelnieniu użytkownika, wywołaj nową metodę setUserAuthenticationValidityDurationSeconds() podczas konfigurowania funkcji KeyGenerator lub KeyPairGenerator.

Unikaj nadmiernego wyświetlania okna ponownej autoryzacji – aplikacje powinny najpierw próbować użyć obiektu kryptograficznego, a jeśli czas oczekiwania upłynie, użyć metody createConfirmDeviceCredentialIntent(), aby ponownie uwierzytelnić użytkownika w aplikacji.

Łączenie aplikacji

Ta wersja ulepsza system intencji Androida, zapewniając bardziej wydajne łączenie aplikacji. Ta funkcja umożliwia powiązanie aplikacji z Twoją domeną internetową. Na podstawie tego powiązania platforma może określić domyślną aplikację używaną do obsługi konkretnego linku internetowego i pominąć prośby użytkowników o wybranie aplikacji. Więcej informacji o implementowaniu tej funkcji znajdziesz w artykule Obsługa linków aplikacji.

Automatyczna kopia zapasowa aplikacji

System automatycznie tworzy teraz pełną kopię zapasową danych aplikacji i przywraca ją. Aby umożliwić to działanie, Twoja aplikacja musi być kierowana na Androida 6.0 (poziom interfejsu API 23). Nie musisz dodawać żadnego dodatkowego kodu. Jeśli użytkownicy usuną swoje konta Google, zostaną też usunięte ich dane kopii zapasowej. Aby dowiedzieć się, jak działa ta funkcja i jak skonfigurować tworzenie kopii zapasowych w systemie plików, przeczytaj artykuł Konfigurowanie automatycznego tworzenia kopii zapasowych aplikacji.

Udostępnianie bezpośrednie

Dolna część telefonu z funkcją bezpośredniego udostępniania

Ta wersja zawiera interfejsy API, które umożliwiają użytkownikom intuicyjne i szybkie udostępnianie treści. Możesz teraz definiować cele bezpośredniego udostępniania, które uruchamiają określone działanie w aplikacji. Te cele udostępniania są widoczne dla użytkowników w menu Udostępnij. Ta funkcja umożliwia użytkownikom udostępnianie treści odbiorcom, takim jak kontakty w innych aplikacjach. Na przykład może ono uruchamiać działanie w innej aplikacji sieci społecznościowej, które umożliwia użytkownikowi udostępnianie treści bezpośrednio konkretnemu znajomemu lub społeczności w tej aplikacji.

Aby włączyć docelowe udostępnianie bezpośrednie, musisz zdefiniować klasę rozszerzającą klasę ChooserTargetService. Zadeklaruj usługę w pliku manifestu. W deklaracji podaj uprawnienie BIND_CHOOSER_TARGET_SERVICE i filtr intencji za pomocą działania SERVICE_INTERFACE.

Przykład poniżej pokazuje, jak zadeklarować element ChooserTargetService w pliku manifestu.

<service android:name=".ChooserTargetService"
        android:label="@string/service_name"
        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

W przypadku każdego działania, które chcesz udostępnić aplikacji ChooserTargetService, dodaj element <meta-data> o nazwie "android.service.chooser.chooser_target_service" w pliku manifestu aplikacji.

<activity android:name=".MyShareActivity”
        android:label="@string/share_activity_label">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
<meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".ChooserTargetService" />
</activity>

Interakcje głosowe

Ta wersja zawiera nowy interfejs API interakcji głosowych, który wraz z czynnościami głosowymi umożliwia tworzenie w aplikacjach funkcji konwersacji głosowych. Aby sprawdzić, czy Twoje działanie zostało wywołane przez polecenie głosowe, wywołaj metodę isVoiceInteraction(). Jeśli tak, aplikacja może używać klasy VoiceInteractor, aby poprosić użytkownika o potwierdzenie głosowe, wybranie opcji z listy itp.

Większość interakcji głosowych pochodzi od użytkownika. Aktywność interakcji głosowej może jednak również rozpocząć się bez udziału użytkownika. Inna aplikacja uruchomiona za pomocą interakcji głosowej może też wysłać zamiar uruchomienia interakcji głosowej. Aby określić, czy aktywność została uruchomiona przez zapytanie głosowe użytkownika czy z innej aplikacji do interakcji głosowej, wywołaj metodę isVoiceInteractionRoot(). Jeśli aktywność została uruchomiona przez inną aplikację, metoda zwraca false. Aplikacja może poprosić użytkownika o potwierdzenie, że chce wykonać tę czynność.

Więcej informacji o wdrażaniu działań głosowych znajdziesz na stronie dla deweloperów poświęconej działaniom głosowym.

Interfejs Assist API

Ta wersja to nowy sposób, w jaki użytkownicy mogą korzystać z Twoich aplikacji z pomocą Asystenta. Aby korzystać z tej funkcji, użytkownik musi włączyć asystenta do korzystania z bieżącego kontekstu. Po włączeniu tej funkcji użytkownik może wywołać Asystenta w dowolnej aplikacji, naciskając i przytrzymując przycisk Ekran główny.

Aplikacja może nie udostępniać bieżącego kontekstu asystentowi, ustawiając flagę FLAG_SECURE. Oprócz standardowego zestawu informacji, który platforma przekazuje do asystenta, aplikacja może udostępniać dodatkowe informacje, korzystając z nowej klasy AssistContent.

Aby zapewnić mu dodatkowy kontekst z Twojej aplikacji, wykonaj te czynności:

  1. Wdróż interfejs Application.OnProvideAssistDataListener.
  2. Zarejestruj ten detektor za pomocą registerOnProvideAssistDataListener().
  3. Aby podać informacje kontekstowe dotyczące konkretnej aktywności, zastąpij funkcjęonProvideAssistData()callback i opcjonalnie funkcjęonProvideAssistContent()callback.

uniwersalne urządzenia pamięci masowej

Dzięki tej wersji użytkownicy mogą adoptować urządzenia pamięci zewnętrznej, takie jak karty SD. Zastosowanie zewnętrznego urządzenia pamięci masowej szyfruje i formatuje urządzenie tak, aby działało jak pamięć wewnętrzna. Ta funkcja umożliwia użytkownikom przenoszenie aplikacji i prywatnych danych tych aplikacji między urządzeniami pamięci masowej. Podczas przenoszenia aplikacji system uwzględnia ustawienie android:installLocation w pliku manifestu.

Jeśli Twoja aplikacja uzyskuje dostęp do tych interfejsów API lub pól, pamiętaj, że ścieżki plików zwracane przez nie będą się dynamicznie zmieniać, gdy aplikacja będzie przenoszona między wewnętrznymi i zewnętrzymi urządzeniami pamięci masowej. Zdecydowanie zalecamy, aby przy tworzeniu ścieżek plików zawsze wywoływać te interfejsy API dynamicznie. Nie używaj zakodowanych na stałe ścieżek do plików ani zachowuj w pełni kwalifikowanych ścieżek plików, które zostały utworzone wcześniej.

Aby debugować tę funkcję, możesz włączyć obsługę dysku USB, który jest podłączony do urządzenia z Androidem za pomocą kabla USB On-The-Go (OTG), wykonując to polecenie:

$ adb shell sm set-force-adoptable true

Powiadomienia

W tej wersji wprowadzono następujące zmiany interfejsu API dotyczące powiadomień:

Obsługa rysika Bluetooth

Ta wersja zapewnia lepszą obsługę danych wejściowych użytkownika za pomocą piórka Bluetooth. Użytkownicy mogą sparować i podłączyć do telefonu lub tabletu zgodny rysik Bluetooth. Podczas połączenia informacje o pozycji z ekranu dotykowego są łączone z informacjami o ciśnieniu i przyciskach z pióra, aby zapewnić większy zakres możliwości niż w przypadku samego ekranu dotykowego. Aplikacja może wykrywać naciśnięcia przycisków rysika i wykonywać działania dodatkowe, rejestrując obiekty View.OnContextClickListenerGestureDetector.OnContextClickListener w Twojej aktywności.

Aby wykrywać interakcje z przyciskiem rysika, użyj metod i konstant MotionEvent:

Ulepszone skanowanie Bluetooth Low Energy

Jeśli Twoja aplikacja wykonuje skanowanie Bluetooth Low Energy, użyj nowej metody setCallbackType(), aby określić, że system ma powiadamiać funkcje zwrotne, gdy po raz pierwszy wykryje lub zobaczy po długim czasie pakiet reklamy zgodny z zestawem ScanFilter. Takie podejście do skanowania jest bardziej energooszczędne niż w poprzedniej wersji platformy.

Obsługa Hotspot 2.0 w wersji 1

Ta wersja wprowadza obsługę specyfikacji Hotspot 2.0 Release 1 na urządzeniach Nexus 6 i Nexus 9. Aby w aplikacji udostępnić dane uwierzytelniające Hotspot 2.0, użyj nowych metod klasy WifiEnterpriseConfig, takich jak setPlmn()setRealm(). W obiekcie WifiConfiguration możesz skonfigurować pola FQDNproviderFriendlyName. Nowa metoda isPasspointNetwork() wskazuje, czy wykryta sieć reprezentuje punkt dostępu Hotspot 2.0.

Tryb wyświetlania 4K

Platforma pozwala teraz aplikacjom na żądanie zwiększenia rozdzielczości ekranu do renderowania 4K na zgodnym sprzęcie. Aby wysłać zapytanie o bieżącą rozdzielczość fizyczną, użyj nowych interfejsów API Display.Mode. Jeśli interfejs użytkownika jest rysowany w niższej rozdzielczości logicznej i przeskalowywany do większej rozdzielczości fizycznej, pamiętaj, że rozdzielczość fizyczna zwracana przez metodę getPhysicalWidth() może się różnić od rozdzielczości logicznej podanej przez getSize().

Możesz poprosić system o zmianę fizycznej rozdzielczości w aplikacji podczas jej działania, ustawiając właściwość preferredDisplayModeId okna aplikacji. Ta funkcja jest przydatna, jeśli chcesz przełączyć się na rozdzielczość 4K. W trybie wyświetlania 4K interfejs jest nadal renderowany w pierwotnej rozdzielczości (np. 1080p) i przeskalowywany do 4K, ale obiekty SurfaceView mogą wyświetlać treści w natywnej rozdzielczości.

Motywy ColorStateLists

Atrybuty motywu są teraz obsługiwane w ColorStateList na urządzeniach z Androidem 6.0 (poziom interfejsu API 23). Metody Resources.getColorStateList() i Resources.getColor() zostały wycofane. Jeśli wywołujesz te interfejsy API, wywołuj zamiast nich nowe metody Context.getColorStateList() lub Context.getColor(). Te metody są też dostępne w bibliotece appcompat w wersji 4 w ContextCompat.

Funkcje audio

W tej wersji wprowadziliśmy ulepszenia w zakresie przetwarzania dźwięku na Androidzie, takie jak:

  • Obsługa protokołu MIDI za pomocą nowych interfejsów API android.media.midi. Używaj tych interfejsów API do wysyłania i odbierania zdarzeń MIDI.
  • Nowe klasy AudioRecord.Builder i AudioTrack.Builder do tworzenia obiektów cyfrowego przechwytywania i odtwarzania dźwięku oraz do konfigurowania właściwości źródła i odbiornika dźwięku, aby zastąpić domyślne wartości systemowe.
  • Elementy wywołujące interfejs API służące do kojarzenia urządzeń audio i wejściowych. Jest to szczególnie przydatne, jeśli Twoja aplikacja umożliwia użytkownikom uruchamianie wyszukiwania głosowego za pomocą kontrolera do gier lub pilota połączonego z Android TV. System wywołuje nowy wywołanie zwrotne onSearchRequested(), gdy użytkownik rozpoczyna wyszukiwanie. Aby określić, czy urządzenie wejściowe użytkownika ma wbudowany mikrofon, pobierz obiekt InputDevice z tego wywołania zwrotnego, a potem wywołaj nową metodę hasMicrophone().
  • Nowa metoda getDevices(), która umożliwia pobranie listy wszystkich urządzeń audio aktualnie połączonych z systemem. Możesz też zarejestrować obiekt AudioDeviceCallback, jeśli chcesz, by system powiadamiał aplikację o połączeniu lub rozłączeniu urządzenia audio.

Funkcje dotyczące filmów

Ta wersja dodaje do interfejsów API do przetwarzania filmów nowe funkcje, w tym:

  • Nowa klasa MediaSync, która pomaga aplikacjom synchronicznie renderować strumienie audio i wideo. Bufory audio są przesyłane w trybie nieblokującym i zwracane za pomocą połączenia zwrotnego. Obsługuje też dynamiczną szybkość odtwarzania.
  • Nowe zdarzenie EVENT_SESSION_RECLAIMED, które wskazuje, że sesja otwarta przez aplikację została odzyskana przez menedżera zasobów. Jeśli Twoja aplikacja korzysta z sesji DRM, musisz obsłużyć to zdarzenie i upewnić się, że nie używasz sesji odzyskanej.
  • Nowy kod błędu ERROR_RECLAIMED, który wskazuje, że menedżer zasobów odzyskał zasób multimediów używany przez kodek. Z tym wyjątkiem kodek musi być zwolniony, ponieważ został przeniesiony do stanu terminala.
  • Nowy interfejs getMaxSupportedInstances() otrzymujący wskazówkę dotyczącą maksymalnej liczby obsługiwanych instancji kodeka jednocześnie.
  • Nowa metoda setPlaybackParams() umożliwiająca ustawienie szybkości odtwarzania multimediów w celu przyspieszenia lub zwolnienia odtwarzania. Automatycznie wydłuża lub przyspiesza odtwarzanie dźwięku w zależności od filmu.

Funkcje aparatu

Ta wersja zawiera te nowe interfejsy API umożliwiające dostęp do lampy błyskowej aparatu i przetwarzanie zdjęć przez aparat:

Interfejs Flashlight API

Jeśli urządzenie z kamerą ma lampę błyskową, możesz użyć metody setTorchMode(), aby włączyć lub wyłączyć tryb latarki lampy bez otwierania urządzenia. Aplikacja nie ma wyłącznego prawa własności do modułu lampy błyskowej ani urządzenia z kamerą. Tryb latarki jest wyłączany i staje się niedostępny, gdy urządzenie z kamerą jest niedostępne lub gdy inne zasoby kamery, które utrzymują latarkę, stają się niedostępne. Inne aplikacje mogą też wywoływać setTorchMode() w celu wyłączenia trybu latarki. Gdy zamkniesz ostatnią aplikację, która włączyła tryb latarki, tryb latarki zostanie wyłączony.

Aby zarejestrować wywołanie zwrotne, które będzie informować o stanie trybu latarki, wywołaj metodę registerTorchCallback(). Przy pierwszej rejestracji wywołania zwrotnego jest ono natychmiast wywoływane ze stanem trybu latarki wszystkich obecnie znanych aparatów z lampą błyskową. Po włączeniu lub wyłączeniu trybu latarki wywoływana jest metoda onTorchModeChanged().

Interfejs API do ponownego przetwarzania

Interfejs API Camera2 został rozszerzony o obsługę przetwarzania obrazu w formacie YUV i prywatnym niewidocznym. Aby sprawdzić, czy te funkcje są dostępne, zadzwoń pod numer getCameraCharacteristics() i sprawdź, czy masz klucz REPROCESS_MAX_CAPTURE_STALL. Jeśli urządzenie obsługuje przetwarzanie wsteczne, możesz utworzyć sesję przechwytywania z możliwością przetworzenia wstecznego, wywołując funkcję createReprocessableCaptureSession(), i utworzyć żądania przetworzenia wstecznego bufora wejściowego.

Za pomocą klasy ImageWriter podłącz przepływ bufora wejściowego do danych wejściowych kamery podczas ponownego przetwarzania danych. Aby uzyskać pusty bufor, zastosuj ten model programowania:

  1. Wywołaj metodę dequeueInputImage().
  2. Umieścić dane w buforze wejściowym.
  3. Wyślij bufor do kamery, wywołując metodę queueInputImage().

Jeśli używasz obiektu ImageWriter razem z obrazem PRIVATE, aplikacja nie może uzyskać bezpośredniego dostępu do danych obrazu. Zamiast tego prześlij obraz PRIVATE bezpośrednio do funkcji ImageWriter, wywołując metodę queueInputImage() bez kopiowania do bufora.

Klasa ImageReader obsługuje teraz strumienie obrazów w formacie PRIVATE. Ta funkcja pozwala aplikacji utrzymać okrągłą kolejkę obrazów wyjściowych z ImageReader, wybierać obrazy i wysyłać je do ImageWriter w celu ponownego przetworzenia przez aparat.

Funkcje Androida dla firm

Ta wersja zawiera te nowe interfejsy API dla Androida dla firm:

  • Rozszerzone opcje zarządzania urządzeniami jednorazowego użytku należącymi do firmy: właściciel urządzenia może teraz kontrolować te ustawienia, aby ułatwić zarządzanie urządzeniami jednorazowego użytku należącymi do firmy:
  • Ciche instalowanie i odinstalowywanie aplikacji przez właściciela urządzenia: właściciel urządzenia może teraz cicho instalować i odinstalowywać aplikacje za pomocą interfejsów API PackageInstaller, niezależnie od Google Play for Work. Możesz teraz udostępniać urządzenia za pomocą właściciela urządzenia, który pobiera i instaluje aplikacje bez udziału użytkownika. Ta funkcja jest przydatna, gdy chcesz włączyć obsługę kiosku lub innych urządzeń jednym kliknięciem bez aktywowania konta Google.
  • Cichy dostęp do certyfikatów przedsiębiorstwa: gdy aplikacja wywoła choosePrivateKeyAlias(), zanim użytkownik zostanie poproszony o wybranie certyfikatu, profil lub właściciel urządzenia mogą teraz wywołać metodę onChoosePrivateKeyAlias(), aby dyskretnie udostępnić alias aplikacji, która wysłała żądanie. Ta funkcja umożliwia przyznawanie zarządzanym aplikacjom dostępu do certyfikatów bez interakcji z użytkownikiem.
  • Automatyczne akceptowanie aktualizacji systemu. Dzięki ustawieniu zasad aktualizacji systemu za pomocą funkcji setSystemUpdatePolicy() właściciel urządzenia może teraz automatycznie akceptować aktualizacje systemu, na przykład w przypadku urządzenia kioskowego, lub opóźnić aktualizację i uniemożliwić jej przeprowadzenie przez użytkownika przez okres do 30 dni. Administrator może też ustawić dzienny przedział czasu, w którym musi nastąpić aktualizacja, na przykład w godzinach, gdy kiosk nie jest używany. Gdy dostępna jest aktualizacja systemu, system sprawdza, czy aplikacja kontrolera zasad urządzeń ustawiła zasady aktualizacji systemu, i odpowiednio działa.
  • Przedstawione instalowanie certyfikatów: właściciel profilu lub urządzenia może teraz przyznać aplikacji innej firmy możliwość wywoływania tych interfejsów API do zarządzania certyfikatami: DevicePolicyManager:
  • Urządzenie mobilne z funkcją powiadomień o stanie pracy w Android for Work
  • Śledzenie użycia danych. Właściciel profilu lub urządzenia może teraz za pomocą nowych metod NetworkStatsManagerwysyłać zapytania o statystyki dotyczące wykorzystania danych widoczne w sekcji Ustawienia > Dane. Właścicielom profilu automatycznie przyznawane są uprawnienia do wysyłania zapytań o dane w profilu, którym zarządzają, a właścicielom urządzeń – dostęp do danych o użytkowaniu zarządzanego głównego konta użytkownika.
  • Zarządzanie uprawnieniami czasu działania:

    Właściciel profilu lub urządzenia może ustawić zasady dotyczące uprawnień dla wszystkich żądań w czasie działania wszystkich aplikacji korzystających z setPermissionPolicy(), aby poprosić użytkownika o przyznanie uprawnień lub automatycznie przyznać lub odmówić przyznania uprawnień. Jeśli ta zasada jest skonfigurowana, użytkownik nie może zmienić wyboru dokonanego przez właściciela profilu lub urządzenia na ekranie uprawnień aplikacji w Ustawieniach.

  • VPN w Ustawieniach: aplikacje VPN są teraz widoczne w sekcji Ustawienia > Więcej > VPN. Dodatkowo powiadomienia dotyczące korzystania z sieci VPN są teraz dostosowane do sposobu jej konfiguracji. W przypadku właściciela profilu powiadomienia są wysyłane w zależności od tego, czy sieć VPN jest skonfigurowana na profilu zarządzanym, profilu osobistym czy na obu. W przypadku właściciela urządzenia powiadomienia zależą od tego, czy sieć VPN jest skonfigurowana dla całego urządzenia.
  • Powiadomienie o stanie służbowym: ikona aktówki na pasku stanu pojawia się teraz, gdy aplikacja z profilu zarządzanego ma aktywność na pierwszym planie. Poza tym, jeśli urządzenie jest bezpośrednio odblokowane do aktywności w aplikacji w profilu zarządzanym, wyświetla się komunikat informujący użytkownika, że znajduje się on w profilu służbowym.