Der Freeform-Fenstermodus von Android Nougat: Was er ist und wie Entwickler ihn nutzen können

Der Freiform-Mehrfenstermodus ist eine zu wenig genutzte und unterschätzte Funktion in Android Nougat. Wir erklären, was es ist und wie Entwickler es integrieren können.

Freiformfenstermodus, wie erstmals demonstriert von Ars Technica

Als Android 7.0 Nougat Anfang 2016 zum ersten Mal angekündigt wurde, brachte es eine viel nachgefragte Funktion auf die Android-Plattform – die Unterstützung mehrerer Fenster. Die meisten Menschen sind sich der Split-Screen-Multi-Window-Unterstützung bewusst, die standardmäßig auf allen Android-Nougat-Telefonen und -Tablets aktiviert ist. Android TV-Geräte mit Android Nougat unterstützen Bild-in-Bild-Multifenster.

Allerdings gibt es in Android Nougat einen dritten Multi-Window-Modus, der nicht vielen Menschen bekannt ist: Freiformfenstermodus. Dieser Modus ermöglicht es Android, Apps als schwebende Fenster darzustellen, die vom Benutzer nach Belieben verschoben und in der Größe geändert werden können. Es handelt sich im Wesentlichen um die Android-Implementierung von a Stapelfenstermanager.

Im Android SDK-Dokumentation, es sagt, dass:

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 Split-Screen-Modus auch den Freiformmodus.

Und auch in der Android 7.0 CDD:

Geräteimplementierungen mit der Bildschirmgröße XL SOLLTEN den Freiformmodus unterstützen.

Dies weist darauf hin, dass der Hersteller auf jedem neuen Android-Gerät mit großem Bildschirm, das mit Android 7.0 ausgeliefert wird, möglicherweise den Freiform-Fenstermodus aktiviert hat.

Dies ist jedoch absolut keine zwingende Anforderung. Es ist möglich zu erzwingen beliebig Android Nougat-Gerät (mit aktivierten Entwickleroptionen) zur Unterstützung des Freiform-Fenstermodus mit einer von zwei verschiedenen Methoden:


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

Wenn Sie die Option „Größenänderung von Aktivitäten erzwingen“ 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 an, auf dem ADB installiert ist, 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 unten in den Entwickleroptionen die Option „Größenänderung von Aktivitäten erzwingen“.

Beide Methoden erfordern einen Neustart der System-Benutzeroberfläche, bevor sie wirksam werden können. Der einfachste Weg, dies zu tun, besteht darin, Ihr Gerät neu zu starten (oder, wenn Ihr Gerät gerootet ist, können Sie es einfach beenden com.android.systemui Verfahren)


OK, der Freiformmodus ist also aktiviert... was nun?

Wenn Sie den Freiformmodus mit Methode 1 aktiviert haben, gibt es bei App-Einträgen im Übersichtsmenü eine neue Schaltfläche, mit der Sie eine App im Freiformfenstermodus starten können.

Mit Methode 2 ist es jedoch nicht möglich, eine App über Android selbst im Freiformmodus zu starten. Glücklicherweise, Es ist jedem Drittanbieter-Launcher möglich, eine App im Freiform-Fenstermodus zu starten Verwendung von Standard-Android-APIs, die im Rahmen der API-Ebene 24 finalisiert wurden.

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

Anschließend können Sie die App mit starten startActivity(Intent, Bundle). Falls Sie noch keins haben ActivityOptions Bundle, mit dem Sie eines erstellen können ActivityOptions.makeBasic() und dann anrufen setLaunchBounds() auf dem frisch erstellten Bundle.

Beachten Sie Folgendes: Wenn im Übersichtsbildschirm bereits eine Aufgabe für die App vorhanden ist, dann Android leitet Sie einfach zu der vorhandenen (Vollbild-)Aufgabe weiter, die zuvor von gestartet wurde Benutzer. Sie müssen alle Aufgaben für die App in der Übersicht löschen, bevor Sie versuchen, die App in einem Freiformfenster zu starten. (Für Apps mit Aktivitäten, die in starten standard oder singleTop Modi können Sie das Öffnen eines neuen Fensters erzwingen, indem Sie das hinzufügen Intent.FLAG_ACTIVITY_MULTIPLE_TASK Markieren Sie die Absicht vor dem Aufruf startActivity().)


Wie funktioniert der Freiformmodus unter der Haube?

Es gibt ein ausgezeichneter Artikel geschrieben, in dem erklärt wird, wie der Mehrfenstermodus, einschließlich des Freiformmodus, in Android Nougat implementiert wird. (HINWEIS: Der Artikel ist auf Chinesisch verfasst. Führen Sie ihn daher unbedingt über Google Translate aus.)

Kurz gesagt: Apps im Freiformmodus werden in einem vom Rest des Systems getrennten Stapel ausgeführt (denken Sie an einen virtuellen Desktop). Daher ist es nicht möglich, dass Freiform-Apps über dem Launcher oder über einer anderen Vollbild-App ausgeführt werden.

Apps, die im Freiformmodus ausgeführt werden (die nicht über diesen Modus verfügen). android: windowIsFloating auf true gesetzt) ​​haben a DecorCaptionView als untergeordnetes Element der obersten Ebene hinzugefügt DecorView. Diese Ansicht enthält a LinearLayout Definieren der Titelleiste des Fensters zum Verschieben, Maximieren und Schließen des Fensters. Obwohl ich es persönlich nicht empfehle, ist es möglich, auf diese Ansicht zuzugreifen und sie anzupassen, indem man das herunterlädt DecorView verwenden Window.getDecorView(), wirf es auf a ViewGroup und dann auf die untergeordneten Ansichten zugreifen.

Jede App, die so konzipiert ist, dass sie sich im standardmäßigen Multi-Window-Modus mit geteiltem Bildschirm von Android gut verhält, funktioniert im Freiformmodus. isInMultiWindowMode() gibt für Apps, die im Freiformmodus ausgeführt werden, „true“ zurück. 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(): Diese Methode kann verwendet werden, um die Schattierung der Beschriftungssteuerelemente (die Schaltflächen „Maximieren“ und „Schließen“) für Apps im Freiformmodus zu überschreiben.
  • Window.setRestrictedCaptionAreaListener(): Dies kann verwendet werden, um zu erkennen, wenn 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 bewegt) und stellt eine bereit Rect mit den neuen Grenzen der Beschriftungssteuerelemente.
  • 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. Sie können beispielsweise Folgendes in der Liste auflisten Tag Ihres Manifests:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Wenn sich das Gerät dann bereits im Freiformmodus befindet und die App gestartet wird, wird sie mit diesen angegebenen Grenzen gestartet.

Beispiele für den Freiformfenstermodus 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 Taskleiste das ein Windows-ähnliches Startmenü und eine Liste der zuletzt verwendeten Apps in einer Systemüberlagerung bereitstellt. Es ermöglicht Benutzern von Nougat, Apps im Freiform-Fenstermodus zu starten – und da die Taskleiste ein Overlay 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.

Du kannst Laden Sie die Taskleiste herunter bei Google Play, oder Sehen Sie sich den Quellcode an selbst auf GitHub. Zusätzlich zu den in diesem Artikel erwähnten Konzepten wende ich auch einige Tricks an, um die Freiformmodus-Umgebung aktiv zu halten, auch wenn keine Freiformfenster auf dem Bildschirm angezeigt werden. Benutzer können die Taskleiste optional auch als Standard-Startprogramm festlegen, damit ihr Gerät automatisch in der Freiformmodus-Umgebung startet.

Da es (zum Zeitpunkt dieses Schreibens) keine Geräte gibt, die offiziell mit vom OEM aktivierter Freeform-Fensterunterstützung ausgeliefert werden, empfehle ich Verwenden der Taskleiste als Tool für Entwickler zum Testen ihrer Apps in der Freiform-Fensterumgebung auf Geräten, die dies sonst nicht unterstützen Es.

Zusätzlich zur Taskleiste habe ich auch den Launcher3-Quellcode von AOSP geändert, um das Starten von Apps im Freiformmodus zu ermöglichen. Dies ist ein reiner Klon des Standard-Launchers für Android 7.1.1 mit den minimalen Änderungen, die erforderlich sind, um Freiform-Apps starten zu können. Ich habe diesen modifizierten Launcher in der Hoffnung bereitgestellt, dass andere Entwickler die Unterstützung für das Starten von Freiformfenstern in ihren benutzerdefinierten Launchern implementieren. Du kannst Sehen Sie sich den Quellcode an auf GitHub, oder Laden Sie eine Beispiel-APK herunter.

Ich hoffe, dass Entwickler benutzerdefinierter Launcher diesen Code nutzen und die Unterstützung für den Start von Freeform aktivieren können Fenster-Apps für Benutzer, die eine größere Flexibilität bei der Fensterverwaltung auf ihren Großbildschirmen wünschen Geräte.