Android 8.0 (API-Level 26) bietet Nutzern und Entwicklern eine Vielzahl neuer Funktionen und Möglichkeiten. In diesem Dokument wird erläutert, was es für Entwickler Neues gibt.
Du kannst dir auch die Verhaltensänderungen in Android 8.0 ansehen, um zu erfahren, in welchen Bereichen Plattformänderungen sich auf deine Apps auswirken können.
Nutzererfahrung
Bild-im-Bild-Modus
Bild im Bild unter Android 8.0
Unter Android 8.0 (API-Ebene 26) können Aktivitäten im Bild im Bild (BiB) gestartet werden. BiB ist ein spezieller Mehrfenstermodus, der hauptsächlich für die Videowiedergabe verwendet wird. Der BiB-Modus war ursprünglich nur für Android TV verfügbar. Mit Android 8.0 ist die Funktion auch auf anderen Android-Geräten verfügbar.
Wenn sich eine Aktivität im BiB-Modus befindet, befindet sie sich im pausierten Status, sollte jedoch weiterhin Inhalte anzeigen. Aus diesem Grund sollten Sie dafür sorgen, dass Ihre App die Wiedergabe nicht in ihrem onPause()
-Handler pausiert. Halte das Video stattdessen in „onStop()
“ an und setze die Wiedergabe in onStart()
fort. Weitere Informationen finden Sie unter Mehrfensterlebenszyklus.
Wenn du angeben möchtest, dass für deine Aktivität der BiB-Modus verwendet werden kann, setze android:supportsPictureInPicture
im Manifest auf „true“.
Ab Android 8.0 ist das Manifestattribut android:resizeableActivity
für PIP nicht erforderlich.
Sie müssen jedoch android:resizeableActivity
auf „true“ setzen, wenn Ihre Aktivität andere Mehrfenstermodi unterstützt.)
Mit Android 8.0 (API-Ebene 26) wird das neue Objekt PictureInPictureParams
eingeführt, das an PIP-Methoden übergeben wird, um festzulegen, wie sich eine Aktivität im BiB-Modus verhalten soll. Dieses Objekt gibt Eigenschaften wie das bevorzugte Seitenverhältnis der Aktivität an.
Die unter Bild im Bild hinzufügen beschriebenen vorhandenen BiB-Methoden können jetzt auf allen Android-Geräten verwendet werden, nicht nur auf Android TV. Darüber hinaus bietet Android 8.0 die folgenden Methoden zur Unterstützung des BiB-Modus:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
: Platziert die Aktivität im Bild-im-Bild-Modus. Das Seitenverhältnis der Aktivität und andere Konfigurationseinstellungen werden über args festgelegt. Wenn Felder in args leer sind, verwendet das System die Werte, die beim letzten Aufruf vonActivity.setPictureInPictureParams()
festgelegt wurden.Die angegebene Aktivität wird in einer Ecke des Bildschirms platziert. Der Rest des Bildschirms wird mit der vorherigen Aktivität gefüllt, die zuvor auf dem Bildschirm angezeigt wurde. Die Aktivität, die in den BiB-Modus wechselt, wird pausiert, bleibt aber gestartet. Wenn der Nutzer auf die BiB-Aktivität tippt, zeigt das System ein Menü an, mit dem er interagieren kann. Keine Berührungsereignisse erreichen die Aktivität, während sie sich im BiB-Status befindet.
-
Activity.setPictureInPictureParams()
: Aktualisiert die BiB-Konfigurationseinstellungen einer Aktivität. Befindet sich die Aktivität derzeit im BiB-Modus, werden die Einstellungen aktualisiert. Dies ist nützlich, wenn sich das Seitenverhältnis der Aktivität ändert. Wenn sich die Aktivität nicht im BiB-Modus befindet, werden diese Konfigurationseinstellungen unabhängig von der aufgerufenenenterPictureInPictureMode()
-Methode verwendet.
Benachrichtigungen
In Android 8.0 (API-Ebene 26) haben wir die Benachrichtigungen neu gestaltet, um das Benachrichtigungsverhalten und die -einstellungen einfacher und einheitlicher zu verwalten. Zu diesen Änderungen gehören:
- Benachrichtigungskanäle: In Android 8.0 wurden Benachrichtigungskanäle eingeführt, mit denen Sie für jeden anzuzeigenden Benachrichtigungstyp einen vom Nutzer anpassbaren Kanal erstellen können. In der Benutzeroberfläche werden Benachrichtigungskanäle als Benachrichtigungskategorien bezeichnet. Informationen zum Implementieren von Benachrichtigungskanälen finden Sie unter Benachrichtigungskanäle verwalten.
- App-Benachrichtigungspunkte: Mit Android 8.0 wird die Anzeige von Punkten oder Kennzeichen auf App Launcher-Symbolen unterstützt. Benachrichtigungspunkte spiegeln das Vorhandensein von Benachrichtigungen wider, die der Nutzer noch nicht geschlossen oder auf sie reagiert hat. Informationen zum Arbeiten mit Benachrichtigungspunkten findest du unter Benachrichtigungskennzeichen.
- Schlummerfunktion: Nutzer können Benachrichtigungen zurückstellen, sodass sie für eine bestimmte Zeit ausgeblendet werden, bevor sie wieder angezeigt werden. Benachrichtigungen werden wieder mit derselben Wichtigkeitsstufe angezeigt, mit der sie zuvor angezeigt wurden. Apps können eine zurückgestellte Benachrichtigung entfernen oder aktualisieren, aber die Aktualisierung einer zurückgestellten Benachrichtigung führt nicht dazu, dass sie wieder angezeigt wird.
- Zeitüberschreitungen für Benachrichtigungen: Du kannst beim Erstellen einer Benachrichtigung mit
setTimeoutAfter()
ein Zeitlimit festlegen. Mit dieser Methode können Sie eine Dauer angeben, nach der eine Benachrichtigung abgebrochen werden soll. Bei Bedarf können Sie eine Benachrichtigung abbrechen, bevor das angegebene Zeitlimit abläuft. - Benachrichtigungseinstellungen: Du kannst
setSettingsText()
aufrufen, um den Text festzulegen, der angezeigt werden soll, wenn du in einer Benachrichtigung mit dem IntentNotification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
einen Link zu den Benachrichtigungseinstellungen deiner App erstellst. Das System kann die folgenden Extras bereitstellen, um die Einstellungen zu filtern, die Nutzern in deiner App angezeigt werden sollen:EXTRA_CHANNEL_ID
,NOTIFICATION_TAG
undNOTIFICATION_ID
. - Benachrichtigungen schließen: Nutzer können Benachrichtigungen selbst schließen, Apps können sie programmatisch entfernen. Mithilfe der Methode
onNotificationRemoved()
aus der KlasseNotificationListenerService
kannst du feststellen, wann eine Benachrichtigung geschlossen und warum sie geschlossen wird. - Hintergrundfarben: Sie können eine Hintergrundfarbe für eine Benachrichtigung festlegen und aktivieren. Du solltest diese Funktion nur in Benachrichtigungen zu laufenden Aufgaben verwenden, die für den Nutzer auf einen Blick wichtig sind. Beispielsweise lässt sich eine Hintergrundfarbe für Benachrichtigungen zu Wegbeschreibungen oder für einen laufenden Anruf festlegen. Außerdem lässt sich mit
setColor()
die gewünschte Hintergrundfarbe festlegen. So kannst du mitsetColorized()
eine Hintergrundfarbe für eine Benachrichtigung aktivieren. - Nachrichtenstil: In Android 8.0 werden bei Benachrichtigungen, die die Klasse
MessagingStyle
verwenden, mehr Inhalte in minimierter Form angezeigt. Sie sollten die KlasseMessagingStyle
für Benachrichtigungen verwenden, die sich auf Nachrichten beziehen. Sie können auch die MethodeaddHistoricMessage()
verwenden, um Kontext für eine Unterhaltung bereitzustellen. Dazu können Sie Verlaufsnachrichten zu nachrichtenbezogenen Benachrichtigungen hinzufügen.
![Ein Menü für langes Drücken bei Benachrichtigungen in Android 8.0 (API-Level 26)](https://developer.android.com/static/images/about/versions/oreo/notification-long-press.png?authuser=6&hl=de)
Unter Android 8.0 können Nutzer durch langes Drücken auf App-Launcher-Symbole Benachrichtigungen aufrufen.
AutoFill-Framework
Kontoerstellung, Anmeldung und Kreditkartentransaktionen nehmen Zeit in Anspruch und sind fehleranfällig. Nutzer können schnell frustriert sein, wenn Anwendungen solche sich wiederholenden Aufgaben erfordern.
Android 8.0 (API-Level 26) erleichtert durch die Einführung des Autofill-Frameworks das Ausfüllen von Formularen wie Anmelde- und Kreditkartenformularen. Vorhandene und neue Apps funktionieren mit dem Autofill-Framework, nachdem der Nutzer das automatische Ausfüllen aktiviert hat.
Sie können einige Schritte unternehmen, um die Funktionsweise Ihrer App mit dem Framework zu optimieren. Weitere Informationen finden Sie unter Übersicht über das Autofill-Framework.
Herunterladbare Schriftarten
Mit Android 8.0 (API-Level 26) und der Android Support Library 26 kannst du Schriftarten von einer Anbieteranwendung anfordern, anstatt Schriftarten im APK bündeln oder das APK herunterladen zu lassen. Mit dieser Funktion wird die APK-Größe verringert, die Erfolgsquote der App-Installation erhöht und die Verwendung derselben Schriftart für mehrere Apps ermöglicht.
Weitere Informationen zum Herunterladen von Schriftarten finden Sie unter Herunterladbare Schriftarten.
Schriftarten in XML
Mit Android 8.0 (API-Ebene 26) wird eine neue Funktion eingeführt: Schriftarten in XML. Damit können Sie Schriftarten als Ressourcen verwenden. Sie müssen also keine Schriftarten
als Assets bündeln. Schriftarten werden in der Datei R
kompiliert und sind im System automatisch als Ressource verfügbar. Sie können dann mithilfe des neuen Ressourcentyps font
auf diese Schriftarten zugreifen.
Support Library 26 bietet vollständige Unterstützung für diese Funktion auf Geräten mit API-Version 14 und höher.
Weitere Informationen zur Verwendung von Schriftarten als Ressourcen und zum Abrufen von Systemschriftarten finden Sie unter Schriftarten in XML.
Größe von TextView anpassen
Mit Android 8.0 (API-Level 26) können Sie die Größe des Textes automatisch je nach Größe der TextView maximieren oder minimieren. Es ist also viel einfacher, die Textgröße auf verschiedenen Bildschirmen oder mit dynamischen Inhalten zu optimieren. Weitere Informationen zum automatischen Anpassen der TextView-Größe unter Android 8.0 finden Sie unter TextView automatisch anpassen.
Adaptive Symbole
Mit Android 8.0 (API-Level 26) werden adaptive Launcher-Symbole eingeführt. Adaptive Symbole unterstützen visuelle Effekte und können eine Vielzahl von Formen auf verschiedenen Gerätemodellen anzeigen. Informationen zum Erstellen adaptiver Symbole finden Sie im Leitfaden zu adaptiven Symbolen.
Farbverwaltung
Android-Entwickler von Bildverarbeitungs-Apps können jetzt neue Geräte mit einem farbenfähigen Display mit breitem Farbspektrum nutzen. Zur Darstellung von Bildern im Wide-Gamut-Format müssen Apps in ihrem Manifest (pro Aktivität) ein Flag aktivieren und Bitmaps mit einem eingebetteten Wide-Farbprofil (AdobeRGB, Pro Photo RGB, DCI-P3 usw.) laden.
WebView-APIs
Android 8.0 bietet mehrere APIs, mit denen du die WebView
-Objekte verwalten kannst, die Webinhalte in deiner App anzeigen. Unter anderem werden durch diese APIs die Stabilität und Sicherheit deiner App verbessert:
- Versions-API
- Google Safe Browsing-API
- Beendigungs-Alias-API
- Renderer Importance API
Weitere Informationen zur Verwendung dieser APIs finden Sie unter WebViews verwalten.
Die Klasse WebView
enthält jetzt eine Safe Browsing API, um die Sicherheit beim Surfen im Web zu erhöhen. Weitere Informationen finden Sie unter Google Safe Browsing API.
Verknüpfungen und Widgets anpinnen
Mit Android 8.0 (API-Level 26) kannst du Verknüpfungen und Widgets innerhalb der App anpinnen. Je nach Nutzerberechtigung kannst du in deiner App angepinnte Verknüpfungen und Widgets für unterstützte Launcher erstellen.
Weitere Informationen finden Sie im Funktionsleitfaden zum Anpinnen von Verknüpfungen und Widgets.
Maximales Seitenverhältnis des Bildschirms
Unter Android 8.0 (API-Level 26) wurden Änderungen beim Konfigurieren des maximalen Seitenverhältnisses einer App vorgenommen.
Zuerst wird in Android 8.0 das Attribut maxAspectRatio eingeführt, mit dem Sie das maximale Seitenverhältnis für Ihre App festlegen können. Darüber hinaus ist in Android 8.0 und höher das standardmäßige maximale Seitenverhältnis einer App das native Seitenverhältnis des Geräts, auf dem die App ausgeführt wird.
Weitere Informationen zur Angabe eines maximalen Seitenverhältnisses findest du unter Unterstützung verschiedener Bildschirme.
Multi-Display-Unterstützung
Ab Android 8.0 (API-Level 26) bietet die Plattform erweiterte Unterstützung für mehrere Bildschirme. Wenn eine Aktivität den Mehrfenstermodus unterstützt und auf einem Gerät mit mehreren Displays ausgeführt wird, können Nutzer die Aktivität von einem Bildschirm auf einen anderen verschieben. Wenn eine App eine Aktivität startet, kann sie angeben, auf welchem Display die Aktivität ausgeführt werden soll.
Hinweis : Wenn eine Aktivität den Mehrfenstermodus unterstützt, wird diese Aktivität in Android 8.0 automatisch für diese Aktivität aktiviert. Du solltest deine Anwendung testen, um sicherzustellen, dass sie in einer Umgebung mit mehreren Displays richtig funktioniert.
Es kann immer nur eine Aktivität auf einmal den Status „Fortsetzung“ haben, auch wenn die App mehrere Bildschirme hat. Die fokussierte Aktivität befindet sich im fortgesetzten Status. Alle anderen sichtbaren Aktivitäten werden pausiert, aber nicht angehalten. Weitere Informationen zum Aktivitätslebenszyklus, wenn mehrere Aktivitäten sichtbar sind, finden Sie unter Mehrfenster-Lebenszyklus.
Wenn ein Nutzer eine Aktivität von einer Anzeige auf eine andere verschiebt, passt das System die Größe der Aktivität an und nimmt bei Bedarf Laufzeitänderungen vor. Ihre Aktivität kann die Konfigurationsänderung selbst verarbeiten oder dem System ermöglichen, den Prozess mit Ihrer Aktivität zu löschen und ihn mit den neuen Dimensionen neu zu erstellen. Weitere Informationen finden Sie unter Konfigurationsänderungen verarbeiten.
ActivityOptions
bietet zwei neue Methoden zur Unterstützung mehrerer Bildschirme:
setLaunchDisplayId()
- Gibt an, auf welchem Display die Aktivität beim Start angezeigt werden soll.
getLaunchDisplayId()
- Gibt die Anzeige des aktuellen Starts der Aktivität zurück.
Die ADB-Shell wird erweitert, um mehrere Bildschirme zu unterstützen.
Mit dem Befehl shell start
kann jetzt eine Aktivität gestartet und die Zielanzeige der Aktivität angegeben werden:
adb shell start <activity_name> --display <display_id>
Ränder und Abstände im Layout vereinheitlicht
Mit Android 8.0 (API-Ebene 26) ist es einfacher, Situationen anzugeben, in denen gegenüberliegende Seiten eines View
-Elements denselben Rand oder dasselbe Abstand verwenden.
Insbesondere können Sie jetzt die folgenden Attribute in Ihren Layout-XML-Dateien verwenden:
-
layout_marginVertical
, die gleichzeitiglayout_marginTop
undlayout_marginBottom
definiert. -
layout_marginHorizontal
, die gleichzeitiglayout_marginLeft
undlayout_marginRight
definiert. -
paddingVertical
, die gleichzeitigpaddingTop
undpaddingBottom
definiert. -
paddingHorizontal
, die gleichzeitigpaddingLeft
undpaddingRight
definiert.
Hinweis:Wenn Sie die Logik Ihrer App so anpassen, dass verschiedene Sprachen und Kulturen, einschließlich der Textrichtung, unterstützt werden, dürfen diese Attribute keine Auswirkungen auf die Werte von
layout_marginStart
,
layout_marginEnd
,
paddingStart
und
paddingEnd
haben. Sie können diese Werte zusätzlich zu den neuen Attributen für das vertikale und horizontale Layout selbst festlegen, um ein Layoutverhalten zu erzeugen, das von der Textrichtung abhängt.
Zeigererfassung
Einige Anwendungen wie Spiele, Remote-Desktop- und Virtualisierungsclients bieten enorme Vorteile von der Kontrolle über den Mauszeiger. Die Zeigererfassung ist eine neue Funktion in Android 8.0 (API-Level 26), die eine solche Kontrolle bietet, indem alle Mausereignisse an eine fokussierte Ansicht in Ihrer App gesendet werden.
Ab Android 8.0 kann ein View
in Ihrer App die Zeigererfassung anfordern und einen Listener zum Verarbeiten erfasster Zeigerereignisse definieren. Der Mauszeiger ist in diesem Modus ausgeblendet. Die Ansicht kann die Zeigererfassung loslösen,
wenn die Mausinformationen nicht mehr benötigt werden. Das System kann die Zeigererfassung auch dann loslassen, wenn die Ansicht den Fokus verliert, z. B. wenn der Nutzer eine andere App öffnet.
Informationen zur Verwendung dieser Funktion in Ihrer Anwendung finden Sie unter Zeigererfassung.
App-Kategorien
Mit Android 8.0 (API-Level 26) kann für jede App eine passende Kategorie angegeben werden. Anhand dieser Kategorien werden Apps mit ähnlichem Zweck oder ähnlicher Funktion in einem Cluster zusammengefasst, wenn sie Nutzern präsentiert werden, z. B. in Bezug auf Datennutzung, Akkunutzung oder Speichernutzung. Du kannst eine Kategorie für deine App definieren, indem du das android:appCategory
-Attribut im Manifest-Tag <application>
festlegst.
Android TV Launcher
Android 8.0 (API-Level 26) umfasst einen neuen inhaltsorientierten Android TV-Startbildschirm, der mit dem Android TV-Emulator und dem Nexus Player-Gerätebild für Android 8.0 verfügbar ist. Auf dem neuen Startbildschirm sind Videoinhalte in Zeilen angeordnet, die den Kanälen entsprechen. Jeder Kanal wird von einer App im System mit Programmen gefüllt. Apps können mehrere Kanäle veröffentlichen und Nutzer können konfigurieren, welche Kanäle auf dem Startbildschirm angezeigt werden sollen. Der Android TV-Startbildschirm enthält auch die Zeile „Empfohlene Videos“, die je nach Sehgewohnheiten des Nutzers Programme aus Apps enthält. Apps können auch Videovorschauen bereitstellen, die automatisch abgespielt werden, wenn sich ein Nutzer auf ein Programm konzentriert. Die APIs zum Ausfüllen von Kanälen und Programmen sind Teil der TvProvider APIs, die unter Android 8.0 als Android Support Library-Modul bereitgestellt werden.
Animator-Set
Ab Android 8.0 (API-Level 26) unterstützt die AnimatorSet
API jetzt das Suchen und Abspielen in umgekehrter Richtung. Mit der Suche können Sie die Position der Animation auf einen bestimmten Zeitpunkt festlegen. Die rückwärts gerichtete Wiedergabe ist nützlich, wenn Ihre App Animationen für Aktionen enthält, die rückgängig gemacht werden können. Anstatt zwei verschiedene Animationssätze zu definieren, können Sie dasselbe in umgekehrter Reihenfolge wiedergeben.
Eingabe und Navigation
Tastaturnavigations-Cluster
Wenn eine Aktivität in Ihrer Anwendung eine komplexe Ansichtshierarchie wie die in Abbildung 2 verwendet, sollten Sie Gruppen von UI-Elementen in Clustern organisieren, um die Tastaturnavigation zwischen diesen zu erleichtern. Nutzer können auf Chromebook-Geräten mit Meta + Tab oder Suche + Tab von einem Cluster zum anderen wechseln. Gute Beispiele für Cluster sind: Seitenleisten, Navigationsleisten, Hauptinhaltsbereiche und Elemente, die viele untergeordnete Elemente enthalten können.
![Eine Beispielaktivität mit fünf Navigationsclustern, in denen der Nutzer über die Tastenkombination für die Clusternavigation navigieren kann. Die Cluster werden in der folgenden Anordnung angezeigt: oberes Steuerfeld, linke Seitenleiste, Hauptinhaltsbereich, unteres Steuerfeld und unverankerte Aktionsschaltfläche.](https://developer.android.com/static/images/about/versions/oreo/keyboard-navigation-clusters.png?authuser=6&hl=de)
Wenn Sie ein View
- oder ViewGroup
-Element in einen Cluster umwandeln möchten, setzen Sie das Attribut
android:keyboardNavigationCluster
in der Layout-XML-Datei des Elements auf true
oder übergeben Sie true
an setKeyboardNavigationCluster()
in der UI-Logik Ihrer Anwendung.
Hinweis:Cluster können nicht verschachtelt sein. Nicht verschachtelte Cluster können jedoch auf verschiedenen Hierarchieebenen vorkommen. Wenn Sie versuchen, Cluster zu verschachteln, behandelt das Framework nur das oberste ViewGroup
-Element als Cluster.
Auf Geräten mit Touchscreens können Sie das android:touchscreenBlocksFocus
-Element eines ViewGroup
-Objekts, das als Cluster gekennzeichnet ist, auf true
festlegen, um eine Nur-Cluster-Navigation in und aus diesem Cluster zu ermöglichen. Wenn Sie diese Konfiguration auf einen Cluster anwenden, können Nutzer nicht mit der Tabulatortaste oder den Pfeiltasten zum Cluster wechseln. Stattdessen müssen sie die Tastaturkombination für die Clusternavigation drücken.
Standardfokus ansehen
In Android 8.0 (API-Ebene 26) können Sie die View
zuweisen, die hervorgehoben werden soll, nachdem eine (neu erstellte) Aktivität fortgesetzt wird und der Nutzer eine Tastaturnavigationstaste, z. B. die Tabulatortaste drückt. Wenn Sie die Einstellung „standardmäßig fokussiert“ anwenden möchten, setzen Sie das Attribut
android:focusedByDefault
eines View
-Elements in der Layout-XML-Datei, die das UI-Element enthält, auf true
. Alternativ können Sie true
an setFocusedByDefault()
in der UI-Logik Ihrer App übergeben.
Sprachausgabe
Aktivitäten und Dienste können Instanzen von TextToSpeech
verwenden, um Inhalte zu diktieren und auszusprechen. Ab Android 8.0 (API-Ebene 26) kann Ihre App genauere Zeitinformationen darüber erhalten, wann eine Sprachausgabe-Engine einzelne synthetisierte Wörter spricht, sofern die Suchmaschine diese Informationen bereitstellt. Mit dieser Funktion können Sie die Aufmerksamkeit auf bestimmte Wörter lenken, die von der Sprachausgabe-Funktion vorgelesen werden.
Registrieren Sie eine Instanz von UtteranceProgressListener
, um diese Verbesserungen der Sprachausgabe-Engine in Ihrer App zu verwenden. Fügen Sie im Rahmen des Registrierungsprozesses einen Handler für die Methode onRangeStart()
hinzu.
Die Sprachausgabe-Engine ruft rangeStart()
auf, um den Zeitpunkt aufzuzeichnen, zu dem die Audiowiedergabe eines bestimmten Textbereichs erwartet wird. Sobald die Audiodaten für diesen Textbereich wiedergegeben werden, wird die Methode onRangeStart()
der App ausgeführt. Die Anwendung kann dann auf diesen Callback reagieren, indem sie z. B. den Textbereich markiert, der der Äußerung zugeordnet ist.
Weitere Informationen zum Verfolgen des Wiedergabefortschritts einer Sprachausgabe-Engine finden Sie in der Referenz zur UtteranceProgressListener
-Klasse.
System
Neue StrictMode-Detektoren
Unter Android 8.0 (API-Level 26) werden drei neue StrictMode-Detektoren hinzugefügt, mit denen du potenzielle Programmfehler in deiner App leichter erkennen kannst:
detectUnbufferedIo()
erkennt, wenn Ihre Anwendung Daten ohne Zwischenspeichern liest oder schreibt, was die Leistung erheblich beeinträchtigen kann.detectContentUriWithoutPermission()
erkennt, wenn Ihre App versehentlich vergisst, einer anderen App Berechtigungen zu erteilen, wenn sie eine Activity außerhalb Ihrer App startet.detectUntaggedSockets()
erkennt, wenn Ihre App Netzwerktraffic ausführt, ohnesetThreadStatsTag(int)
zum Taggen des Traffics zu Fehlerbehebungszwecken zu verwenden.
Daten im Cache
Android 8.0 (API-Level 26) bietet bessere Anleitungen und Verhaltensweisen im Zusammenhang mit im Cache gespeicherten Daten. Jeder Anwendung wird nun ein Speicherplatzkontingent für im Cache gespeicherte Daten zugewiesen, wie von getCacheQuotaBytes(UUID)
zurückgegeben.
Wenn das System Speicherplatz freigeben muss, werden zuerst im Cache gespeicherte Dateien aus Anwendungen gelöscht, die das zugewiesene Kontingent am stärksten überschreiten. Wenn Sie also die im Cache gespeicherten Daten unter dem zugewiesenen Kontingent halten, gehören die im Cache gespeicherten Dateien zu den letzten Dateien im System, die bei Bedarf gelöscht werden. Wenn das System entscheidet, welche im Cache gespeicherten Dateien in der Anwendung gelöscht werden sollen, berücksichtigt es zuerst die ältesten Dateien (basierend auf der Änderungszeit).
Außerdem gibt es zwei neue Verhaltensweisen, die Sie pro Verzeichnis aktivieren können, um zu steuern, wie das System Ihre im Cache gespeicherten Daten freigibt:
- Mit
StorageManager.setCacheBehaviorAtomic()
kann angegeben werden, dass ein Verzeichnis und sein gesamter Inhalt als eine einzelne atomare Einheit gelöscht werden sollen. - Mit
setCacheBehaviorTombstone(File, boolean)
kann angegeben werden, dass die Dateien, anstatt Dateien in einem Verzeichnis zu löschen, auf 0 Byte gekürzt werden. Die leere Datei bleibt dabei intakt.
Wenn Sie Speicherplatz für große Dateien zuweisen müssen, sollten Sie die neue allocateBytes(FileDescriptor, long)
API verwenden. Diese löscht im Cache gespeicherte Dateien anderer Anwendungen (nach Bedarf) automatisch, um Ihrer Anfrage nachzukommen. Wenn Sie entscheiden, ob das Gerät genügend Speicherplatz für Ihre neuen Daten hat, sollten Sie getAllocatableBytes(UUID)
aufrufen, anstatt getUsableSpace()
zu verwenden. Ersteres berücksichtigt alle im Cache gespeicherten Daten, die das System für Sie löschen möchte.
Paging des Contentanbieters
Wir haben die Contentanbieter aktualisiert, um Unterstützung dafür zu bieten, dass große Datasets seitenweise geladen werden können. Eine Foto-App mit vielen Tausenden von Bildern kann beispielsweise eine Teilmenge der Daten abfragen, die auf einer Seite angezeigt werden sollen. Jede Seite mit Ergebnissen, die von einem Contentanbieter zurückgegeben wird, wird durch ein einzelnes Cursor-Objekt dargestellt. Sowohl ein Client als auch ein Anbieter müssen Paging implementieren, um diese Funktion nutzen zu können.
Ausführliche Informationen zu den Änderungen an Contentanbietern finden Sie unter ContentProvider
und ContentProviderClient
.
Anfragen zur Inhaltsaktualisierung
Die Klassen ContentProvider
und ContentResolver
enthalten jetzt jeweils eine refresh()
-Methode, sodass Clients leichter feststellen können, ob die angeforderten Informationen aktuell sind.
Sie können eine benutzerdefinierte Logik zur Aktualisierung von Inhalten hinzufügen, indem Sie ContentProvider
erweitern. Sie müssen die Methode refresh()
überschreiben, um true
zurückzugeben. Damit geben Sie den Clients Ihres Anbieters an, dass Sie versucht haben, die Daten selbst zu aktualisieren.
Ihre Client-App kann durch Aufrufen einer anderen Methode, die auch refresh()
genannt wird, explizit aktualisierte Inhalte anfordern. Übergeben Sie beim Aufrufen dieser Methode den URI der zu aktualisierenden Daten.
Hinweis: Da Sie Daten möglicherweise über ein Netzwerk anfordern, sollten Sie refresh()
nur dann auf Clientseite aufrufen, wenn es deutlich wird, dass der Inhalt veraltet ist.
Der häufigste Grund für diese Art der Inhaltsaktualisierung ist eine Wischgeste zum Aktualisieren, bei der die aktuelle UI explizit angefordert wird.
Verbesserungen von JobScheduler
Mit Android 8.0 (API-Level 26) wurden eine Reihe von Verbesserungen in JobScheduler
vorgenommen. Durch diese Verbesserungen wird es für Ihre App einfacher, die neuen Limits für die Hintergrundausführung einzuhalten, da Sie in der Regel geplante Jobs verwenden können, um die jetzt eingeschränkten Hintergrunddienste oder impliziten Sendeempfänger zu ersetzen.
Zu den Aktualisierungen von JobScheduler
gehören:
-
Sie können jetzt einem geplanten Job eine Arbeitswarteschlange zuweisen. Rufen Sie
JobScheduler.enqueue()
auf, um der Warteschlange eines Jobs ein Arbeitselement hinzuzufügen. Wenn der Job ausgeführt wird, kann er ausstehende Arbeiten aus der Warteschlange entfernen und verarbeiten. Diese Funktion ermöglicht viele der Anwendungsfälle, in denen bisher das Starten eines Hintergrunddienstes erforderlich war, insbesondere Dienste, dieIntentService
implementieren. -
Mit der Android Support Library 26.0.0 wird eine neue
JobIntentService
-Klasse eingeführt, die dieselben Funktionen wieIntentService
bietet, aber unter Android 8.0 (API-Level 26) oder höher Jobs anstelle von Diensten verwendet. -
Sie können jetzt
JobInfo.Builder.setClipData()
aufrufen, um eineClipData
mit einem Job zu verknüpfen. Mit dieser Option können Sie einem Job URI-Berechtigungserteilungen auf ähnliche Weise zuordnen, wie diese Berechtigungen anContext.startService()
weitergegeben werden können. Sie können URI-Berechtigungserteilungen auch mit Intents in Arbeitswarteschlangen verwenden. -
Geplante Jobs unterstützen jetzt mehrere neue Einschränkungen:
JobInfo.isRequireStorageNotLow()
- Der Job wird nicht ausgeführt, wenn auf dem Gerät nur noch wenig Speicherplatz verfügbar ist.
JobInfo.isRequireBatteryNotLow()
- Der Job wird nicht ausgeführt, wenn der Akkustand den kritischen Schwellenwert erreicht oder unterschreitet. Dies ist der Akkustand, bei dem auf dem Gerät das Systemdialogfeld Warnung bei niedrigem Akkustand angezeigt wird.
NETWORK_TYPE_METERED
- Für den Job ist wie bei den meisten Mobilfunktarifen eine kostenpflichtige Netzwerkverbindung erforderlich.
Benutzerdefinierter Datenspeicher
Mit Android 8.0 (API-Level 26) kannst du einen benutzerdefinierten Datenspeicher für deine Einstellungen bereitstellen. Das kann nützlich sein, wenn deine App die Einstellungen in einer Cloud- oder lokalen Datenbank speichert oder wenn die Einstellungen gerätespezifisch sind. Weitere Informationen zum Implementieren des Datenspeichers finden Sie unter Benutzerdefinierter Datenspeicher.
Verbesserungen bei Medien
VolumeShaper
Es gibt einen neuen VolumeShaper
-Kurs. Verwenden Sie sie für kurze automatische Übergänge, z. B. Ein-, Aus- und Überblendungen.
Weitere Informationen finden Sie unter Amplitude mit VolumeShaper steuern.
Verbesserter Audiofokus
Audio-Apps teilen die Audioausgabe eines Geräts, indem sie den Audiofokus anfordern und aufgeben.
Eine App verarbeitet Änderungen im Fokus, indem sie die Wiedergabe startet oder beendet oder die Lautstärke verringert.
Es gibt einen neuen AudioFocusRequest
-Kurs. Wenn diese Klasse als Parameter von requestAudioFocus()
verwendet wird, haben Apps neue Funktionen beim Umgang mit Änderungen des Audiofokus: automatisches Ducking und verzögerte Fokussierung.
Medienmesswerte
Die neue Methode getMetrics()
gibt ein PersistableBundle
-Objekt zurück, das Konfigurations- und Leistungsinformationen enthält, die als Zuordnung von Attributen und Werten ausgedrückt werden.
Die Methode getMetrics()
ist für diese Medienklassen definiert:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Messwerte werden für jede Instanz separat erfasst und bleiben für die Lebensdauer der Instanz bestehen. Wenn keine Messwerte verfügbar sind, gibt die Methode null zurück. Die tatsächlich zurückgegebenen Messwerte hängen von der Klasse ab.
Mediaplayer
Ab Android 8.0 (API-Level 26) kann MediaPlayer DRM-geschützte Materialien und mit HLS-Sampleebene verschlüsselte Medien wiedergeben.
In Android 8.0 wird ein neuer, überlasteter seekTo()
-Befehl eingeführt, der eine differenzierte Kontrolle bei der Suche nach einem Frame bietet. Er enthält einen zweiten Parameter, der einen Suchmodus angibt:
SEEK_PREVIOUS_SYNC
verschiebt die Medienposition in einen Synchronisierungs- oder Schlüsselframe, der mit einer Datenquelle verknüpft ist, die sich direkt vor oder zu einem bestimmten Zeitpunkt befindet.SEEK_NEXT_SYNC
verschiebt die Medienposition in einen Synchronisierungs- oder Schlüsselframe, der mit einer Datenquelle verknüpft ist, die sich direkt nach oder zur angegebenen Zeit befindet.SEEK_CLOSEST_SYNC
verschiebt die Medienposition in einen Synchronisierungs- oder Schlüsselframe, der mit einer Datenquelle verknüpft ist, die sich zum angegebenen Zeitpunkt am nächsten befindet.SEEK_CLOSEST
verschiebt die Medienposition in einen Frame (nicht unbedingt ein Synchronisierungs- oder Keyframe), der mit einer Datenquelle verknüpft ist, die sich zum angegebenen Zeitpunkt am nächsten befindet.
Bei kontinuierlicher Suche sollten Apps einen der SEEK_
-Modi statt SEEK_CLOSEST
verwenden. Der Modus läuft zwar relativ langsamer, ist aber präziser.
Medienrekorder
- MediaRecorder unterstützt jetzt das MPEG2_TS-Format, das für das Streaming nützlich ist:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
MediaRecorder.OutputFormat
ansehen - Der
MediaMuxer
kann jetzt eine beliebige Anzahl von Audio- und Videostreams verarbeiten. Es ist nicht mehr auf einen Audiotrack und/oder einen Videotrack beschränkt. MitaddTrack()
kannst du beliebig viele Titel mischen. - Das
MediaMuxer
kann auch einen oder mehrere Metadaten-Tracks hinzufügen, die benutzerdefinierte Informationen pro Frame enthalten. Das Format der Metadaten wird von Ihrer Anwendung definiert. Der Metadaten-Track wird nur für MP4-Container unterstützt.
Metadaten können für die Offlineverarbeitung nützlich sein. Beispielsweise können Gyroskopsignale des Sensors zur Videostabilisierung verwendet werden.
Wenn Sie einen Metadaten-Track hinzufügen, muss das MIME-Format des Tracks mit dem Präfix "application/" beginnen. Metadaten werden wie Video-/Audiodaten geschrieben, mit der Ausnahme, dass die Daten nicht aus einer MediaCodec
stammen. Stattdessen übergibt die Anwendung einen ByteBuffer
mit einem zugehörigen Zeitstempel an die Methode writeSampleData()
.
Der Zeitstempel muss auf derselben Zeit basieren wie die Video- und Audiotracks.
Die generierte MP4-Datei verwendet den in Abschnitt 12.3.3.2 der ISOBMFF definierten TextMetaDataSampleEntry
, um das MIME-Format der Metadaten zu signalisieren. Wenn Sie MediaExtractor
zum Extrahieren der Datei mit dem Metadatenspur verwenden, wird das MIME-Format der Metadaten in MediaFormat
extrahiert.
Verbesserter Zugriff auf Mediendateien
Mit dem
Storage Access Framework (SAF) können Anwendungen eine benutzerdefinierte DocumentsProvider
zur Verfügung stellen, die anderen Anwendungen Zugriff auf Dateien in einer Datenquelle gewähren kann. Tatsächlich kann ein Dokumentanbieter sogar Zugriff auf Dateien gewähren, die sich im Netzwerkspeicher befinden oder ein Protokoll wie Media Transfer Protocol (MTP) verwenden.
Der Zugriff auf große Mediendateien von einer Remote-Datenquelle ist jedoch mit einigen Herausforderungen verbunden:
- Mediaplayer benötigen Suchzugriff auf eine Datei eines Dokumentanbieters. In Fällen, in denen sich eine große Mediendatei in einer Remote-Datenquelle befindet, muss der Dokumentanbieter alle Daten im Voraus abrufen und einen Snapshot-Dateideskriptor erstellen. Der Mediaplayer kann die Datei nicht ohne Dateideskriptor wiedergeben. Die Wiedergabe kann daher erst beginnen, wenn der Dokumentanbieter das Herunterladen der Datei abgeschlossen hat.
- Manager von Mediensammlungen, z. B. Foto-Apps, müssen eine Reihe von Zugriffs-URIs durchlaufen, um Medien zu erreichen, die über bereichsspezifische Ordner auf einer externen SD-Karte gespeichert sind. Durch dieses Zugriffsmuster werden Massenvorgänge an Medien wie Verschieben, Kopieren und Löschen ziemlich langsam.
- Manager von Mediensammlungen können den Speicherort eines Dokuments aufgrund seines URI nicht ermitteln. Dadurch wird es für diese Art von Apps schwierig, Nutzern die Wahl zu lassen, wo sie eine Mediendatei speichern möchten.
Android 8.0 bewältigt jede dieser Herausforderungen durch Verbesserung des Storage Access Frameworks.
Benutzerdefinierte Dokumentanbieter
Ab Android 8.0 können Anbieter benutzerdefinierter Dokumente mit dem Storage Access Framework suchbare Dateideskriptoren für Dateien in einer Remote-Datenquelle erstellen. Die SAF kann eine Datei öffnen, um einen nativen suchbaren Dateideskriptor abzurufen. Die SAF sendet dann Anfragen mit einzelnen Byte an den Dokumentanbieter. Mit dieser Funktion kann ein Dokumentanbieter den genauen Bytebereich zurückgeben, der von einer Mediaplayer-App angefordert wurde, anstatt die gesamte Datei vorab im Cache zu speichern.
Um dieses Feature zu verwenden, müssen Sie die neue StorageManager.openProxyFileDescriptor()
-Methode aufrufen. Die Methode openProxyFileDescriptor()
akzeptiert ein ProxyFileDescriptorCallback
-Objekt als Callback. Die SAF ruft den Callback immer dann auf, wenn eine Clientanwendung Dateivorgänge mit dem vom Dokumentanbieter zurückgegebenen Dateideskriptor ausführt.
Direkter Zugriff auf Dokumente
Ab Android 8.0 (API-Ebene 26) können Sie die Methode getDocumentUri()
verwenden, um einen URI abzurufen, der auf dasselbe Dokument wie der angegebene mediaUri
verweist.
Da der zurückgegebene URI jedoch von einem DocumentsProvider
unterstützt wird, können Manager von Mediensammlungen direkt auf das Dokument zugreifen, ohne Strukturen von bereichsspezifischen Verzeichnissen durchlaufen zu müssen.
Dadurch können Medienmanager Dateivorgänge im Dokument deutlich schneller ausführen.
Achtung:Mit der Methode getDocumentUri()
werden nur Mediendateien gefunden. Apps erhalten keine Zugriffsberechtigung für diese Dateien. Weitere Informationen zum Erhalt von Zugriffsberechtigungen für Mediendateien finden Sie in der Referenzdokumentation.
Pfade zu Dokumenten
Wenn Sie das Storage Access Framework in Android 8.0 (API-Ebene 26) verwenden, können Sie mit der Methode findDocumentPath()
, die sowohl in der Klasse DocumentsContract
als auch in der Klasse DocumentsProvider
verfügbar ist, den Pfad vom Stammverzeichnis eines Dateisystems anhand der ID eines Dokuments ermitteln. Die Methode gibt diesen Pfad in einem DocumentsContract.Path
-Objekt zurück. In Fällen, in denen ein Dateisystem mehrere definierte Pfade zum selben Dokument hat, gibt die Methode den Pfad zurück, der am häufigsten verwendet wird, um das Dokument mit der angegebenen ID zu erreichen.
Diese Funktion ist in folgenden Fällen besonders nützlich:
- Ihre App verwendet das Dialogfeld „Speichern unter“, in dem der Speicherort eines bestimmten Dokuments angezeigt wird.
- Ihre Anwendung zeigt Ordner in einer Suchergebnisansicht an und muss die untergeordneten Dokumente laden, die sich in einem bestimmten Ordner befinden, wenn der Nutzer diesen Ordner auswählt.
Hinweis:Wenn Ihre App nur auf einige der Dokumente im Pfad zugreifen darf, umfasst der Rückgabewert von findDocumentPath()
nur die Ordner und Dokumente, auf die Ihre App zugreifen kann.
Audiowiedergabe überwachen
Der Systemdienst AudioManager
verwaltet eine Liste aktiver AudioPlaybackConfiguration
-Objekte, von denen jedes Informationen zu einer bestimmten Audiowiedergabesitzung enthält. Die Anwendung kann die derzeit aktiven Konfigurationen durch Aufrufen von getActivePlaybackConfigurations()
abrufen.
Ab Android 8.0 (API-Level 26) kannst du einen Callback registrieren, der deine App benachrichtigt, wenn sich ein oder mehrere AudioPlaybackConfiguration
-Objekte geändert haben. Rufen Sie dazu registerAudioPlaybackCallback()
auf und übergeben Sie eine Instanz von AudioManager.AudioPlaybackCallback
. Die Klasse AudioManager.AudioPlaybackCallback
enthält die Methode onPlaybackConfigChanged()
, die vom System aufgerufen wird, wenn sich die Konfiguration der Audiowiedergabe ändert.
Konnektivität
Wi-Fi-Aware
Android 8.0 (API-Level 26) unterstützt Wi-Fi Aware, das auf der Spezifikation des Neighbor Awareness Networking (NAN) basiert. Auf Geräten mit der entsprechenden Wi-Fi Aware-Hardware können Apps und Geräte in der Nähe das WLAN auch ohne Internet-Zugangspunkt erkennen und über WLAN kommunizieren. Wir arbeiten mit unseren Hardwarepartnern zusammen, um die Wi-Fi-Aware-Technologie so schnell wie möglich auf Ihren Geräten verfügbar zu machen. Informationen zur Einbindung von Wi-Fi Aware in Ihre App finden Sie unter Wi-Fi Aware.
Bluetooth
Mit Android 8.0 (API-Level 26) wird die Bluetooth-Unterstützung der Plattform um folgende Funktionen erweitert:
- Unterstützung des AVRCP 1.4-Standards, der das Stöbern in der Musikbibliothek ermöglicht
- Unterstützung des Standards Bluetooth Low Energy (BLE) 5.0
- Integration des Sony LDAC-Codecs in den Bluetooth-Stack
Kopplung von Companion-Geräten
Android 8.0 (API-Ebene 26) bietet APIs, mit denen Sie das Dialogfeld für die Kopplungsanfrage anpassen können, wenn Sie versuchen, das Gerät über Bluetooth, BLE oder WLAN zu koppeln. Weitere Informationen findest du unter Kopplung von Companion-Geräten.
Weitere Informationen zur Verwendung von Bluetooth unter Android finden Sie in der Bluetooth-Anleitung. Informationen zu Änderungen an Bluetooth, die für Android 8.0 (API-Level 26) spezifisch sind, finden Sie auf der Seite Verhaltensänderungen in Android 8.0 im Abschnitt Bluetooth.
Inhalte teilen
Intelligentes Teilen
Android 8.0 (API-Level 26) lernt die personalisierten Freigabeeinstellungen der Nutzer und versteht besser, für welche Inhaltstypen die richtigen Apps freigegeben werden. Wenn ein Nutzer beispielsweise das Foto eines Belegs aufnimmt, kann Android 8.0 eine App zur Kostenverfolgung vorschlagen. Wenn der Nutzer ein Selfie macht, kann eine Social-Media-App das Bild besser verarbeiten. Android 8.0 lernt alle diese Muster automatisch anhand der personalisierten Einstellungen der Nutzer.
Intelligentes Teilen funktioniert auch für andere Inhaltstypen als image
, z. B. audio
, video
, text
und URL
.
Fügen Sie dem Intent, der den Inhalt teilt, ein ArrayList
mit bis zu drei String-Annotationen hinzu, um das intelligente Teilen zu aktivieren. Die Anmerkungen sollten die wichtigsten Komponenten oder Themen des Inhalts beschreiben. Das folgende Codebeispiel zeigt, wie dem Intent Annotationen hinzugefügt werden:
Kotlin
val annotations: ArrayList<String> = arrayListOf( "topic1", "topic2", "topic3" ) intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations )
Java
ArrayList<String> annotations = new ArrayList<>(); annotations.add("topic1"); annotations.add("topic2"); annotations.add("topic3"); intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations );
Weitere Informationen zu intelligenten Freigaben finden Sie unter EXTRA_CONTENT_ANNOTATIONS
.
Textklassifikator
Auf kompatiblen Geräten können Apps einen neuen Textklassifikator verwenden, um zu prüfen, ob ein String mit einem bekannten Klassifikatorentitätstyp übereinstimmt, und Vorschläge für Auswahlalternativen zu erhalten. Zu den Entitäten, die vom System erkannt werden, gehören Adressen, URLs, Telefonnummern und E-Mail-Adressen. Weitere Informationen finden Sie unter TextClassifier
.
Bedienungshilfen
Android 8.0 (API-Level 26) unterstützt mehrere neue Bedienungshilfen für Entwickler, die ihre eigenen Bedienungshilfen erstellen:
- Eine neue Lautstärkekategorie zum Anpassen der Lautstärke der Bedienungshilfen.
- Fingerabdruckgesten als Eingabemechanismus.
- Mehrsprachige Sprachausgabe-Funktionen.
- Ein hardwarebasierter Kurzbefehl für Bedienungshilfen für den schnellen Zugriff auf eine bevorzugte Bedienungshilfe.
- Unterstützung fortlaufender Touch-Gesten oder programmatische Abfolgen von Strichen.
- Eine Schaltfläche für Bedienungshilfen zum Aufrufen einer von mehreren aktivierten Bedienungshilfen (nur auf Geräten mit einem softwaregerenderten Navigationsbereich verfügbar).
- Standardisierte einseitige Bereichswerte.
- Verschiedene Funktionen für die Textverarbeitung, einschließlich Hinweistext und Positionen von Bildschirmtextzeichen.
Sicherheit und Datenschutz
Berechtigungen
Mit Android 8.0 (API-Level 26) werden mehrere neue Berechtigungen im Zusammenhang mit Telefonie eingeführt:
- Mit der Berechtigung
ANSWER_PHONE_CALLS
kann deine App eingehende Anrufe programmatisch annehmen. Zum Verarbeiten eines eingehenden Anrufs in Ihrer App können Sie die MethodeacceptRingingCall()
verwenden. - Die Berechtigung
READ_PHONE_NUMBERS
gewährt deiner App Lesezugriff auf die auf einem Gerät gespeicherten Telefonnummern.
Diese Berechtigungen werden als gefährlich klassifiziert und sind Teil der Berechtigungsgruppe PHONE
.
Neue Kontozugriffs- und Discovery APIs
Unter Android 8.0 (API-Level 26) wurden verschiedene Verbesserungen dafür eingeführt, wie Apps auf Nutzerkonten zugreifen können. Für die von ihnen verwalteten Konten können Authenticatoren ihre eigenen Richtlinien verwenden, um zu entscheiden, ob Konten für eine App ausgeblendet oder Konten für eine App offengelegt werden sollen. Das Android-System verfolgt Anwendungen, die auf ein bestimmtes Konto zugreifen können.
In früheren Android-Versionen mussten Apps, die die Liste der Nutzerkonten verfolgen wollten, für alle Konten Updates abrufen, einschließlich Konten mit nicht verwandten Typen. Unter Android 8.0 wird die Methode addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
hinzugefügt, mit der Apps eine Liste von Kontotypen angeben können, für die Kontoänderungen empfangen werden sollen.
API-Änderungen
AccountManager bietet sechs neue Methoden, mit denen Authentifizierungsstellen steuern können, welche Anwendungen auf ein Konto zugreifen können:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: Legt die Sichtbarkeit für eine bestimmte Kombination aus Nutzerkonto und Paket fest.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: Ruft die Sichtbarkeit für eine bestimmte Kombination aus Nutzerkonto und Paket ab. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: Ermöglicht Authenticatoren, die Konten und Sichtbarkeitsstufen für ein bestimmtes Paket abzurufen. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: Ermöglicht Authenticatoren, gespeicherte Sichtbarkeitswerte für ein bestimmtes Konto abzurufen. -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: Ermöglicht Authenticators, die Sichtbarkeitswerte eines Kontos zu initialisieren. -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
: Fügt dem ObjektAccountManager
einenOnAccountsUpdateListener
-Listener hinzu. Dieser Listener wird vom System aufgerufen, wenn sich die Liste der Konten auf dem Gerät ändert.
In Android 8.0 (API-Ebene 26) werden zwei spezielle Paketnamenwerte eingeführt, um Sichtbarkeitsebenen für Anwendungen anzugeben, die nicht mit der Methode setAccountVisibility(android.accounts.Account, java.lang.String, int)
festgelegt wurden. Der Sichtbarkeitswert PACKAGE_NAME_KEY_LEGACY_VISIBLE
wird auf Apps mit der Berechtigung GET_ACCOUNTS
und auf Zielversionen von Android vor Android 8.0 oder auf Apps angewendet, deren Signaturen mit dem Authenticator übereinstimmen, der auf eine beliebige Android-Version ausgerichtet ist.
PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
bietet einen Standardwert für die Sichtbarkeit von Apps, die zuvor nicht festgelegt wurden und für die PACKAGE_NAME_KEY_LEGACY_VISIBLE
nicht gilt.
Weitere Informationen zu den neuen APIs für Zugriffs- und Discovery-Konten findest du in der Referenz zu AccountManager
und OnAccountsUpdateListener
.
Testen
Instrumentierungstests
Android 8.0 (API-Level 26) bietet die folgenden zusätzlichen Unterstützung für die Instrumentierungstests Ihrer App.
Für nicht standardmäßige Anwendungsprozesse ausführen
Sie können jetzt angeben, dass ein bestimmter Instrumentierungstest für einen Prozess außerhalb des Standardprozesses Ihrer Anwendung ausgeführt werden soll. Diese Konfiguration ist nützlich, wenn Ihre Anwendung mehrere Aktivitäten enthält, die in verschiedenen Prozessen ausgeführt werden.
Wenn Sie eine nicht standardmäßige Prozessinstrumentierung definieren möchten, rufen Sie die Manifestdatei und dann das gewünschte
<instrumentation>
-Element auf. Fügen Sie das Attribut android:targetProcess
hinzu und legen Sie als Wert einen der folgenden Werte fest:
- Der Name eines bestimmten Prozesses.
- Eine durch Kommas getrennte Liste von Prozessnamen.
- Einen Platzhalter (
"*"
), mit dem die Instrumentierung für jeden gestarteten Prozess ausgeführt werden kann, der Code in dem im Attributandroid:targetPackage
angegebenen Paket ausführt.
Während der Instrumentierungstest ausgeführt wird, können Sie getProcessName()
aufrufen, um zu prüfen, welcher Prozess gerade getestet wird.
Ergebnisse während eines Tests melden
Sie können jetzt addResults()
aufrufen, um Ergebnisse zu melden, während der Instrumentierungstest ausgeführt wird (und nicht danach).
Mock-Intents für Tests
In Android 8.0 (API-Ebene 26) wurde die Methode onStartActivity()
eingeführt, um das Erstellen isolierter, unabhängiger UI-Tests für die Aktivitäten deiner App zu vereinfachen. Sie überschreiben diese Methode in einer benutzerdefinierten abgeleiteten Klasse der Instrumentation.ActivityMonitor
-Klasse, um einen bestimmten Intent zu verarbeiten, den Ihre Testklasse aufruft.
Wenn die Testklasse den Intent aufruft, gibt die Methode ein Stub-Instrumentation.ActivityResult
-Objekt zurück, anstatt den Intent selbst auszuführen. Wenn Sie diese Mock-Intent-Logik in Ihren Tests verwenden, können Sie sich darauf konzentrieren, wie Ihre Aktivität den Intent vorbereitet und verarbeitet, den Sie an eine andere Aktivität oder eine völlig andere Anwendung übergeben.
Laufzeit und Tools
Plattformoptimierungen
Android 8.0 (API-Level 26) bringt Laufzeit- und andere Optimierungen auf der Plattform, die zu einer Reihe von Leistungsverbesserungen führen. Zu diesen Optimierungen gehören die automatische Speicherbereinigung bei gleichzeitiger Verdichtung, eine effizientere Speichernutzung und der Speicherort des Codes.
Diese Optimierungen führen zu kürzeren Startzeiten sowie zu einer besseren Leistung in Betriebssystem und Anwendungen.
Aktualisierte Java-Sprachunterstützung
Android 8.0 (API-Level 26) unterstützt mehrere zusätzliche OpenJDK-Java-APIs:
java.time
aus OpenJDK 8.java.nio.file
undjava.lang.invoke
aus OpenJDK 7.
Weitere Informationen zu den Klassen und Methoden in diesen neu hinzugefügten Paketen finden Sie in der API-Referenzdokumentation.
Wenn Sie die Sprachfunktionen von Java 8 in Android Studio verwenden möchten, sollten Sie die aktuelle Vorschauversion herunterladen.
Aktualisierte ICU4J Android Framework APIs
Android 8.0 (API-Level 26) erweitert die ICU4J Android Framework APIs – eine Untergruppe der ICU4J APIs – für App-Entwickler, die sie unter dem android.icu
-Paket verwenden können. Diese APIs verwenden Lokalisierungsdaten, die auf dem Gerät vorhanden sind. So können Sie Ihr APK reduzieren, indem Sie die ICU4J-Bibliotheken nicht in Ihrem APK kompilieren.
Tabelle 1 ICU-, CLDR- und Unicode-Versionen, die in Android verwendet werden.
Android-API-Level | ICU-Version | CLDR-Version | Unicode-Version |
---|---|---|---|
Android 7.0 (API-Level 24), Android 7.1 (API-Level 25) | 56 | 28 | 8.0 |
Android 8.0 (API-Level 26) | 58,2 | 30.0.3 | 9.0 |
Weitere Informationen zur Internationalisierung unter Android, einschließlich ICU4J-Unterstützung, findest du unter Internationalisierung unter Android.
Android Enterprise
Für Geräte mit Android 8.0 (API-Ebene 26) wurden neue Unternehmensfunktionen und APIs eingeführt. Zu den Highlights gehören:
- Mit Arbeitsprofilen auf vollständig verwalteten Geräten können Unternehmen ihre Arbeit von privaten Daten trennen und gleichzeitig beide verwalten.
- Mithilfe der API-Delegierung können Geräte- und Profilinhaber anderen Anwendungen die App-Verwaltung zuweisen.
- Verbesserungen der Nutzerfreundlichkeit im Bereitstellungsablauf (einschließlich neuer Anpassungsoptionen) verkürzen die Einrichtungszeit.
- Unternehmen können mit neuen Einstellungen über Bluetooth, WLAN, Back-up und Sicherheit noch mehr Geräte verwalten. Das Logging von Netzwerkaktivitäten hilft Unternehmen, Probleme zu ermitteln.
Weitere Informationen zu diesen und anderen neuen APIs und Funktionen von Android Enterprise finden Sie unter Android für Unternehmen.