Im Multifenstermodus können mehrere Apps gleichzeitig auf demselben Bildschirm angezeigt werden. Apps können nebeneinander oder übereinander angezeigt werden (Splitscreen-Modus), eine App in einem kleinen Fenster, das andere Apps überlagert (Bild-im-Bild-Modus), oder einzelne Apps in separaten, verschiebbaren und veränderbaren Fenstern (Desktopfenster-Modus).
Eine Anleitung zum Aufrufen des Splitscreen-Modus auf Smartphones finden Sie unter Zwei Apps gleichzeitig anzeigen lassen – Pixel.
Versionsspezifische Funktionen für mehrere Fenster
Die Multifenster-Funktion hängt von der Android-Version und dem Gerätetyp ab:
Mit Android 7.0 (API-Ebene 24) wurde der Splitscreen-Modus auf Geräten mit kleinem Display und der Bild-im-Bild-Modus auf ausgewählten Geräten eingeführt.
Im Splitscreen-Modus werden zwei Apps auf dem Display angezeigt, entweder nebeneinander oder übereinander. Nutzer können den Trennstrich zwischen den beiden Apps ziehen, um eine App größer und die andere kleiner zu machen.
Im Bild-im-Bild-Modus können Nutzer die Videowiedergabe fortsetzen, während sie mit einer anderen App interagieren (siehe Unterstützung für Bild-im-Bild).
Der Desktop-Fenstermodus, in dem Nutzer die Größe der einzelnen Aktivitäten frei anpassen können, kann von Herstellern von Geräten mit großen Bildschirmen aktiviert werden.
Sie können festlegen, wie Ihre App den Modus mit mehreren Fenstern handhabt, indem Sie die Mindestabmessungen für Ihre Aktivität angeben. Du kannst den Mehrfenstermodus für deine App auch deaktivieren, indem du
resizeabableActivity="false"
festlegst, damit das System deine App immer im Vollbildmodus anzeigt.
Mit Android 8.0 (API-Ebene 26) wird der Bild-im-Bild-Modus auf Geräte mit kleinem Bildschirm ausgeweitet.
Android 12 (API-Level 31) verwendet den Mehrfenstermodus zum Standardverhalten.
Auf großen Bildschirmen (Klasse mittlere Fenster oder maximiertes Fenster) unterstützt die Plattform unabhängig von der Anwendungskonfiguration alle Anwendungen im Mehrfenstermodus. Wenn
resizeableActivity="false"
, wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen zu berücksichtigen.Auf kleinen Bildschirmen (Fenstergrößenklasse kompakt) prüft das System die
minWidth
undminHeight
einer Aktivität, um festzustellen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann. WennresizeableActivity="false"
festgelegt ist, wird die Ausführung der App im Mehrfenstermodus unabhängig von der Mindestbreite und ‑höhe verhindert.
Splitscreen-Modus
So aktivieren Nutzer den Splitscreen-Modus:
- Öffnen Sie den Bildschirm „Letzte Apps“.
- Apps in den Blickfeld wischen
- Drücken Sie in der Titelleiste der App auf das App-Symbol.
- Menüoption für Splitscreen auswählen
- Wählen Sie auf dem Bildschirm „Letzte Apps“ eine andere App aus oder schließen Sie den Bildschirm „Letzte Apps“ und starten Sie eine andere App.
Nutzer beenden den Splitscreen-Modus, indem sie die Fenstertrennlinie zum Rand des Displays ziehen – nach oben oder unten, links oder rechts.
Nebeneinander starten
Wenn Ihre App über einen Intent auf Inhalte zugreifen muss, können Sie mit FLAG_ACTIVITY_LAUNCH_ADJACENT
die Inhalte in einem nebeneinander liegenden Splitscreen-Fenster öffnen.
FLAG_ACTIVITY_LAUNCH_ADJACENT
wurde in Android 7.0 (API-Level 24) eingeführt, damit Apps, die im Splitscreen-Modus ausgeführt werden, Aktivitäten im angrenzenden Fenster starten können.
Android 12L (API-Level 32) und höher haben die Definition des Flags erweitert, damit Apps im Vollbildmodus den Splitscreen-Modus aktivieren und dann Aktivitäten im angrenzenden Fenster starten können.
Wenn Sie eine benachbarte Aktivität starten möchten, verwenden Sie FLAG_ACTIVITY_LAUNCH_ADJACENT
in Kombination mit FLAG_ACTIVITY_NEW_TASK
, z. B.:
Kotlin
fun openUrlInAdjacentWindow(url: String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK) }.also { intent -> startActivity(intent) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
Aktivitätslebenszyklus im Mehrfenstermodus
Der Modus mit mehreren Fenstern ändert den Aktivitätszyklus nicht. Der fortgesetzte Status von Apps in mehreren Fenstern unterscheidet sich jedoch bei verschiedenen Android-Versionen.
Mehrere Fortsetzungen
Android 10 (API-Level 29) und höher unterstützen die Wiederaufnahme mehrerer Apps. Alle Aktivitäten bleiben im Status RESUMED
, wenn sich das Gerät im Multifenstermodus befindet. Eine Aktivität kann pausiert werden, wenn eine transparente Aktivität darüber liegt oder die Aktivität nicht fokussiert werden kann, z. B. wenn sie sich im Bild-im-Bild-Modus befindet. Es ist auch möglich, dass zu einem bestimmten Zeitpunkt keine Aktivität im Fokus ist, z. B. wenn die Benachrichtigungsleiste geöffnet ist. Die Methode onStop()
funktioniert wie gewohnt und wird jedes Mal aufgerufen, wenn eine Aktivität vom Bildschirm entfernt wird.
Die Multi-Resume-Funktion ist auch auf ausgewählten Geräten mit Android 9 (API-Level 28) verfügbar. Wenn Sie die Wiederaufnahme mehrerer App-Instanzen auf Android 9-Geräten aktivieren möchten, fügen Sie die folgenden Manifest-Metadaten hinzu:
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
Informationen dazu, ob ein bestimmtes Gerät diese Manifest-Metadaten unterstützt, findest du in den Gerätespezifikationen.
Android 9
Im Mehrfenstermodus unter Android 9 (API-Level 28) und niedriger ist zu einem bestimmten Zeitpunkt nur die Aktivität aktiv, mit der der Nutzer zuletzt interagiert hat. Diese Aktivität gilt als oberste und ist die einzige Aktivität im Status RESUMED
. Alle anderen sichtbaren Aktivitäten sind STARTED
, aber nicht RESUMED
.
Das System räumt diesen sichtbaren, aber nicht wiederaufgenommenen Aktivitäten jedoch eine höhere Priorität zu als nicht sichtbaren Aktivitäten. Wenn der Nutzer mit einer der sichtbaren Aktivitäten interagiert, wird diese Aktivität fortgesetzt und die zuvor oberste Aktivität wechselt in den Status STARTED
.
Wenn ein einzelner aktiver Anwendungsprozess mehrere Aktivitäten umfasst, wird die Aktivität mit der höchsten Z-Reihenfolge fortgesetzt und die anderen werden pausiert.
Konfigurationsänderungen
Wenn der Nutzer eine App in den Multifenstermodus versetzt, benachrichtigt das System die Aktivität einer Konfigurationsänderung, wie unter Konfigurationsänderungen verarbeiten angegeben. Das passiert auch, wenn der Nutzer die Größe der App ändert oder sie wieder in den Vollbildmodus versetzt.
Im Wesentlichen hat diese Änderung dieselben Auswirkungen auf den Aktivitätslebenszyklus wie wenn das System die App benachrichtigt, dass das Gerät vom Hochformat zum Querformat gewechselt wurde, mit der Ausnahme, dass die App-Abmessungen geändert werden, anstatt einfach nur vertauscht zu werden. Ihre Aktivität kann die Konfigurationsänderung selbst verarbeiten oder Ihre App kann dem System erlauben, die Aktivität zu löschen und mit den neuen Dimensionen neu zu erstellen.
Wenn der Nutzer die Größe eines Fensters ändert und es in einer der beiden Dimensionen vergrößert, passt das System die Größe der Aktivität an die Nutzeraktion an und nimmt bei Bedarf Konfigurationsänderungen vor. Wenn die App bei der Darstellung neu sichtbarer Bereiche hinterherhinkt, füllt das System diese Bereiche vorübergehend mit der Farbe aus, die durch das Attribut windowBackground
oder durch das Standardstilattribut windowBackgroundFallback
angegeben ist.
Exklusiver Ressourcenzugriff
Verwenden Sie den Lebenszyklus-Callback onTopResumedActivityChanged()
, um die Funktion für mehrere Fortsetzungen zu unterstützen.
Der Callback wird aufgerufen, wenn eine Aktivität die Position der aktuell fortgesetzten Aktivität gewinnt oder verliert. Das ist wichtig, wenn eine Aktivität eine freigegebene Singleton-Ressource wie das Mikrofon oder die Kamera verwendet:
Kotlin
override fun onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
Beachten Sie, dass in einer Anwendung aus anderen Gründen Ressourcen verloren gehen können, z. B. durch das Entfernen einer gemeinsam genutzten Hardware.
In jedem Fall sollte eine App Ereignisse und Statusänderungen, die sich auf die verfügbaren Ressourcen auswirken, ordnungsgemäß verarbeiten.
Bei Apps, die eine Kamera verwenden, ist CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged()
ein Hinweis darauf, dass es ein guter Zeitpunkt sein könnte, den Zugriff auf die Kamera zu versuchen.
Diese Methode ist ab Android 10 (API-Level 29) verfügbar.
Denken Sie daran, dass resizeableActivity=false
keinen exklusiven Zugriff auf die Kamera garantiert, da andere Apps, die die Kamera verwenden, auf anderen Displays geöffnet werden können.
Ihre App muss die Kamera nicht loslassen, wenn die App den Fokus verliert. Beispielsweise kann die Kameravorschau fortgesetzt werden, während der Nutzer mit der App interagiert, die gerade im Vordergrund ist. Es ist in Ordnung, wenn Ihre App die Kamera weiter verwendet, wenn sie nicht die App im Vordergrund ist, die gerade fortgesetzt wird. Sie muss jedoch den Fall der Verbindungsunterbrechung ordnungsgemäß behandeln. Wenn die oberste fortgesetzte App die Kamera verwenden möchte, kann sie diese öffnen und Ihre App hat keinen Zugriff mehr. Deine App kann die Kamera wieder öffnen, wenn sie wieder im Fokus ist.
Nachdem eine App einen CameraDevice.StateCallback#onDisconnected()
-Callback erhalten hat, wird bei nachfolgenden Aufrufen des Kamerageräts eine CameraAccessException
geworfen.
Mehrfachanzeige
Android 10 (API-Level 29) unterstützt Aktivitäten auf sekundären Displays. Wenn eine Aktivität auf einem Gerät mit mehreren Displays ausgeführt wird, können Nutzer die Aktivität von einem Display auf ein anderes verschieben. Multi-Resume gilt auch für Multiscreen-Szenarien. Mehrere Aktivitäten können gleichzeitig eine Nutzereingabe erhalten.
Eine App kann beim Starten oder beim Erstellen einer anderen Aktivität angeben, auf welchem Display sie ausgeführt werden soll. Dieses Verhalten hängt vom in der Manifestdatei definierten Aktivitätsstartmodus und von den Intent-Flags und -Optionen ab, die von der Entität festgelegt wurden, die die Aktivität startet. Weitere Informationen finden Sie in der Klasse ActivityOptions
.
Wenn eine Aktivität auf ein sekundäres Display verschoben wird, kann es zu einem Kontextupdate, einer Fenstergrößenänderung sowie zu Konfigurations- und Ressourcenänderungen kommen. Wenn die Aktivität die Konfigurationsänderung verarbeitet, wird sie in onConfigurationChanged()
benachrichtigt. Andernfalls wird die Aktivität neu gestartet.
Eine Aktivität sollte das aktuelle Display in onCreate()
und onConfigurationChanged()
prüfen, wenn die Konfigurationsänderung verarbeitet wird. Aktualisieren Sie die Ressourcen und Layouts, wenn sich das Display ändert.
Wenn der ausgewählte Startmodus für eine Aktivität mehrere Instanzen zulässt, kann durch das Starten auf einem sekundären Bildschirm eine neue Instanz der Aktivität erstellt werden. Beide Aktivitäten werden gleichzeitig fortgesetzt.
Lesen Sie auch die Informationen zu den Multi-Display APIs, die in Android 8.0 eingeführt wurden.
Aktivitäts- und Anwendungskontext im Vergleich
Bei Multi-Display-Anzeigen ist es entscheidend, den richtigen Kontext zu verwenden. Beim Zugriff auf Ressourcen unterscheidet sich der Aktivitätskontext (der angezeigt wird) vom Anwendungskontext (der nicht der Fall ist).
Der Aktivitätskontext enthält Informationen zum Display und wird immer an den Displaybereich angepasst, in dem die Aktivität angezeigt wird. So erhalten Sie die richtigen Informationen zur Displaydichte oder zu den Fenstermesswerten Ihrer App. Sie sollten immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext) verwenden, um Informationen zum aktuellen Fenster oder Display zu erhalten. Das betrifft auch einige System-APIs, die Informationen aus dem Kontext verwenden (siehe z. B. Übersicht über Toasts).
Die Konfiguration des Aktivitätsfensters und das übergeordnete Display definieren Ressourcen und Kontext. So rufen Sie das aktuelle Display ab:
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
Messwerte für das aktuelle Aktivitätsfenster abrufen:
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Maximalfenstermesswerte für die aktuelle Systemkonfiguration abrufen:
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
Die Messwerte für das maximale Fenster dienen dazu, Berechnungen durchzuführen, Layoutentscheidungen zu treffen oder die Größe der Ressourcen zu bestimmen, die vorab abgerufen werden sollen. Wenn dies in onCreate()
verfügbar ist, können Sie diese Entscheidungen vor dem ersten Layout-Durchlauf treffen. Diese Messwerte sollten nicht für das Layout bestimmter Ansichtselemente verwendet werden. Verwenden Sie stattdessen Informationen aus dem Configuration
-Objekt.
Display-Aussparungen
Bei faltbaren Geräten kann die Aussparung im zusammengeklappten und im aufgeklappten Zustand unterschiedlich sein. Informationen dazu, wie Sie Probleme mit Display-Aussparungen vermeiden, finden Sie unter Display-Aussparungen unterstützen.
Sekundäre Displays
Sie können die verfügbaren Bildschirme über den Systemdienst von DisplayManager
abrufen:
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays();
Verwenden Sie die Klasse Display
, um Informationen zu einer bestimmten Anzeige abzurufen, z. B. die Anzeigegröße oder Flags, die angeben, ob eine Anzeige sicher ist.
Angenommen werden darf jedoch nicht, dass die Displaygröße mit dem Ihrer Anwendung zugewiesenen Anzeigebereich übereinstimmt. Denken Sie daran, dass Ihre App im Multifenstermodus einen Teil des Displays einnimmt.
So legen Sie fest, ob eine Aktivität auf einem Display gestartet werden kann:
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
Starten Sie dann die Aktivität auf dem Display:
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(targetDisplay.displayId); startActivity(intent, options.toBundle());
Unterstützung für mehrere Displays
Android unterstützt die Multi-Display-Funktion für Softwaretastaturen, Hintergründe und Launcher.
Softwaretastatur
Eine Tastatur kann auf einem sekundären Bildschirm angezeigt werden, wenn das Display so konfiguriert ist, dass Systemdekorationen unterstützt werden. Der Editor für Eingabemethoden wird automatisch angezeigt, wenn ein Textfeld auf dieser Anzeige Eingaben anfordert.
Hintergründe
Unter Android 10 (API-Level 29) können sekundäre Bildschirme einen Hintergrund haben. Das Framework erstellt für jede Anzeige eine separate Instanz von WallpaperService.Engine
. Achten Sie darauf, dass die Oberfläche der einzelnen Motoren unabhängig voneinander gezeichnet wird. Entwickler können Assets mithilfe des Displaykontexts in WallpaperService.Engine#getDisplayContext()
laden. Achten Sie außerdem darauf, dass in der Datei WallpaperInfo.xml
android:supportsMultipleDisplays="true"
festgelegt ist.
Launcher
Die neue Intent-Filterkategorie SECONDARY_HOME
bietet eine dedizierte Aktivität für sekundäre Bildschirme. Instanzen der Aktivität werden auf allen Displays verwendet, die Systemdekorationen unterstützen, jeweils eine pro Display.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
Die Aktivität muss einen Startmodus haben, der mehrere Instanzen nicht verhindert und sich an unterschiedliche Bildschirmgrößen anpassen kann. Der Startmodus darf nicht singleInstance
oder singleTask
sein.
Die AOSP-Implementierung von Launcher3
unterstützt beispielsweise eine SECONDARY_HOME
-Aktivität.
Messwerte für Zeitfenster
Mit Android 11 (API-Level 30) wurden die folgenden WindowManager
-Methoden eingeführt, um die Grenzen von Apps anzugeben, die im Mehrfenstermodus ausgeführt werden:
getCurrentWindowMetrics()
: Gibt einWindowMetrics
-Objekt für den aktuellen Fensterstatus des Systems zurück.getMaximumWindowMetrics()
: GibtWindowMetrics
für den größten potenziellen Fensterstatus des Systems zurück.
Die Methoden computeCurrentWindowMetrics()
und computeMaximumWindowMetrics()
der Jetpack WindowManager-Bibliothek bieten ähnliche Funktionen, sind aber abwärtskompatibel mit API-Ebene 14.
So rufen Sie Messwerte für andere als die aktuelle Anzeige ab (wie im Code-Snippet gezeigt):
- Displaykontext erstellen
- Fensterkontext für das Display erstellen
WindowManager
des Fensterkontexts abrufenWindowMetrics
des maximalen Anzeigebereichs abrufen, der für die App verfügbar ist
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
Eingestellte Methoden
Die Display
-Methoden getSize()
und getMetrics()
wurden in API-Ebene 30 zugunsten der neuen WindowManager
-Methoden eingestellt.
In Android 12 (API-Level 31) werden die Display
-Methoden getRealSize()
und getRealMetrics()
eingestellt. Außerdem wird ihr Verhalten aktualisiert, um dem Verhalten von getMaximumWindowMetrics()
besser zu entsprechen.
Konfiguration des Mehrfenstermodus
Wenn Ihre App auf Android 7.0 (API-Level 24) oder höher ausgerichtet ist, können Sie konfigurieren, wie und ob die Aktivitäten Ihrer App den Mehrfenstermodus unterstützen. Sie können Attribute in Ihrem Manifest festlegen, um sowohl Größe als auch Layout zu steuern. Die Attributeinstellungen einer Stammaktivität gelten für alle Aktivitäten innerhalb ihres Aufgabenstapels. Wenn die Stammaktivität beispielsweise android:resizeableActivity="true"
hat, können alle Aktivitäten im Aufgabenstapel neu skaliert werden. Auf einigen größeren Geräten wie Chromebooks wird Ihre App möglicherweise in einem Fenster ausgeführt, das sich ändern lässt, auch wenn Sie android:resizeableActivity="false"
angeben. Wenn dies zu Problemen mit Ihrer App führt, können Sie mit Filtern bei Google Play die Verfügbarkeit Ihrer App auf solchen Geräten einschränken.
Unter Android 12 (API-Level 31) ist standardmäßig der Mehrfenstermodus aktiviert. Auf großen Bildschirmen (mittel oder erweitert) werden alle Apps unabhängig von der App-Konfiguration im Multifenstermodus ausgeführt. Auf kleinen Bildschirmen prüft das System die Einstellungen minWidth
, minHeight
und resizeableActivity
einer Aktivität, um festzustellen, ob die Aktivität im Multifenstermodus ausgeführt werden kann.
resizeableActivity
Legen Sie dieses Attribut im Element <activity>
oder <application>
Ihres Manifests fest, um den Mehrfenstermodus für API-Level 30 und niedriger zu aktivieren oder zu deaktivieren:
<application
android:name=".MyActivity"
android:resizeableActivity=["true" | "false"] />;
Wenn dieses Attribut auf true
gesetzt ist, kann die Aktivität im Splitscreen-Modus oder im Desktop-Fenstermodus gestartet werden. Wenn das Attribut auf false
gesetzt ist, unterstützt die Aktivität keinen Multifenstermodus. Wenn der Wert „false“ ist und der Nutzer versucht, die Aktivität im Mehrfenstermodus zu starten, übernimmt die Aktivität den gesamten Bildschirm.
Wenn Ihre App auf API-Level 24 oder höher ausgerichtet ist, Sie aber keinen Wert für dieses Attribut angeben, wird der Wert standardmäßig auf „wahr“ festgelegt.
Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist, funktioniert dieses Attribut auf kleinen und großen Bildschirmen unterschiedlich:
- Große Bildschirme (Fenstergrößenklasse mittel oder erweitert): Alle Apps unterstützen den Multifenstermodus. Das Attribut gibt an, ob die Größe einer Aktivität geändert werden kann. Bei
resizeableActivity="false"
wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen einzuhalten. - Kleine Bildschirme (Kompakt-Fenstergrößenklasse): Wenn
resizeableActivity="true"
und die Mindestbreite und Mindesthöhe der Aktivität die Anforderungen für den Multifenstermodus erfüllen, unterstützt die Aktivität den Multifenstermodus. WennresizeableActivity="false"
, wird der Modus mit mehreren Fenstern unabhängig von der Mindestbreite und -höhe der Aktivität nicht unterstützt.
supportsPictureInPicture
Lege dieses Attribut im Knoten <activity>
deines Manifests fest, um anzugeben, ob die Aktivität den Bild-im-Bild-Modus unterstützt.
<activity
android:name=".MyActivity"
android:supportsPictureInPicture=["true" | "false"] />
configChanges
Wenn Sie die Konfigurationsänderungen im Mehrfenstermodus selbst verarbeiten möchten, z. B. wenn ein Nutzer die Größe eines Fensters ändert, fügen Sie dem Knoten des App-Manifests <activity>
das Attribut android:configChanges
mit mindestens den folgenden Werten hinzu:
<activity
android:name=".MyActivity"
android:configChanges="screenSize | smallestScreenSize
| screenLayout | orientation" />
Nachdem du android:configChanges
hinzugefügt hast, erhalten deine Aktivitäten und Fragmente einen Callback zu onConfigurationChanged()
, anstatt gelöscht und neu erstellt zu werden. Anschließend können Sie Ihre Ansichten manuell aktualisieren, Ressourcen neu laden und andere Vorgänge nach Bedarf ausführen.
<layout>
Unter Android 7.0 (API-Level 24) und höher unterstützt das Manifest-Element <layout>
mehrere Attribute, die sich auf das Verhalten einer Aktivität im Mehrfenstermodus auswirken:
android:defaultHeight
,android:defaultWidth
: Standardhöhe und -breite der Aktivität, wenn sie im Fenstermodus (Desktop) gestartet wird.android:gravity
: anfängliche Platzierung der Aktivität beim Start im Windowing-Modus für Computer. Geeignete Werte finden Sie in der KlasseGravity
.android:minHeight
,android:minWidth
: Mindesthöhe und Mindestbreite für die Aktivität im Splitscreen- und Desktopfenstermodus. Wenn der Nutzer die Trennlinie im Splitscreen-Modus verschiebt, um eine Aktivität kleiner als die angegebene Mindestgröße zu machen, wird die Aktivität vom System auf die vom Nutzer angeforderte Größe zugeschnitten.
Im folgenden Code wird gezeigt, wie die Standardgröße und der Standardspeicherort einer Aktivität sowie die Mindestgröße angegeben werden, wenn die Aktivität im Fenstermodus des Desktops angezeigt wird:
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end|..."
android:minHeight="450dp"
android:minWidth="300dp" />
</activity>
Mehrfenstermodus zur Laufzeit
Ab Android 7.0 bietet das System Funktionen zur Unterstützung von Apps, die im Mehrfenstermodus ausgeführt werden können.
Deaktivierte Funktionen im Mehrfenstermodus
Im Modus „Mehrere Fenster“ deaktiviert oder ignoriert Android möglicherweise Funktionen, die sich nicht auf eine Aktivität beziehen, die den Bildschirm des Geräts mit anderen Aktivitäten oder Apps teilt.
Außerdem sind einige Optionen zur Anpassung der System-UI deaktiviert. Apps können die Statusleiste beispielsweise nicht ausblenden, wenn sie im Mehrfenstermodus ausgeführt werden (siehe Sichtbarkeit der System-UI steuern).
Änderungen am Attribut android:screenOrientation
werden vom System ignoriert.
Abfragen und Rückrufe im Mehrfenstermodus
Die Klasse Activity
bietet die folgenden Methoden zur Unterstützung des Multifenstermodus:
isInMultiWindowMode()
: Gibt an, ob die Aktivität im Modus mit mehreren Fenstern ausgeführt wird.isInPictureInPictureMode()
: Gibt an, ob die Aktivität im Bild-im-Bild-Modus ist.onMultiWindowModeChanged()
: Diese Methode wird vom System aufgerufen, wenn die Aktivität in den Multifenstermodus wechselt oder ihn verlässt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Mehrfenstermodus wechselt, oder den Wert „false“, wenn die Aktivität den Mehrfenstermodus verlässt.onPictureInPictureModeChanged()
: Das System ruft diese Methode auf, wenn die Aktivität in den Bild-im-Bild-Modus wechselt oder ihn verlässt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Bild-im-Bild-Modus wechselt, oder „false“, wenn sie den Bild-im-Bild-Modus verlässt.
Die Klasse Fragment
stellt Versionen vieler dieser Methoden bereit, z. B. Fragment.onMultiWindowModeChanged()
.
Bild-im-Bild-Modus
Wenn du eine Aktivität in den Bild-im-Bild-Modus versetzen möchtest, rufe enterPictureInPictureMode()
auf. Diese Methode hat keine Auswirkungen, wenn das Gerät den Bild-im-Bild-Modus nicht unterstützt. Weitere Informationen findest du unter Videos mit Bild im Bild (BiB) hinzufügen.
Neue Aktivitäten im Mehrfenstermodus
Wenn Sie eine neue Aktivität starten, können Sie angeben, dass die neue Aktivität nach Möglichkeit neben der aktuellen angezeigt werden soll. Verwenden Sie das Intent-Flag FLAG_ACTIVITY_LAUNCH_ADJACENT
, um das System anzuweisen, die neue Aktivität in einem benachbarten Fenster zu erstellen, sodass die beiden Aktivitäten den Bildschirm gemeinsam nutzen. Das System unternimmt zwar alle Anstrengungen, dies zu tun, kann dies aber nicht garantieren.
Wenn sich ein Gerät im Fenstermodus befindet und Sie eine neue Aktivität starten, können Sie die Abmessungen und die Position auf dem Display der neuen Aktivität angeben, indem Sie ActivityOptions.setLaunchBounds()
aufrufen. Die Methode hat keine Auswirkungen, wenn sich das Gerät nicht im Modus „Mehrere Fenster“ befindet.
Wenn Sie auf API-Ebene 30 oder niedriger eine Aktivität in einem Aufgabenstapel starten, ersetzt diese Aktivität die Aktivität auf dem Bildschirm und übernimmt alle Multifenstereigenschaften. Wenn Sie die neue Aktivität als separates Fenster im Mehrfenstermodus starten möchten, müssen Sie sie in einem neuen Aufgabenstapel starten.
Unter Android 12 (API-Level 31) können Apps das Aufgabenfenster einer Anwendung auf mehrere Aktivitäten aufteilen. Sie legen fest, wie die Aktivitäten in Ihrer App angezeigt werden – im Vollbildmodus, nebeneinander oder gestapelt –, indem Sie eine XML-Konfigurationsdatei erstellen oder Jetpack WindowManager API-Aufrufe ausführen.
Drag-and-Drop
Nutzer können Daten per Drag-and-drop von einer Aktivität in eine andere ziehen, während die beiden Aktivitäten den Bildschirm teilen. Vor Android 7.0 konnten Nutzer Daten nur innerhalb einer einzelnen Aktivität per Drag-and-drop verschieben. Informationen zum schnellen Hinzufügen der Unterstützung für das Akzeptieren von gesendeten Inhalten findest du in der DropHelper
API. Eine umfassende Anleitung zum Drag-and-drop finden Sie unter Drag-and-drop aktivieren.
Mehrere Instanzen
Jede Stammaktivität hat eine eigene Aufgabe, die in einem separaten Prozess ausgeführt wird und in einem eigenen Fenster angezeigt wird. Wenn Sie eine neue Instanz der Anwendung in einem separaten Fenster starten möchten, können Sie mit dem Flag FLAG_ACTIVITY_NEW_TASK
neue Aktivitäten starten. Sie können dies mit einigen der Mehrfensterattribute kombinieren, um eine bestimmte Position für das neue Fenster anzufordern. In einer Shopping-App können beispielsweise mehrere Fenster angezeigt werden, um Produkte zu vergleichen.
Unter Android 12 (API-Level 31) können Sie zwei Instanzen einer Aktivität nebeneinander im selben Aufgabenfenster starten.
Wenn Sie Nutzern erlauben möchten, über den App-Launcher oder die Taskleiste eine weitere Instanz Ihrer Anwendung zu starten, muss die Launcher-Aktivität android:resizeableActivity="true"
festlegen und darf keinen Startmodus verwenden, der mehrere Instanzen verhindert. Beispielsweise kann eine singleInstancePerTask
-Aktivität mehrmals in verschiedenen Aufgaben instanziiert werden, wenn FLAG_ACTIVITY_MULTIPLE_TASK
oder FLAG_ACTIVITY_NEW_DOCUMENT
festgelegt ist.
Verwechseln Sie nicht mehrere Instanzen mit einem Layout mit mehreren Steuerfeldern, z. B. einer Präsentation mit Details, die SlidingPaneLayout
verwendet und in einem einzelnen Fenster ausgeführt wird.
Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden, kann eine oder mehrere Instanzen in den Hintergrund verschoben werden, wenn sich der Sicherheitsstatus ändert. Angenommen, ein Gerät ist aufgeklappt und es werden zwei App-Instanzen in zwei Fenstern auf beiden Seiten des Scharniers ausgeführt. Wenn das Gerät zusammengeklappt ist, wird möglicherweise eine der Instanzen beendet, anstatt die Fenster für beide Instanzen auf einem kleineren Bildschirm anzupassen.
Bestätigung für den Mehrfenstermodus
Unabhängig davon, ob Ihre App auf API-Level 24 oder höher ausgerichtet ist, sollten Sie prüfen, wie sie sich im Multifenstermodus verhält, falls ein Nutzer versucht, sie auf einem Gerät mit Android 7.0 oder höher im Multifenstermodus zu starten.
Testgeräte
Geräte mit Android 7.0 (API-Level 24) oder höher unterstützen den Mehrfenstermodus.
API-Level 23 oder niedriger
Wenn Nutzer versuchen, die App im Mehrfenstermodus zu verwenden, ändert das System die Größe der App erzwungen, sofern die App keine feste Ausrichtung deklariert.
Wenn Ihre App keine feste Ausrichtung angibt, sollten Sie sie auf einem Gerät mit Android 7.0 oder höher starten und versuchen, die App im Splitscreen-Modus zu öffnen. Prüfen Sie, ob die App auch bei erzwungener Größenänderung für Nutzer zufriedenstellend ist.
Wenn die App eine feste Ausrichtung angibt, sollten Sie versuchen, die App in den Multifenstermodus zu versetzen. Prüfen Sie, ob die App dabei im Vollbildmodus bleibt.
API-Level 24 bis 30
Wenn Ihre App auf API-Level 24 bis 30 ausgerichtet ist und die Unterstützung mehrerer Fenster nicht deaktiviert, prüfen Sie das folgende Verhalten sowohl im Splitscreen- als auch im Desktopfenstermodus:
Starten Sie die App im Vollbildmodus und wechseln Sie dann in den Mehrfenstermodus, indem Sie lange auf die Schaltfläche Letzte Aufrufe drücken. Prüfen Sie, ob die App richtig wechselt.
Starten Sie die App direkt im Mehrfenstermodus und prüfen Sie, ob sie ordnungsgemäß gestartet wird. Sie können eine App im Mehrfenstermodus starten, indem Sie die Schaltfläche Letzte Aufrufe drücken, dann die Titelleiste der App lange gedrückt halten und sie in einen der hervorgehobenen Bereiche auf dem Bildschirm ziehen.
Passen Sie die Größe Ihrer App im Splitscreen-Modus an, indem Sie den Bildschirmteiler ziehen. Prüfen Sie, ob die App die Größe ohne Absturz ändern kann und ob die erforderlichen UI-Elemente sichtbar sind.
Wenn Sie Mindestabmessungen für Ihre App angegeben haben, versuchen Sie, die Größe der App so zu ändern, dass die Fenstergröße kleiner als diese Abmessungen ist. Prüfen Sie, ob die App nicht kleiner als die angegebenen Mindestabmessungen sein kann.
Prüfen Sie bei allen Tests, ob die Leistung Ihrer App akzeptabel ist. Prüfen Sie beispielsweise, ob es nach dem Ändern der Größe der App nicht zu lange dauert, bis die Benutzeroberfläche aktualisiert wird.
API-Level 31 oder höher
Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist und die Mindestbreite und -höhe der Hauptaktivität kleiner oder gleich den Abmessungen des verfügbaren Anzeigebereichs sind, prüfen Sie alle für die API-Ebenen 24 bis 30 aufgeführten Verhaltensweisen.
Checkliste für Tests
Führen Sie die folgenden Schritte aus, um die Leistung Ihrer App im Modus mit mehreren Fenstern zu prüfen. Sie sollten diese Vorgänge sowohl im Splitscreen- als auch im Desktopfenstermodus ausprobieren, sofern nicht anders angegeben.
Mehrfenstermodus aktivieren und verlassen
Wechseln Sie von Ihrer App zu einer anderen App und prüfen Sie, ob sich die App ordnungsgemäß verhält, während sie sichtbar, aber nicht aktiv ist. Wenn in Ihrer App beispielsweise ein Video abgespielt wird, prüfen Sie, ob das Video weiter abgespielt wird, während der Nutzer mit einer anderen App interagiert.
Im Splitscreen-Modus können Sie den Bildschirmteiler verschieben, um die App zu vergrößern oder zu verkleinern. Probieren Sie diese Vorgänge sowohl nebeneinander als auch übereinander aus. Achten Sie darauf, dass die App nicht abstürzt, wichtige Funktionen sichtbar sind und der Vorgang zur Größenänderung nicht zu lange dauert.
Führen Sie mehrere Größenanpassungen in schneller Folge aus. Achten Sie darauf, dass Ihre App nicht abstürzt und nicht Speicherlecks verursacht. Der Memory Profiler von Android Studio liefert Informationen zur Arbeitsspeichernutzung Ihrer App (siehe Arbeitsspeichernutzung Ihrer App mit Memory Profiler prüfen).
Verwenden Sie Ihre App in verschiedenen Fensterkonfigurationen und prüfen Sie, ob sie ordnungsgemäß funktioniert. Prüfen Sie, ob der Text gut lesbar ist und die UI-Elemente nicht zu klein sind, um damit interagieren zu können.
Unterstützung für Mehrfenstermodus deaktiviert
Wenn Sie bei den API-Ebenen 24 bis 30 den Mehrfenstermodus deaktiviert haben, indem Sie android:resizeableActivity="false"
festgelegt haben, sollten Sie Ihre App auf einem Gerät mit Android 7.0 bis 11 starten und versuchen, die App im Splitscreen- und Desktopfenstermodus zu öffnen. Achten Sie darauf, dass die App dabei im Vollbildmodus bleibt.
Weitere Informationen
Weitere Informationen zur Unterstützung des Mehrfenstermodus unter Android finden Sie hier:
- Android-Beispiel MultiWindowPlayground
Empfohlen für Sie * Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist. * Gerätekompatibilitätsmodus * Unterstützung für die Größenänderung auf großen Bildschirmen * Konfigurationsänderungen verarbeiten