Multi-Window in Android N: Was Entwickler wissen müssen, um das Beste daraus zu machen

Wir geben einen Überblick darüber, was die bevorstehende Multi-Window-Unterstützung in Android N für Entwickler bedeutet und wie man das Beste daraus macht!

Die Unterstützung mehrerer Fenster ist eine nette Funktion, auf die wir in Android N warten Wir wollten schon lange, dass es auf allen Geräten verfügbar ist. Damit es jedoch zu einem angenehmen Erlebnis wird, müssen Entwickler möglicherweise einige Änderungen an ihren Apps vornehmen, um es korrekt zu unterstützen.

In einer der Google I/O-Sitzungen konnten sich Entwickler über die neuen APIs und Systemverhaltensänderungen informieren, die die Multi-Window-Unterstützung mit sich bringt.

Die Sitzung wurde von Wale Ogunwale, dem technischen Lead Manager für den Android ActivityManager, moderiert Komponenten des WindowManager-Frameworks – er und sein Team sind für Multi-Window auf Android verantwortlich.

Sie können sich das ansehen Sitzung im Multi-Window-Modus auf YouTube, aber wir geben hier auch einen Überblick über die Sitzung.

N führt drei verschiedene Multi-Window-Modi ein:
  • Split-Screen-Modus: Dies ist der Modus, der standardmäßig verfügbar ist. Wie der Name schon sagt, ermöglicht es Ihnen, zwei Anwendungen nebeneinander zu öffnen.
  • Freiformmodus: Hersteller können dies auf größeren Geräten aktivieren, sodass Benutzer zusätzlich zum Split-Screen-Modus die Größe von Aktivitäten frei ändern können.
  • Bild-in-Bild-Modus: Dieser Modus richtet sich an Android-TV-Geräte und ist dafür gedacht, dass Videoplayer in einem angehefteten Fenster ausgeführt werden, während der Benutzer mit anderen Anwendungen interagiert.
Android N Split-Screen-ModusAndroid N PiP-Modus
Das ist erwähnenswert. Wir haben uns bereits mit Multi-Window auf N befasst und einige Kritik am aktuellen System geübt. Vor diesem Hintergrund hoffen wir, dass der Freiformmodus etwas näher an den Bild-in-Bild-Modus heranrückt, da dieser auf allen Geräten nützliche Anwendungen bieten würde.
Das Aktivieren der Multi-Window-Unterstützung in Ihren Apps ist einfach: Sie müssen nichts tun, wenn Sie bereits auf N abzielen. Sollten Sie sich dafür entscheiden, Multi-Window zu deaktivieren, können Sie dies tun, indem Sie das festlegen. android: resizeableActivity Aktivitätsattribut in Ihrem Manifest zu. false. Dies sollte nur dann erfolgen, wenn dies wirklich gerechtfertigt ist, da Ihre App dadurch immer negativ hervorsticht Starten im Vollbildmodus, auch wenn der Benutzer (oder eine andere App) versucht, es im Mehrfenstermodus zu starten Modus. Es ist wichtig zu beachten, dass die Attribute einer Stammaktivität für alle Aktivitäten innerhalb ihres Aufgabenstapels gelten. Mit anderen Worten: Wenn Sie eine Aktivität haben, die von anderen Apps gestartet werden kann, stellen Sie sicher, dass sie den Mehrfenstermodus unterstützt da Sie nicht garantieren können, dass andere Apps Ihre Aktivität in einer neuen Aufgabe starten. Intent#FLAG_ACTIVITY_NEW_TASK .Die Unterstützung des Bild-in-Bild-Modus muss explizit über die deklariert werden. android: supportsPictureInPicture Attribut. Beachten Sie, dass dieses Attribut ignoriert wird, wenn. android: resizeableActivity Ist. false .Layout-Attribute können verwendet werden, um Standardabmessungen und -platzierung für Freiformfenster festzulegen oder um eine minimale Breite oder Höhe sowohl für den Freiform- als auch für den geteilten Bildschirmmodus anzugeben:
  • android: defaultWidth/android: defaultHeight: die Standardabmessungen der Aktivität (Freiformmodus).
  • android: gravity: die Anfangsposition der Aktivität (Freiformmodus).
  • android: minimalWidth/android: minimalHeight: die minimalen Abmessungen der Aktivität (Freiform- und Splitscreen-Modus)
Ein Codebeispiel finden Sie in. Beispiel-App für den Multi-Window Playground von Google auf GitHub: AndroidManifest.xml.
Mit der Einführung der Multi-Window-Unterstützung müssen Sie möglicherweise einige Dinge in Ihren Apps noch einmal überprüfen, um sicherzustellen, dass sie ordnungsgemäß funktionieren.

Den Aktivitätslebenszyklus verstehen

Der. Aktivitätslebenszyklus bleibt im Mehrfenstermodus unverändert: Grundlegender Lebenszyklus von Android-Aktivitäten Allerdings können einige subtile Unterschiede zwischen den Aktivitätszuständen zu unbeabsichtigtem Verhalten führen, das Sie normalerweise vor N nicht bemerken würden. Es ist wichtig, das zu wissen. Activity#onResume() Und. Activity#onPause() werden aufgerufen, wenn Ihre App den Fokus gewinnt oder verliert, aber nicht unbedingt, wenn sie beginnt oder nicht mehr sichtbar ist. (Denken Sie daran, dass jeweils nur eine App den Fokus haben kann.) Stellen Sie bei Apps, die den Inhalt ständig aktualisieren (z. B. Videowiedergabe), sicher, dass Sie das Starten und Stoppen von Inhaltsaktualisierungen verwalten. Activity#onStart() Und. Activity#onStop() stattdessen. Dies gilt beispielsweise nicht für Video-Apps. bedeutet, dass die Wiedergabe nur dann erfolgt, wenn die App fokussiert ist, was den Zweck des Mehrfenstermodus zunichte macht. Die offizielle YouTube-App hatte ein ähnliches Problem, als die Android N Developer Preview zum ersten Mal gestartet wurde.

Umgang mit Laufzeitänderungen

Wenn eine App in den Mehrfenstermodus versetzt wird, ändern sich einige Gerätekonfigurationen. Sie können entweder zulassen, dass Ihre Aktivität neu gestartet wird (in diesem Fall. Fragmente behalten Dies könnte eine gute Idee sein, wenn Ihre Aktivität beim Start einen intensiven Vorgang ausführen muss) oder entscheiden Sie sich dafür. Behandeln Sie die Konfigurationsänderungen explizit stattdessen. Vier Gerätekonfigurationen können sich beim Aufrufen oder im Mehrfenstermodus ändern: screenSize, smallestScreenSize, screenLayout Und. orientation. Siehe die. Dokumentation für Android-Entwickler Weitere Informationen zu den einzelnen Attributen finden Sie hier. Beachten Sie dies jedoch. orientation bezieht sich in diesem Fall nicht mehr auf die Ausrichtung des Geräts. Stattdessen wird lediglich angezeigt, ob die Breite Ihrer Aktivität größer ist als ihre Höhe (Querformat) oder nicht (Hochformat). Die Erklärung, dass Ihre Aktivität diese Änderungen verarbeiten wird, kann über das Manifest erfolgen:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Bedenken Sie, dass dies bedeutet, dass Sie diese Änderungen tatsächlich vornehmen müssen. Activity#onConfigurationChanged(), indem Sie Ansichten manuell aktualisieren oder einige Ressourcen neu laden.

Deaktivierte Funktionen im Mehrfenstermodus

Einige Systemfunktionen werden durch Ihre Aktivitäten im Mehrfenstermodus nicht beeinträchtigt:
  • Änderungen an der Statusleiste und der Navigationsleiste, z. B. das Dimmen/Ausblenden der Systemleisten oder die Verwendung des immersiven Modus, haben keine Auswirkungen. Dies ist sinnvoll, da Ihre Aktivität nur einen Teil des Bildschirms einnimmt.
  • Der android: screenOrientation Das Aktivitätsattribut hat auch im Mehrfenstermodus keine Auswirkung: Da die Größe Ihrer Aktivität geändert werden kann, ist es nicht mehr sinnvoll, eine feste Ausrichtung zu haben.
Für Multi-Window-Ereignisse wurden neue Rückrufe sowie Methoden zum Abfragen des aktuellen Status hinzugefügt.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): Wird aufgerufen, wenn sich der Aktivitätsstatus von Vollbild zu Mehrfenster und umgekehrt ändert.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): wird aufgerufen, wenn der Aktivitätsstatus in den/vom PIP-Modus wechselt.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): Gibt zurück, ob sich die Aktivität im Mehrfenster-/Bild-in-Bild-Modus befindet oder nicht.
  • Activity#overlayWithDecorCaption(boolean overlay): Bei Freiformfenstern kann diese Methode verwendet werden, um die Beschriftung (die Leiste, mit der das Fenster herumgezogen wird) über den Inhalt zu legen, anstatt ihn nach unten zu verschieben.
PS. Ausser für. Activity#overlayWithDecorCaption(), diese Methoden werden auch von der bereitgestellt. Fragment Klasse.

Starten von Aktivitäten im Mehrfenstermodus

  • Activity#enterPictureInPictureMode() kann verwendet werden, um eine Aktivität in den Bild-in-Bild-Modus zu versetzen. Beachten Sie, dass Aktivitäten im PiP-Modus nicht über Eingabeereignisse benachrichtigt werden – verwenden Sie MediaSession#setMediaButtonReceiver() wenn Sie solche Ereignisse bewältigen möchten. Schauen Sie bei Interesse auch unbedingt auf der Website der Android-Entwickler vorbei Bild-in-Bild auf Android N.
  • Wenn sich das Gerät im Split-Screen-Modus befindet, können Sie dem System mitteilen, dass es neben Ihrer Aktivität eine weitere Aktivität starten soll Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT Flagge. Das Flag hat keine Wirkung, wenn es sich nicht im Split-Screen-Modus befindet.
  • Wenn sich das Gerät im Freiformmodus befindet, ActivityOptions#setLaunchBounds() kann verwendet werden, um die Abmessungen und die Position der neuen Aktivität auf dem Bildschirm anzugeben.
Codebeispiele finden Sie in der Beispiel-App „Multi-Window Playground“: nebenstehendes Aktivitätsbeispiel, Beispiel für Startgrenzen.

Drag-and-Drop

Drag-and-Drop-Unterstützung gibt es zwar seit Honeycomb, zuvor war sie jedoch nur innerhalb derselben Aktivität möglich. Es schneit. Wird im Multi-Window-Modus unterstützt sowie. Die Umsetzung scheint möglich zu sein. größtenteils das Gleiche wie vorher, mit ein paar Ergänzungen für aktivitätsübergreifendes Drag-and-Drop:
  • View#startDragAndDrop()
    • Neuer Alias ​​für View#startDrag().
    • Um aktivitätsübergreifendes Drag-and-Drop zu ermöglichen, übergeben Sie das neue Flag View#DRAG_FLAG_GLOBAL.
    • Wenn Sie der Empfängeraktivität URI-Berechtigungen erteilen müssen, übergeben Sie die neuen Flags View#DRAG_FLAG_GLOBAL_URI_READ oder View#DRAG_FLAG_GLOBAL_URI_WRITE, wie angemessen.
  • View#updateDragShadow()
    • Ersetzt den Ziehschatten für einen aktuell ausgeführten Ziehvorgang. Kann nur von der App aufgerufen werden, die den Ziehvorgang gestartet hat.
  • View#cancelDragAndDrop()
    • Bricht einen aktuell ausgeführten Ziehvorgang ab. Kann nur von der App aufgerufen werden, die den Ziehvorgang gestartet hat.
  • Sie können überprüfen, ob ein Gerät den Freiform- oder Bild-in-Bild-Modus unterstützt PackageManager#hasSystemFeature(), verwenden PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT Und PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE jeweils.
  • Der android: windowBackground Das Attribut kann als zeichnbares Hintergrundelement verwendet werden, wenn die Größe der Aktivität geändert wird und ihre Darstellung hinterherhinkt. Wenn android: windowBackground ist nicht gesetzt, android: windowBackgroundFallback wird stattdessen verwendet. Ein Beispiel finden Sie in der Beispiel-App „Multi-Window Playground“..
Wale hat einige Best Practices angeboten, um sicherzustellen, dass Ihre Benutzer das bestmögliche Erlebnis haben:
  • Der Griffmodus ändert sich elegant:
    • Behalten Sie die Konsistenz der Benutzeroberfläche unabhängig von der Ausrichtung bei. Lassen Sie die Position der Elemente nicht wechseln, um reibungslose Übergänge zu ermöglichen.
    • Ergänzend zum oben Gesagten: Wechseln Sie nicht zwischen sehr unterschiedlichen Layouts für Telefon-/Tablet-Layouts. Passen Sie stattdessen aus Konsistenzgründen das Tablet-Layout für kleinere Größen an.
  • Stellen Sie sicher, dass sich Ihre Aktivitäten an kleine Größen anpassen von Befolgen Sie die Material Design-Muster.
  • Verwenden FLAG_ACTIVITY_LAUNCH_ADJACENT wenn es sinnvoll ist, im Split-Screen-Modus für ein angenehmeres Erlebnis zu sorgen.
  • Erklären Sie die Inkompatibilität der Größenänderung nur, wenn dies gerechtfertigt ist. Wie wir oben besprochen haben, sticht Ihre App ansonsten negativ hervor.
Wale beendete die Sitzung, indem er einige zusätzliche nützliche Ressourcen anbot:
  • Multi-Window-Dokumentation.
  • Materialdesign-Richtlinien für den Split-Screen-Modus.
  • Beispiel einer Multi-Window-App.