Mehrfenstermodus unterstützen

Mit dem Mehrfenstermodus können mehrere Apps gleichzeitig denselben Bildschirm verwenden. Apps können nebeneinander oder übereinander (Splitscreen-Modus) angezeigt werden. ein kleines Fenster, das andere Apps überlagert (Bild-im-Bild-Modus), oder einzelne Apps in separaten beweglichen Fenstern mit anpassbarer Größe (Freiformmodus)

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Zwei Apps nebeneinander im Splitscreen-Modus anzeigen

Die Nutzererfahrung hängt von der Android-Version und dem Gerätetyp ab:

  • Splitscreen-Modus für Android 7.0 (API-Level 24) für kleine Bildschirme und auf ausgewählten Geräten den Bild-im-Bild-Modus.

    • Im Splitscreen-Modus werden zwei Apps auf dem Bildschirm angezeigt. nebeneinander oder übereinander liegen. Nutzer können die Trennlinie ziehen. und trennen die beiden Apps voneinander, sodass eine App größer und die andere kleiner wird.

    • Mit dem Bild-im-Bild-Modus können Nutzer die Videowiedergabe fortsetzen. während Sie mit einer anderen App interagieren (siehe Unterstützung von Bild im Bild).

    • Modus im freien Format, in dem Nutzer jede Aktivität kostenlos anpassen können, von Herstellern von Geräten mit großen Bildschirmen ermöglicht werden.

      Du kannst festlegen, wie deine App den Mehrfenstermodus handhaben soll, indem du Folgendes angibst: auf die Mindestgröße Ihrer Aktivität. Sie können auch Mehrfenstermodus für deine App, indem du resizeabableActivity="false", damit das System immer im Vollbildmodus der App.

  • Android 8.0 (API-Level 26) erweitert den Bild-im-Bild-Modus auf kleine Bildschirmgeräte.

  • Android 12 (API-Level 31) verwendet den Mehrfenstermodus zum Standardverhalten.

    • Auf großen Bildschirmen (Klasse mittlere oder maximierte Fenstergröße) Plattform unterstützt alle Apps im Mehrfenstermodus, unabhängig von der App Konfiguration. Wenn resizeableActivity="false", wird die App in Kompatibilitätsmodus, wenn dies erforderlich ist, um die Displayabmessungen zu berücksichtigen.

    • Auf kleinen Bildschirmen (kompakte Fenstergrößenklasse) prüft das System der minWidth und minHeight einer Aktivität, um zu bestimmen, kann die Aktivität im Mehrfenstermodus ausgeführt werden. Wenn resizeableActivity="false", die App kann nicht ausgeführt werden in Mehrfenstermodus unabhängig von der Mindestbreite und -höhe verwendet werden.

Splitscreen-Modus

So aktivieren Sie den Splitscreen-Modus:

  1. Öffnen Sie den Bildschirm „Letzte Apps“.
  2. App durch Wischen in Ansicht ziehen
  3. Tippen Sie auf das App-Symbol in der Titelleiste der App.
  4. Menüoption für den Splitscreen auswählen
  5. Wählen Sie auf dem Bildschirm „Letzte Apps“ eine andere App aus oder schließen Sie den Bildschirm „Letzte Apps“ und eine andere App ausführen

Nutzer können den geteilten Bildschirmmodus beenden, indem sie die Fensterteiler an den Rand des nach oben, unten, links oder rechts.

Benachbarte Startrampe

Wenn Ihre App über einen Intent auf Inhalte zugreifen muss, können Sie FLAG_ACTIVITY_LAUNCH_ADJACENT, um den Inhalt in einem angrenzenden Bereich zu öffnen Splitscreen-Fenster.

FLAG_ACTIVITY_LAUNCH_ADJACENT wurde in Android 7.0 (API-Level 24) eingeführt, um Apps im Split-Screen-Modus aktivieren, um Aktivitäten im angrenzenden .

Unter Android 12L (API-Level 32) und höher wurde die Definition des Flags auf Apps im Vollbildmodus aktivieren, um den Splitscreen-Modus zu aktivieren, und dann Aktivitäten im angrenzenden Fenster.

Um eine angrenzende Aktivität zu starten, verwende FLAG_ACTIVITY_LAUNCH_ADJACENT in mit FLAG_ACTIVITY_NEW_TASK. Beispiel:

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) } }

Aktivitätslebenszyklus im Mehrfenstermodus

Der Mehrfenstermodus ändert nicht den Aktivitätslebenszyklus. Die der fortgesetzte Zustand von Apps in mehreren Fenstern variiert je nach Version Android

Multi-Lebenslauf

Android 10 (API-Level 29) und höher unterstützen mehrere Fortsetzungen – alle Aktivitäten bleiben im RESUMED-Status, wenn sich das Gerät im Mehrfenstermodus befindet . Eine Aktivität kann pausiert werden, wenn eine transparente Aktivität über dem Aktivität oder die Aktivität ist nicht fokussierbar, z. B. wenn sie Bild-im-Bild-Modus aktivieren. Es ist auch möglich, dass keine Aktivität z. B. wenn die Benachrichtigungsleiste geöffnet ist. Die onStop() wie gewohnt funktioniert: Die Methode wird jedes Mal aufgerufen, wenn eine Aktivität beendet wird. auf dem Bildschirm.

Der Multi-Resume ist auch auf ausgewählten Geräten mit Android 9 (API-Level) verfügbar 28). Füge das folgende Manifest hinzu, um auf Android 9-Geräten die Mehrfach-Fortsetzung zu aktivieren Metadaten:

<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 der Gerätespezifikationen.

Android 9

Im Mehrfenstermodus unter Android 9 (API-Level 28) und niedriger wird nur die Aktivität mit dem der Nutzer zuletzt interagiert hat, zu einem bestimmten Zeitpunkt aktiv ist. Dieses Aktivität gilt als höchste Aktivität und ist die einzige Aktivität in der RESUMED Bundesstaat. Alle anderen sichtbaren Aktivitäten sind STARTED, sind aber nicht RESUMED. Das System verleiht diesen sichtbaren, aber nicht wiederaufgenommenen Aktivitäten einen höheren als Aktivitäten, die nicht sichtbar sind. Interagiert die nutzende Person mit einem der sichtbaren Aktivitäten, diese Aktivität wird fortgesetzt und die zuvor wechselt die Aktivität in den Status STARTED.

Wenn ein einzelner aktiver Anwendungsprozess mehrere Aktivitäten umfasst, Die Aktivität mit der höchsten Z-Reihenfolge wird fortgesetzt und die anderen werden pausiert.

Konfigurationsänderungen

Wenn der Nutzer eine App in den Mehrfenstermodus versetzt, benachrichtigt das System das Aktivität einer Konfigurationsänderung, wie in der Handle-Konfiguration angegeben Änderungen. Dies ist auch der Fall, wenn der Nutzer die Größe der App ändert oder die App wieder herunterlädt. in den Vollbildmodus wechseln.

Im Wesentlichen hat diese Änderung dieselben Auswirkungen auf den Aktivitätslebenszyklus benachrichtigt das System die App, dass das Gerät vom Hochformat auf Querformat verwenden, außer dass die App-Abmessungen die gerade vertauscht werden. Ihre Aktivität kann die Konfigurationsänderung selbst verarbeiten oder kann Ihre App es dem System ermöglichen, die Aktivität zu beseitigen und sie mit dem neue Dimensionen.

Wenn der Nutzer die Größe eines Fensters ändert und es in einer Dimension größer macht, Das System passt die Aktivität an die Konfiguration der Nutzeraktionen und Probleme an bei Bedarf anpassen. Wenn die App beim Zeichnen an neu belichteten Bereichen etwas zurückbleibt, füllt das System diese Bereiche vorübergehend mit der vom windowBackground-Attribut oder als Standard windowBackgroundFallback-Stilattribut.

Exklusiver Ressourcenzugriff

Zur Unterstützung der Funktion für mehrere Fortsetzungen verwenden Sie die onTopResumedActivityChanged()-Lebenszyklus-Callback.

Der Callback wird ausgelöst, wenn eine Aktivität die höchste fortgesetzte Aktivität zu- oder abnimmt oder verliert. was wichtig ist, wenn eine Aktivität eine gemeinsame Singleton-Ressource verwendet. wie das Mikrofon oder die Kamera:

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. } }

Beachten Sie, dass in einer App aus anderen Gründen Ressourcen verloren gehen können, z. B. durch das Entfernen eines gemeinsam genutzter Hardware.

In jedem Fall sollte eine App angemessen auf Ereignisse und Statusänderungen reagieren, auf verfügbare Ressourcen auswirken.

Bei Apps mit Kamera CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() deutet darauf hin, dass du jetzt versuchen solltest, Zugriff auf die Kamera zu erhalten. Diese Methode ist ab Android 10 (API-Level 29) verfügbar.

Denk daran, dass resizeableActivity=false keine Garantie für exklusive Kamerafunktionen bietet da andere Apps, die die Kamera verwenden, auf anderen Displays geöffnet werden können.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Abbildung 2: Kamera im Mehrfenstermodus.

Ihre App muss die Kamera nicht loslassen, wenn die App den Fokus verliert. Sie können z. B. die Kameravorschau fortsetzen, während der Nutzer mit der App interagiert. mit der neu fokussierten, fortgesetzten App. Es ist in Ordnung, wenn Ihre App wenn dies nicht die oberste fortgesetzte App ist, sondern die um das Lade-Case zu trennen. Wenn die oberste fortgesetzte App den Parameter können Sie sie öffnen und Ihre App hat dann keinen Zugriff mehr. Deine App kann die wenn die App wieder im Fokus ist.

Nachdem eine App eine CameraDevice.StateCallback#onDisconnected() erhalten hat -Rückruf zurücksetzt, wird bei nachfolgenden Anrufen auf dem Kameragerät eine CameraAccessException.

Multi-Display

Android 10 (API-Level 29) unterstützt Aktivitäten auf sekundären Displays. Wenn ein Aktivität auf einem Gerät mit mehreren Bildschirmen ausgeführt wird, können Nutzer von einem Display zum anderen. Multi-Resume gilt für und Multiscreen-Szenarien; können verschiedene Aktivitäten Benutzereingaben am .

Eine App kann festlegen, auf welchem Display sie beim Start oder beim Start erstellt eine weitere Aktivität. Dieses Verhalten hängt vom Startmodus der Aktivität ab die in der Manifestdatei und in den Intent-Flags und Optionen die die Aktivität startet. Weitere Informationen finden Sie im Kurs ActivityOptions Details.

Wenn eine Aktivität zu einer sekundären Anzeige verschoben wird, kann sie einen Kontext durchlaufen Aktualisierungen, Größenanpassung des Fensters sowie Konfigurations- und Ressourcenänderungen. Wenn die Aktivität die Konfigurationsänderung verarbeitet, wird die Aktivität onConfigurationChanged(); Andernfalls wird die Aktivität neu gestartet.

Für eine Aktivität sollten die aktuelle Anzeige in onCreate() und onConfigurationChanged(), wenn die Konfigurationsänderung verarbeitet wird. Achten Sie darauf, die Ressourcen und Layouts aktualisieren, wenn sich die Anzeige ändert.

Wenn der ausgewählte Startmodus für eine Aktivität mehrere Instanzen zulässt, wird der auf einem zweiten Bildschirm eine neue Instanz der Aktivität erstellen. Beide Aktivitäten werden zeitgleich fortgesetzt.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Abbildung 3: Mehrere Instanzen einer Aktivität auf mehreren Bildschirmen.

Informieren Sie sich auch über die Multi-Display-APIs, in Android 8.0.

Aktivitäts- und Anwendungskontext im Vergleich

Bei Multi-Display-Anzeigen ist es entscheidend, den richtigen Kontext zu verwenden. Beim Zugriff auf Ressourcen Der Aktivitätskontext (der angezeigt wird) unterscheidet sich von der Anwendung. Kontext (was nicht der Fall ist).

Der Aktivitätskontext enthält Informationen über den Bildschirm und wird immer an den Anzeigebereich angepasst, in dem die Aktivität angezeigt wird. So können Sie die richtigen Informationen über die Anzeigedichte oder die Fenstermesswerte Ihres Sie sollten immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext) verwendet, um Informationen zum aktuellen Fenster oder zur aktuellen Anzeige zu erhalten. Dies gilt auch für wirkt sich auf einige System-APIs aus, die Informationen aus dem Kontext verwenden (z. B. die Toasts – Übersicht).

Die Konfiguration des Aktivitätsfensters und die übergeordnete Anzeige definieren Ressourcen und Kontext. So rufen Sie die aktuelle Anzeige ab:

val activityDisplay = activity.getDisplay()

Rufen Sie die aktuellen Messwerte zum Aktivitätsfenster ab:

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Rufen Sie die maximalen Fenstermesswerte für die aktuelle Systemkonfiguration ab:

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

Die maximalen Fenstermesswerte dienen zum Durchführen von Berechnungen, Layout-Entscheidungen die Größe der abzurufenden Ressourcen im Voraus bestimmen. Wenn wir diese Informationen in onCreate() können Sie diese Entscheidungen bereits vor dem ersten Layout treffen, übergeben. Diese Messwerte sollten nicht verwendet werden, um bestimmte Ansichtselemente festzulegen. verwenden Sie stattdessen Informationen aus dem Configuration-Objekt.

Display-Aussparungen

Faltbare Geräte haben möglicherweise eine andere Aussparungsgeometrie, wenn sie auf- und zugeklappt sind. Informationen zur Vermeidung von Problemen mit Aussparungen finden Sie unter Display-Aussparungen unterstützen.

Sekundäre Displays

Sie können die verfügbaren Bildschirme über den Systemdienst von DisplayManager abrufen:

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

Verwenden Sie die Klasse Display, um Informationen zu einer bestimmten Anzeige abzurufen, z. B. als Anzeigegröße oder Flags, die angeben, ob eine Anzeige sicher ist. Gehen Sie jedoch nicht davon aus, dass die Anzeigegröße Displaybereich, der Ihrer App zugewiesen ist. Denken Sie daran, dass im Mehrfenstermodus Ihre App einen Teil des Bildschirms einnimmt.

Bestimmen Sie, ob eine Aktivität auf einem Display gestartet werden kann:

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

Starten Sie dann die Aktivität auf dem Display:

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())

Multi-Display-Unterstützung

Android bietet Multi-Display-Unterstützung für Softwaretastaturen, Hintergründe und Launchern.

Softwaretastatur

Eine Tastatur kann auf einem zweiten Bildschirm angezeigt werden, wenn das Display so konfiguriert ist: System-Dekorationen unterstützt. Der Eingabemethoden-Editor wird automatisch angezeigt, Textfeld fordert eine Eingabe über die Anzeige an.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Abbildung 4: Tastatur auf einem zweiten Bildschirm.

Hintergründe

In Android 10 (API-Level 29) können sekundäre Bildschirme einen Hintergrund haben. Die wird für jedes Framework eine separate Instanz von WallpaperService.Engine erstellt. Display. Die Oberfläche jeder Suchmaschine muss unabhängig voneinander gezeichnet werden. Entwickler*innen können Assets mit dem Displaykontext in WallpaperService.Engine#getDisplayContext(). Achten Sie außerdem darauf, WallpaperInfo.xml-Dateisätze android:supportsMultipleDisplays="true".

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Abbildung 5: Hintergrund auf Smartphone und sekundärem Display.

Launcher

Die neue Intent-Filterkategorie SECONDARY_HOME bietet eine spezielle Aktivität für sekundäre Bildschirme. Instanzen der Aktivität werden auf allen Bildschirmen verwendet, unterstützen System-Dekorationen, eines pro Display.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

Die Aktivität muss einen Startmodus haben, der nicht verhindert, dass mehrere Instanzen auftreten die sich an verschiedene Bildschirmgrößen anpassen. Der Launch-Modus kann nicht singleInstance oder singleTask.

Die AOSP-Implementierung von Launcher3 unterstützt beispielsweise Folgendes: Aktivität „SECONDARY_HOME“.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Abbildung 6: Material Design-Launcher auf einem Smartphone
<ph type="x-smartling-placeholder">
</ph>
Abbildung 7: Material Design-Launcher auf einem zweiten Display

Fenstermesswerte

Mit Android 11 (API-Level 30) wurden die folgenden WindowManager-Methoden eingeführt um die Grenzen der Anwendungen bereitzustellen, die im Mehrfenstermodus ausgeführt werden:

Die Methoden der Jetpack WindowManager-Bibliothek computeCurrentWindowMetrics() und computeMaximumWindowMetrics() bieten ähnliche Funktionen abwärtskompatibel auf API-Level 14.

So rufen Sie Messwerte für andere Displays als die aktuelle Anzeige ab: (wie im Code-Snippet gezeigt):

  • Anzeigekontext erstellen
  • Fensterkontext für die Anzeige erstellen
  • WindowManager des Fensterkontexts abrufen
  • WindowMetrics der maximal für die App verfügbaren Anzeigefläche abrufen

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics

Verworfene Methoden

Display-Methoden getSize() und getMetrics() wurden eingestellt in API-Ebene 30 zugunsten der neuen WindowManager-Methoden.

Unter Android 12 (API-Level 31) werden die Display-Methoden getRealSize() und getRealMetrics() und aktualisiert ihr Verhalten, um sie besser an die Verhalten von getMaximumWindowMetrics().

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 in Ihrer App den Mehrfenstermodus unterstützen. Sie können in Ihrem Manifest, um sowohl Größe als auch Layout zu steuern. Eine Stammaktivität Attributeinstellungen gelten für alle Aktivitäten innerhalb des zugehörigen Aufgabenstapels. Beispiel: Wenn die Stammaktivität android:resizeableActivity="true" aufweist, dann gilt: bei Aktivitäten im Aufgaben-Stack kann die Größe angepasst werden. Auf einigen größeren Geräten wie Auf Chromebooks wird Ihre App möglicherweise in einem Fenster mit anpassbarer Größe ausgeführt, selbst wenn Sie android:resizeableActivity="false" Falls deine App dadurch nicht mehr funktioniert, kannst du Filtern bei Google Play, um die Verfügbarkeit Ihrer App auf solchen Geräten einzuschränken.

Unter Android 12 (API-Level 31) ist standardmäßig der Mehrfenstermodus aktiviert. Auf großen Bildschirmen (mittlere oder maximierte Fenstergrößenklasse), alle Apps werden im Mehrfenstermodus ausgeführt unabhängig von der App-Konfiguration. Auf kleinen Bildschirmen prüft das System minWidth, minHeight und resizeableActivity der Aktivität festlegen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann.

resizeableActivity

Legen Sie dieses Attribut im <activity> oder <application> Ihres Manifests fest. -Element zum Aktivieren oder Deaktivieren des Mehrfenstermodus für API-Level 30 und niedriger:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

Wenn dieses Attribut auf true gesetzt ist, kann die Aktivität im Splitscreen-Modus gestartet werden und Freiform-Modi. Wenn das Attribut auf false gesetzt ist, wird die Aktivität nicht unterstützen den Mehrfenstermodus. Wenn der Wert „false“ ist und der Nutzer versucht, starten Sie die Aktivität im Mehrfenstermodus, Bildschirm.

Wenn Ihre App auf API-Level 24 oder höher ausgerichtet ist, Sie aber keinen Wert für dieses Attribut enthält, wird der Wert des Attributs standardmäßig auf "true" gesetzt.

Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist, funktioniert dieses Attribut auf kleinen und großen Bildschirmen:

  • Große Bildschirme (mittlere oder maximierte Fenstergröße): alle Apps unterstützen den Mehrfenstermodus. Das Attribut gibt an, ob eine Aktivität kann die Größe angepasst werden. Wenn resizeableActivity="false", wird die App in Kompatibilitätsmodus, wenn dies zur Einhaltung der Displayabmessungen erforderlich ist.
  • Kleine Bildschirme (kompakte Fenstergrößenklasse): Wenn resizeableActivity="true" und Mindestbreite und Mindesthöhe bei Aktivität die Anforderungen für den Mehrfenstermodus erfüllen, unterstützt die Aktivität den Mehrfenstermodus . Wenn resizeableActivity="false", wird die Aktivität nicht unterstützt Mehrfenstermodus unabhängig von der Mindestbreite und -höhe der Aktivität.

supportsPictureInPicture

Legen Sie dieses Attribut im Knoten <activity> Ihres Manifests fest, um anzugeben, ob unterstützt die Aktivität den Bild-im-Bild-Modus.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

configChanges

Um die Konfigurationsänderungen im Mehrfenstermodus selbst zu verarbeiten, z. B. wenn ein Nutzer die Größe eines Fensters ändern, fügen Sie Ihrer App das Attribut android:configChanges hinzu Knoten des Manifests <activity> mit mindestens den folgenden Werten:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

Nach dem Hinzufügen von android:configChanges erhalten deine Aktivität und deine Fragmente eine an onConfigurationChanged() zurück, anstatt gelöscht zu werden und neu erstellt. Anschließend können Sie Ihre Ansichten manuell aktualisieren, Ressourcen neu laden bei Bedarf weitere Vorgänge ausführen.

<layout>

Unter Android 7.0 (API-Level 24) und höher wird das Manifestelement <layout> unterstützt mehrere Attribute, die sich auf das Verhalten einer Aktivität im Mehrfenstermodus auswirken Modus:

  • android:defaultHeight, android:defaultWidth: Standardhöhe und -breite von die Aktivität, wenn sie im Freiformmodus gestartet wird.

  • android:gravity: anfängliche Platzierung der Aktivität beim Start in Modus „Freies Format“. Geeignete Werte finden Sie in der Klasse Gravity.

  • android:minHeight, android:minWidth: Mindesthöhe und Mindestbreite sowohl im Splitscreen- als auch im Freiformmodus. Wenn der Nutzer umzieht die Trennlinie im geteilten Bildschirmmodus, um eine Aktivität kleiner als die angegebenen Minimum reduziert, schneidet das System die Aktivität auf die Größe -Anfragen.

Der folgende Code zeigt, wie Sie die Standardgröße und den Standardort einer Aktivität angeben und die Mindestgröße, wenn die Aktivität im Freiformmodus 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 während der Laufzeit

Ab Android 7.0 bietet das System Funktionen zur Unterstützung von Apps, die kann im Mehrfenstermodus ausgeführt werden.

Deaktivierte Funktionen im Mehrfenstermodus

Im Mehrfenstermodus werden nicht anwendbare Funktionen von Android möglicherweise deaktiviert oder ignoriert zu einer Aktivität, bei der der Gerätebildschirm mit anderen Aktivitäten oder Apps geteilt wird.

Außerdem sind einige Anpassungsoptionen für die System-UI deaktiviert. Beispiel: Apps können die Statusleiste 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 Callbacks im Mehrfenstermodus

Die Klasse Activity bietet die folgenden Methoden zur Unterstützung des Mehrfenstermodus Modus:

  • isInMultiWindowMode(): Gibt an, ob die Aktivität in Mehrfenstermodus.

  • isInPictureInPictureMode(): Gibt an, ob die Aktivität in Bild-im-Bild-Modus.

  • onMultiWindowModeChanged(): Das System ruft diese Methode immer dann auf, wenn die wird der Mehrfenstermodus aktiviert oder deaktiviert. Das System übergibt die 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 immer auf wird der Bild-im-Bild-Modus aktiviert oder deaktiviert. Das System hat die Prüfung bestanden Die Methode mit dem Wert „true“, wenn die Aktivität in den Bild-im-Bild-Modus wechselt. Modus oder „false“, wenn die Aktivität den Bild-im-Bild-Modus verlässt.

Die Klasse Fragment stellt Versionen vieler dieser Methoden bereit. zum Beispiel Fragment.onMultiWindowModeChanged().

Bild-im-Bild-Modus

Um den Bild-im-Bild-Modus für eine Aktivität zu aktivieren, rufe enterPictureInPictureMode() Diese Methode hat keine Auswirkungen, wenn das Gerät unterstützt den Bild-im-Bild-Modus nicht. Weitere Informationen finden Sie unter Videos hinzufügen mit Bild im Bild (BiB)

Neue Aktivitäten im Mehrfenstermodus

Wenn Sie eine neue Aktivität starten, können Sie angeben, dass die wenn möglich neben der aktuellen angezeigt. Intent-Flag verwenden FLAG_ACTIVITY_LAUNCH_ADJACENT. Dadurch wird das System angewiesen, zu versuchen, neue Aktivität in einem angrenzenden Fenster öffnen, sodass beide Aktivitäten den Bildschirm gemeinsam nutzen. Die versucht, dies zu erreichen, aber es ist nicht garantiert, dass dies geschieht.

Wenn sich ein Gerät im Freiformmodus befindet und Sie eine neue Aktivität starten, können Sie geben Sie die Dimensionen und die Bildschirmposition an, indem Sie ActivityOptions.setLaunchBounds(). Die Methode hat keine Auswirkungen, wenn das Gerät sich nicht im Mehrfenstermodus befindet.

Wenn Sie auf API-Ebene 30 und niedriger eine Aktivität innerhalb eines Aufgaben-Stacks starten, Aktivität ersetzt die Aktivität auf dem Bildschirm und übernimmt den gesamten Mehrfenstermodus Eigenschaften. Wenn Sie die neue Aktivität in einem separaten Fenster Mehrfenstermodus müssen Sie ihn in einem neuen Aufgabenstapel starten.

Mit Android 12 (API-Level 31) können Apps das Aufgabenfenster einer App aufteilen Aktivitäten zuordnen. Sie legen fest, wie Ihre App ihre Aktivitäten – im Vollbildmodus, nebeneinander oder übereinander –, indem Sie eine XML-Datei 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 teilen den Bildschirm. (Vor Android 7.0 konnten Nutzer und Daten in einer einzigen Aktivität löschen.) Um schnell Unterstützung für das Akzeptieren von verworfene Inhalte finden Sie in der DropHelper API. Für umfassende Drag-and-drop- finden Sie unter Drag-and-drop aktivieren.

Mehrere Instanzen

Jede Stammaktivität hat ihre eigene Aufgabe, die in einem separaten Prozess ausgeführt wird und in einem eigenen Fenster angezeigt. So starten Sie eine neue Instanz Ihrer App in einem separaten können Sie mit dem Flag FLAG_ACTIVITY_NEW_TASK neue Aktivitäten starten. Ich können Sie dies mit einigen der Mehrfensterattribute kombinieren, um eine bestimmte Position für das neue Fenster festlegen. Eine Shopping-App kann beispielsweise mehrere Fenster, um Produkte zu vergleichen.

Mit Android 12 (API-Level 31) kannst du zwei Instanzen einer Aktivität starten im selben Aufgabenfenster nebeneinander angezeigt.

Wenn Sie Nutzern erlauben möchten, eine andere Instanz Ihrer Anwendung aus App Launchers oder der Taskleiste darauf, dass Ihre Launcher-Aktivitäten legt android:resizeableActivity="true" fest und verwendet keinen Startmodus, der verhindert mehrere Instanzen. Beispielsweise kann eine singleInstancePerTask-Aktivität mehrfach in verschiedenen Aufgaben instanziiert werden, FLAG_ACTIVITY_MULTIPLE_TASK oder FLAG_ACTIVITY_NEW_DOCUMENT ist festgelegt.

Verwechseln Sie nicht mehrere Instanzen mit einem Layout mit mehreren Steuerfeldern, wie z. B. list-detail Präsentation mit SlidingPaneLayout, die in einem einzelnen .

Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden Gerät wird möglicherweise eine oder mehrere Instanzen in den Hintergrund verschoben, wenn der Sicherheitsstatus Änderungen. Beispiel: Ein aufgeklapptes Gerät mit zwei App-Instanzen in zwei Fenstern auf beiden Seiten des Faltens. Ist das Gerät zugeklappt, der Instanzen können beendet werden, anstatt zu versuchen, auf einem kleineren Bildschirm.

Bestätigung im Mehrfenstermodus

Unabhängig davon, ob Ihre App auf API-Level 24 oder höher ausgerichtet ist, sollten Sie prüfen, verhält sich im Mehrfenstermodus, wenn ein Nutzer versucht, die App im Mehrfenstermodus zu starten. auf einem Gerät mit Android 7.0 oder höher aktivieren.

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, wird das System zwangsweise die Größe der App ändert, es sei denn, sie deklariert eine feste Ausrichtung.

Wenn für Ihre App keine feste Ausrichtung deklariert ist, starten Sie sie auf ein Gerät mit Android 7.0 oder höher verwenden und versuchen, die App Splitscreen-Modus. Stellen Sie sicher, dass die App akzeptabel ist, wenn sie deren Größe erzwungen wird.

Wenn die App eine feste Ausrichtung deklariert, sollten Sie versuchen, die App mit dem Mehrfenstermodus. Die App muss dabei im Vollbildmodus angezeigt werden. .

API-Ebenen 24 bis 30

Wenn Ihre App auf API-Level 24 bis 30 ausgerichtet ist und der Mehrfenstermodus nicht deaktiviert ist -Support, überprüfen Sie das folgende Verhalten sowohl beim Splitscreen-Modus als auch beim freien Format Modi:

  • Starten Sie die App im Vollbildmodus und wechseln Sie dann in den Mehrfenstermodus, indem Sie die Schaltfläche Letzte gedrückt halten. Prüfen Sie, ob der Wechsel der App ordnungsgemäß funktioniert.

  • App direkt im Mehrfenstermodus starten und prüfen, ob die App ordnungsgemäß startet. Du kannst eine App im Mehrfenstermodus starten, indem du die Schaltfläche Letzte gedrückt, drücken dann lange auf die Titelleiste der App und in einen der markierten Bereiche auf dem Bildschirm ziehen.

  • Passen Sie die Größe Ihrer App im Splitscreen-Modus an, indem Sie den Bildschirmteiler ziehen. Bestätigen dass die Größe der App ohne Absturz angepasst wird und dass die erforderlichen UI-Elemente sichtbar sind.

  • Wenn Sie Mindestabmessungen für Ihre App angegeben haben, versuchen Sie, die Größe der App so weit, dass das Fenster kleiner ist als diese Abmessungen. Prüfen Sie, ob Sie können die Größe der App nicht kleiner als das angegebene Minimum ändern Dimensionen.

  • Prüfen Sie bei allen Tests, ob die Leistung Ihrer App akzeptabel ist. Für Achten Sie beispielsweise darauf, dass die Aktualisierung der UI nach dem App-Größe angepasst wird.

API-Level 31 oder höher

Wenn Ihre App auf API-Level 31 oder höher und die Mindestbreite der Hauptaktivität ausgerichtet ist und die minimale Höhe kleiner oder gleich den jeweiligen Abmessungen der verfügbaren Anzeigebereichs, überprüfen Sie alle für API-Ebenen 24 aufgeführten Verhaltensweisen bis 30.

Checkliste testen

So können Sie die Leistung Ihrer App im Mehrfenstermodus prüfen Geschäftsabläufe. Sie sollten diese Vorgänge sowohl im Splitscreen- als auch im freien Format 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 verhält während es sichtbar, aber nicht aktiv ist. Wenn Ihre App zum Beispiel das Video wiedergegeben wird, vergewissern Sie sich, dass die Wiedergabe auch dann fortgesetzt wird, wenn der Nutzer mit einer anderen App interagieren.

  • Verschieben Sie im geteilten Bildschirmmodus den Bildschirmteiler, damit Ihre App größer und kleiner werden. Führen Sie diese Operationen sowohl nebeneinander als auch oben aus die anderen Konfigurationen. Vergewissern Sie sich, dass die App nicht abstürzt. ist sichtbar und die Größenanpassung dauert nicht zu lange.

  • Führen Sie schnell nacheinander mehrere Größenänderungsvorgänge durch. Prüfen, ob Ihre App nicht abstürzen oder Speicherlecks verursacht. Der Memory Profiler von Android Studio bietet Informationen zur Arbeitsspeichernutzung Ihrer App (siehe Arbeitsspeicher der App prüfen) Nutzung mit Memory Profiler.

  • Ihre App in verschiedenen Fensterkonfigurationen normal verwenden und um zu prüfen, ob die App ordnungsgemäß funktioniert. Stellen Sie sicher, dass der Text lesbar ist und UI-Elemente sind nicht zu klein, um mit ihnen zu interagieren.

Unterstützung für Mehrfenstermodus deaktiviert

Auf API-Ebenen 24 bis 30, wenn Sie die Unterstützung des Mehrfenstermodus durch folgende Einstellung deaktiviert haben: android:resizeableActivity="false", du solltest deine App auf einem Gerät starten Android 7.0 bis 11 ausführen und versuchen, die App im Splitscreen-Modus Freiform-Modi. Achten Sie darauf, dass die App dabei im Vollbildmodus bleibt. .

Weitere Informationen

Weitere Informationen zur Unterstützung des Mehrfenstermodus unter Android finden Sie hier:

Empfehlungen für dich * Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist. * Gerätekompatibilitätsmodus * Unterstützung großer Bildschirmgrößen * Umgang mit Konfigurationsänderungen