Freiform-Fenstermodus von Android Nougat: Was es ist und wie Entwickler es nutzen können

Freiform-Fenstermodus, wie erstmals von Ars Technica demonstriert

Als Android 7.0 Nougat zum ersten Mal Anfang 2016 angekündigt wurde, brachte es eine häufig nachgefragte Funktion auf die Android-Plattform - die Unterstützung mehrerer Fenster. Den meisten Menschen ist die Unterstützung für mehrere Fenster mit geteiltem Bildschirm bekannt, die standardmäßig auf allen Android Nougat-Telefonen und -Tablets aktiviert ist. Android-TV-Geräte mit Android Nougat unterstützen die Bild-in-Bild-Unterstützung für mehrere Fenster.

In Android Nougat gibt es jedoch einen dritten Mehrfenstermodus, den nur wenige kennen: den Freiform-Fenstermodus . In diesem Modus kann Android Apps als schwebende Fenster darstellen, die vom Benutzer nach Belieben verschoben und in der Größe geändert werden können. Es handelt sich im Wesentlichen um die Implementierung eines Stacking Window Managers für Android.

In der Android SDK-Dokumentation heißt es:

Hersteller größerer Geräte können den Freiformmodus aktivieren, in dem der Benutzer die Größe jeder Aktivität frei ändern kann. Wenn der Hersteller diese Funktion aktiviert, bietet das Gerät zusätzlich zum geteilten Bildschirm den Freiformmodus an.

Und auf der Android 7.0-CDD:

Geräteimplementierungen mit der Bildschirmgröße xlarge MÜSSEN den Freiformmodus unterstützen.

Dies weist darauf hin, dass für jedes neue Android-Großbildgerät, das mit Android 7.0 ausgeliefert wird, möglicherweise der Hersteller den Freiform-Fenstermodus aktiviert hat.

Dies ist jedoch absolut keine harte Anforderung. Es ist möglich, jedes Android-Nougat-Gerät (mit aktivierten Entwickleroptionen) zu zwingen, den Freiform-Fenstermodus auf zwei verschiedene Arten zu unterstützen:


Aktivieren des Freiform-Fenstermodus auf jedem Android Nougat-Gerät

Wenn Sie die Option "Aktivitäten zwingen, ihre Größe zu ändern" aktivieren, können Apps auf jedem Gerät im Freiformmodus ausgeführt werden

Methode 1 (ein Computer mit ADB ist erforderlich)

Stellen Sie sicher, dass das USB-Debugging in den Entwickleroptionen aktiviert ist. Schließen Sie dann Ihr Gerät an einen Computer mit installiertem ADB an und führen Sie den folgenden Befehl aus:

 adb shell settings put global enable_freeform_support 1 

Methode 2 (keine zusätzlichen Anforderungen)

Aktivieren Sie die Option zum Erzwingen der Größenänderung von Aktivitäten unten in den Entwickleroptionen.

Für beide Methoden muss die System-Benutzeroberfläche neu gestartet werden, bevor sie wirksam werden kann. Der einfachste Weg, dies zu tun, ist ein Neustart Ihres Geräts (oder, wenn Ihr Gerät com.android.systemui ist, können Sie einfach den com.android.systemui Prozess com.android.systemui ).


OK, der Freiform-Modus ist also aktiviert. Was nun?

Wenn Sie den Freiform-Modus mit Methode 1 aktiviert haben, wird in den App-Einträgen im Menü Übersicht eine neue Schaltfläche angezeigt, mit der Sie eine App im Freiform-Fenstermodus starten können.

Bei Methode 2 ist es jedoch nicht möglich, eine App über Android selbst in den Freiformmodus zu versetzen. Glücklicherweise ist es jedem Launcher eines Drittanbieters möglich, eine App im Freiform-Fenstermodus mit Standard-Android-APIs zu starten, die als Teil von API Level 24 finalisiert wurden.

Der Schlüssel zum Starten einer App im Freiformmodus ist der Aufruf der ActivityOptions.setLaunchBounds() -Methode. Diese Methode verwendet ein Rect als Argument, das die Fenstergrenzen enthält, mit denen die App gestartet wird.

Anschließend können Sie die App mit startActivity(Intent, Bundle) starten. Wenn Sie noch kein ActivityOptions Bundle haben, können Sie eines mit ActivityOptions.makeBasic() erstellen und dann setLaunchBounds() für das neu erstellte Bundle aufrufen.

Wenn im Übersichtsbildschirm bereits eine Aufgabe für die App vorhanden ist, leitet Android Sie standardmäßig einfach zu der vorhandenen (Vollbild-) Aufgabe weiter, die zuvor vom Benutzer gestartet wurde. Sie müssen alle Aufgaben für die App in der Übersicht löschen, bevor Sie versuchen, die App in einem Freiform-Fenster zu starten. (Für Apps mit Aktivitäten, die im standard oder singleTop Modus singleTop werden, können Sie das Intent.FLAG_ACTIVITY_MULTIPLE_TASK eines neuen Fensters erzwingen, indem Sie dem Intent.FLAG_ACTIVITY_MULTIPLE_TASK Flag Intent.FLAG_ACTIVITY_MULTIPLE_TASK hinzufügen, bevor Sie startActivity() aufrufen.)


Wie funktioniert der Freiformmodus unter der Haube?

In einem ausgezeichneten Artikel wird erklärt, wie der Mehrfenstermodus, einschließlich des Freiformmodus, in Android Nougat implementiert ist. (HINWEIS: Der Artikel ist in Chinesisch verfasst. Führen Sie ihn daher unbedingt über Google Translate aus.)

Kurz gesagt, Apps im Freiformmodus werden in einem separaten Stapel vom Rest des Systems ausgeführt (denken Sie an den virtuellen Desktop). Aus diesem Grund können Freiform-Apps nicht über dem Launcher oder über einer anderen Vollbild-App ausgeführt werden.

Bei Apps, die im Freiformmodus ausgeführt werden (für die android:windowIsFloating auf true festgelegt ist), wird DecorCaptionView als DecorCaptionView von DecorView oberster Ebene DecorView . Diese Ansicht enthält ein LinearLayout, das die Beschriftungsleiste des Fensters zum Verschieben, Maximieren und Schließen des Fensters definiert. Obwohl ich es nicht persönlich empfehle, ist es möglich, auf diese Ansicht zuzugreifen und sie anzupassen, indem Sie die DecorView mit Window.getDecorView(), in eine ViewGroup und dann auf die ViewGroup Ansichten zugreifen.

Jede App, die sich im standardmäßigen Mehrfenstermodus mit geteiltem Bildschirm von Android gut verhält, funktioniert im Freiformmodus. isInMultiWindowMode() gibt true für Apps zurück, die im Freiformmodus ausgeführt werden. Es gibt einige andere öffentlich verfügbare Klassen und Methoden, die eine App verwenden kann und die sich speziell auf den Freiformmodus beziehen:

  • Window.setDecorCaptionShade() : Mit dieser Methode können Sie den Schatten der Beschriftungssteuerelemente (die Schaltfläche zum Maximieren und Schließen) für Apps im Freiformmodus überschreiben.
  • Window.setRestrictedCaptionAreaListener() : Window.setRestrictedCaptionAreaListener() kann festgestellt werden, wann ein Fenster im Freiformmodus verschoben wird. Der Window.OnRectrictedCaptionAreaChangedListener wird jedes Mal aufgerufen, wenn sich die Position der Beschriftungssteuerelemente ändert (wenn ein Benutzer das Fenster verschiebt), und stellt einem Rect die neuen Grenzen der Beschriftungssteuerelemente zur Verfügung.
  • ActivityInfo.WindowLayout : Diese Klasse enthält im Manifest der App deklarierte Informationen zur anfänglichen Positionierung eines Freiformfensters, das eine App beim Start anfordern kann. Beispielsweise können Sie in der Liste Folgendes auflisten Tag Ihres Manifests:

    Wenn sich das Gerät bereits im Freiformmodus befindet und die App gestartet wird, wird sie mit diesen festgelegten Grenzen gestartet.


Beispiele für den Freiform-Fenstermodus in Aktion

Die Taskleiste fügt ein Startmenü und eine Taskleiste für aktuelle Apps hinzu, um den Freiform-Fenstermodus zu ergänzen

Im Sommer 2016, als Android Nougat noch eine Entwicklervorschau war, veröffentlichte ich eine App namens Taskbar, die ein Windows-ähnliches Startmenü und eine Liste aktueller Apps in einem System-Overlay enthält. Benutzer von Nougat können damit Apps im Freiform-Fenstermodus starten. Da die Taskleiste eine Überlagerung verwendet, kann sie in der Freiform-Fensterumgebung auf dem Bildschirm bleiben. Die Kombination aus Taskleiste und Freiformmodus verleiht jedem Android-Gerät, insbesondere Tablets, ein PC-ähnliches Gefühl.

Sie können die Taskleiste bei Google Play herunterladen oder den Quellcode selbst auf GitHub anzeigen. Zusätzlich zu den in diesem Artikel erwähnten Konzepten verwende ich auch einige Tricks, um die Umgebung im Freiformmodus aktiv zu halten, auch wenn keine Freiformfenster auf dem Bildschirm angezeigt werden. Benutzer können die Taskleiste optional als Standardstartprogramm festlegen, damit ihr Gerät automatisch in der Freiformmodus-Umgebung gestartet werden kann.

Da es keine Geräte gibt, die offiziell mit vom OEM aktivierter Freiform-Fensterunterstützung ausgeliefert werden (wie in diesem Artikel beschrieben), empfehle ich, die Taskleiste als Tool zu verwenden, damit Entwickler ihre Apps in der Freiform-Fensterumgebung auf Geräten testen können, die diese ansonsten nicht unterstützen .

Zusätzlich zur Taskleiste habe ich auch den Launcher3-Quellcode von AOSP geändert, damit Apps im Freiformmodus gestartet werden können. Dies ist ein direkter Klon des Standard-Launchers für Android 7.1.1 mit den minimalen Änderungen, die erforderlich sind, damit Freeform-Apps gestartet werden können. Ich habe diesen modifizierten Launcher bereitgestellt, in der Hoffnung, dass andere Entwickler die Unterstützung für das Starten von Freiformfenstern in ihren benutzerdefinierten Launchern implementieren. Sie können den Quellcode auf GitHub anzeigen oder ein Beispiel-APK herunterladen.

Ich hoffe, dass Entwickler von benutzerdefinierten Startprogrammen diesen Code verwenden und die Unterstützung für das Starten von Freiform-Fenster-Apps für Benutzer aktivieren können, die eine größere Flexibilität für die Fensterverwaltung auf ihren Geräten mit großem Bildschirm wünschen.