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 Desktopfenstermodus, in dem Nutzer die Größe jeder Aktivität frei ändern können, kann von Herstellern von Geräten mit großem Bildschirm 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. Sie können den Modus für mehrere Fenster auch für Ihre App deaktivieren. Dazu legen Sie
resizeableActivity="false"
fest, damit die App immer im Vollbildmodus angezeigt wird.
Mit Android 8.0 (API-Ebene 26) wird der Bild-im-Bild-Modus auf Geräte mit kleinem Bildschirm ausgeweitet.
Unter Android 12 (API-Level 31) ist der Modus „Mehrere Fenster“ standardmäßig aktiviert.
Auf großen Bildschirmen (mittel oder erweitert) unterstützt die Plattform alle Apps im Multifenstermodus unabhängig von der App-Konfiguration. Bei
resizeableActivity="false"
wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen anzupassen.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“.
- App 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-Ebene 24) eingeführt, damit Apps, die im Splitscreen-Modus ausgeführt werden, Aktivitäten im nebenliegenden Fenster starten können.
Unter Android 12L (API-Ebene 32) und höher wurde die Definition des Flags erweitert, damit Apps, die im Vollbildmodus ausgeführt werden, den Splitscreen-Modus aktivieren und dann Aktivitäten im nebenliegenden 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 den Fokus hat, z. B. wenn die Benachrichtigungsleiste geöffnet ist. Die Methode onStop()
funktioniert wie gewohnt: Sie wird jedes Mal aufgerufen, wenn eine Aktivität vom Display verschwindet.
Die Wiedergabe mehrerer Streams 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" />
Ob ein bestimmtes Gerät diese Manifest-Metadaten unterstützt, können Sie in den Gerätespezifikationen nachlesen.
Android 9
Im Modus mit mehreren Fenstern unter Android 9 (API-Ebene 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 ordnet diesen sichtbaren, aber nicht fortgesetzten Aktivitäten jedoch eine höhere Priorität zu als Aktivitäten, die nicht sichtbar sind. 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 es mehrere Aktivitäten innerhalb eines einzelnen aktiven App-Prozesses gibt, wird die Aktivität mit der höchsten Z-Reihenfolge fortgesetzt und die anderen werden angehalten.
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ätszyklus wie wenn das System die App benachrichtigt, dass das Gerät von der Hoch- zur Querformatausrichtung gewechselt ist, mit der Ausnahme, dass die App-Abmessungen geändert werden, anstatt nur getauscht 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 ins Hintertreffen gerät, 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 „Mehrere Wiedergabepositionen“ zu unterstützen.
Der Callback wird aufgerufen, wenn eine Aktivität die Position der aktuell fortgesetzten Aktivität erhält 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 eine App auch aus anderen Gründen Ressourcen verlieren kann, z. B. durch das Entfernen einer freigegebenen 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 Kamerazugriff garantiert, da andere Apps, die die Kamera verwenden, auf anderen Displays geöffnet werden können.
Ihre App muss die Kamera nicht unbedingt freigeben, wenn der Fokus verloren geht. 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 ist, die gerade im Vordergrund ist. Sie muss jedoch den Fall der Verbindungsunterbrechung ordnungsgemäß behandeln. Wenn die oberste fortgesetzte App die Kamera verwenden möchte, kann sie sie öffnen und Ihre App verliert den Zugriff. Ihre App kann die Kamera wieder öffnen, wenn sie wieder den Fokus erhält.
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 Szenarien mit mehreren Bildschirmen. Bei mehreren Aktivitäten kann gleichzeitig Nutzerinput empfangen werden.
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 die aktuelle Anzeige 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
Bei der Verwendung mehrerer Bildschirme ist es wichtig, den richtigen Kontext zu verwenden. Beim Zugriff auf Ressourcen unterscheidet sich der angezeigte Aktivitätskontext vom nicht angezeigten Anwendungskontext.
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 Sie diese Funktion in onCreate()
haben, können Sie diese Entscheidungen vor der ersten Layoutanpassung treffen. Diese Messwerte sollten nicht zum Layouten 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 Displays über den Systemdienst 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();
Mit der Klasse Display
können Sie Informationen zu einem bestimmten Display abrufen, z. B. die Displaygröße oder Flags, die angeben, ob ein Display 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 in einem Textfeld auf diesem Display Eingaben erforderlich sind.
Hintergründe
Unter Android 10 (API-Level 29) können sekundäre Bildschirme einen Hintergrund haben. Das Framework erstellt für jedes Display 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 spezielle 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.
Wenn Sie Messwerte für andere Displays als das aktuelle Display abrufen möchten, gehen Sie so vor (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.
Unter Android 12 (API-Level 31) werden die Display
-Methoden getRealSize()
und getRealMetrics()
eingestellt. Ihr Verhalten wird so angepasst, dass es dem von getMaximumWindowMetrics()
besser entspricht.
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 übergeordneten Aktivität gelten für alle Aktivitäten in ihrem Aufgabenstapel. 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 Multifenstermodus 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
festgelegt ist, kann die Aktivität im Splitscreen- und Desktopfenstermodus 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 Multifenstermodus zu starten, wird der Vollbildmodus aktiviert.
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 Modus für mehrere Fenster. 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
Legen Sie dieses Attribut im Knoten <activity>
Ihres Manifests fest, um anzugeben, ob die Aktivität den Bild-in-Bild-Modus unterstützt.
<activity
android:name=".MyActivity"
android:supportsPictureInPicture=["true" | "false"] />
configChanges
Wenn Sie Änderungen an der Mehrfensterkonfiguration selbst verwalten möchten, z. B. wenn ein Nutzer die Größe eines Fensters ändert, fügen Sie dem Knoten <activity>
Ihres App-Manifests 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 Datenansichten manuell aktualisieren, Ressourcen neu laden und bei Bedarf andere Vorgänge 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 gestartet wird.android:gravity
: Die ursprüngliche Platzierung der Aktivität, wenn sie im Fenstermodus des Desktops gestartet wird. Geeignete Werte finden Sie in der KlasseGravity
.android:minHeight
,android:minWidth
: Mindesthöhe und Mindestbreite für die Aktivität sowohl im Splitscreen- als auch im 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 diesen verlässt. Das System übergibt der Methode den Wert „wahr“, wenn die Aktivität in den Multifenstermodus wechselt, oder „falsch“, wenn sie den Multifenstermodus verlässt.onPictureInPictureModeChanged()
: Das System ruft diese Methode immer dann 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 die Aktivität 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 Sie eine Aktivität im Bild-im-Bild-Modus starten möchten, rufen Sie enterPictureInPictureMode()
auf. Diese Methode hat keine Auswirkungen, wenn das Gerät den Bild-im-Bild-Modus nicht unterstützt. Weitere Informationen finden Sie unter Videos per Bild-im-Bild (PiP) hinzufügen.
Neue Aktivitäten im Mehrfenstermodus
Wenn Sie eine neue Aktivität starten, können Sie angeben, dass sie 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 im Modus „Mehrere Fenster“ als separates Fenster 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 ausführliche 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 Ihrer App in einem separaten Fenster starten möchten, können Sie neue Aktivitäten mit dem Flag FLAG_ACTIVITY_NEW_TASK
starten. Sie können dies mit einigen der Attribute für mehrere Fenster kombinieren, um einen bestimmten Speicherort 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. Eine singleInstancePerTask
-Aktivität kann beispielsweise mehrmals in verschiedenen Aufgaben instanziiert werden, wenn FLAG_ACTIVITY_MULTIPLE_TASK
oder FLAG_ACTIVITY_NEW_DOCUMENT
festgelegt ist.
Verwechseln Sie das mehrinstanzielle Layout nicht mit einem Layout mit mehreren Bereichen, z. B. einer Liste mit Detailinformationen, die SlidingPaneLayout
verwendet und in einem einzigen Fenster ausgeführt wird.
Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden, werden eine oder mehrere Instanzen möglicherweise in den Hintergrund verschoben, wenn sich die Position ä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, es sei denn, die App deklariert eine feste Ausrichtung.
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:
Öffnen Sie die App im Vollbildmodus und wechseln Sie dann in den Modus „Mehrere Fenster“, indem Sie lange auf die Schaltfläche Letzte drücken. Prüfen Sie, ob die App richtig wechselt.
Starten Sie die App direkt im Modus mit mehreren Fenstern und prüfen Sie, ob sie ordnungsgemäß gestartet wird. Sie können eine App im Mehrfenstermodus starten, indem Sie auf die Schaltfläche Letzte Apps tippen, dann die Titelleiste der App lange gedrückt halten und sie auf einen der markierten Bereiche auf dem Display ziehen.
Sie können die Größe der App im Splitscreen-Modus ändern, 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 die Benutzeroberfläche nicht zu lange braucht, um nach der Größenänderung der App aktualisiert zu werden.
API-Level 31 oder höher
Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist und die Mindestbreite und Mindesthöhe der Hauptaktivität kleiner oder gleich den jeweiligen Abmessungen des verfügbaren Anzeigebereichs sind, prüfen Sie alle Verhaltensweisen, die für API-Level 24 bis 30 aufgeführt sind.
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 deaktivieren
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. Prüfen Sie, ob die App nicht abstürzt, die wichtigsten Funktionen sichtbar sind und die Größenänderung nicht zu lange dauert.
Führen Sie mehrere Größenanpassungen in schneller Folge aus. Prüfen Sie, ob Ihre App nicht abstürzt oder Speicherlecks aufweist. Der Memory Profiler von Android Studio liefert Informationen zur Arbeitsspeichernutzung Ihrer App. Weitere Informationen finden Sie unter Arbeitsspeichernutzung Ihrer App mit dem 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 mehrerer Fenster unter Android finden Sie unter:
- 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