Mit verbundenen Displays wird die Desktop-Freiform-Fensterfunktion auf Standard-Smartphones ausgeweitet. Nutzer können so über ihre Mobilgeräte auf große Bildschirme zugreifen. Diese Funktion eröffnet neue Möglichkeiten für die App-Interaktion und die Nutzerproduktivität.
Alle einzigartigen Funktionen von Desktop-Freiform-Fenstern gelten auch für verbundene Displays. Wenn Sie ein Smartphone mit einem Display verbinden, bleibt der Status des Smartphones unverändert und auf dem verbundenen Display wird eine leere Desktop-Sitzung gestartet. Das Gerät und das Display fungieren als zwei separate Systeme mit jeweils eigenen Apps.
Wenn Sie ein Gerät, das Desktop-Freiform-Fenster unterstützt, z. B. ein Tablet, mit einem externen Monitor verbinden, wird die Desktop-Sitzung auf beide Displays erweitert. Die beiden Displays funktionieren dann als ein durchgehendes System. Bei dieser Einrichtung können Fenster, Inhalte und der Cursor frei zwischen den beiden Displays verschoben werden.
Die effektive Unterstützung von verbundenen Displays erfordert die Berücksichtigung mehrerer Aspekte des Designs und der Implementierung Ihrer App. Die folgenden Best Practices sorgen für eine reibungslose und produktive Nutzererfahrung.
Umgang mit dynamischen Displayänderungen
Viele Apps werden in der Annahme entwickelt, dass sich das Display-Objekt und seine Merkmale während des Lebenszyklus der App nicht ändern. Wenn ein Nutzer jedoch einen externen Monitor anschließt oder trennt oder ein App-Fenster zwischen Displays verschiebt, kann sich das zugrunde liegende Display-Objekt ändern, das dem Kontext oder Fenster Ihrer App zugeordnet ist. Die Eigenschaften des Displays, z. B. Größe, Auflösung, Aktualisierungsrate, HDR-Unterstützung und Dichte, können unterschiedlich sein. Wenn Sie Werte basierend auf dem Display des Smartphones fest codieren, werden Ihre Layouts auf einem externen Display wahrscheinlich nicht richtig dargestellt.
Externe Displays können auch sehr unterschiedliche Pixeldichten haben. Ihre App muss korrekt auf Änderungen der Dichte reagieren. Dazu gehört, dichteunabhängige Pixel (dp) für Layouts zu verwenden, dichteabhängige Ressourcen bereitzustellen und dafür zu sorgen, dass die Benutzeroberfläche richtig skaliert wird.
Wenn eine Aktivität auf einem externen Display ausgeführt wird, während das Display getrennt wird, verschiebt das System die Aktivität auf das primäre Display. Durch das Verschieben werden Konfigurationsänderungen ausgelöst, z. B. Änderungen der Bildschirmgröße und ‑dichte, die dazu führen können, dass die Aktivität neu erstellt wird. Ihre App muss die Konfigurationsänderung verarbeiten, indem sie den UI-Status speichert und wiederherstellt, um Datenverlust oder eine verwirrende Nutzererfahrung zu vermeiden.
Den richtigen Kontext verwenden
In Umgebungen mit mehreren Displays ist es entscheidend, 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 Anzeigedichte oder zu den Fenstermesswerten Ihrer App. Verwenden Sie immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext), um Informationen zum aktuellen Fenster oder zur aktuellen Anzeige abzurufen. Dies wirkt sich auch auf einige System-APIs aus, die Informationen aus dem Kontext verwenden.
In Jetpack Compose können Sie mit CompositionLocal-Objekten wie LocalConfiguration.current und LocalDensity.current auf displayspezifische Informationen zugreifen. Wenn eine Aktivität oder ein Fenster zwischen Displays verschoben wird, ändert sich die Gerätekonfiguration. Dadurch wird die Neuzusammensetzung mit neuen Displaymesswerten ausgelöst. Mit CompositionLocal-Objekten kann sich die Benutzeroberfläche nahtlos anpassen.
Displayinformationen abrufen
Mit der Klasse Display können Sie Informationen wie Displaygröße, Dichte oder Flags abrufen. Verwenden Sie den Systemdienst DisplayManager, um die verfügbaren Displays abzurufen. Um externe Displays zu identifizieren, filtern Sie Display.DEFAULT_DISPLAY heraus. Das ist in der Regel der integrierte Bildschirm des Smartphones oder Tablets:
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
// The default display is 0. External displays have other IDs.
val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
Aktivitätsstart und -konfiguration verwalten
Mit verbundenen Displays können Apps angeben, auf welchem Display eine App ausgeführt werden soll, wenn sie gestartet wird oder eine weitere Aktivität erstellt. Dieses Verhalten hängt vom in der Manifestdatei definierten Aktivitätsstartmodus und von den Intent-Flags und ‑Optionen ab, die von der Einheit festgelegt werden, die die Aktivität startet.
Wenn eine Aktivität auf ein sekundäres Display verschoben wird, kann es in Ihrer App zu einer Kontextaktualisierung, 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.
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, was in bestimmten Multitasking-Szenarien von Vorteil sein kann.
Mit ActivityOptions können Sie eine Aktivität auf einem bestimmten Display starten. launchDisplayId erfordert Android 8 (API‑Level 26) oder höher.
// Get DisplayManager and find the first external display.
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val externalDisplayId = displayManager.displays
.firstOrNull { it.displayId != Display.DEFAULT_DISPLAY }
?.displayId
// If an external display is found, launch the activity on it.
if (externalDisplayId != null) {
val intent = Intent(this, MySecondaryActivity::class.java)
val options = ActivityOptions.makeBasic()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
options.launchDisplayId = externalDisplayId
}
startActivity(intent, options.toBundle())
} else {
// Optionally, handle the case where no external display is connected.
}
Geräte-Zulassungslisten vermeiden
Apps beschränken die Benutzeroberfläche und Funktionen für große Bildschirme manchmal auf ausgewählte Geräte. Dies geschieht über eine Zulassungsliste oder durch Prüfen von BUILD.MODEL und der integrierten Anzeigegröße. Dieser Ansatz ist für verbundene Displays nicht effektiv, da praktisch jedes Gerät mit einem großen Bildschirm verbunden werden kann und sich das Gerätemodell nicht ändert, wenn ein externes Display angeschlossen wird.
Anstatt Zulassungslisten zu verwenden oder BUILD.MODEL und die integrierte Anzeigegröße zu prüfen, sollten Sie zur Laufzeit Fenster-Messwerte oder Gerätefunktionen prüfen, um Entscheidungen zur Benutzeroberfläche zu treffen. Verwenden Sie Jetpack WindowManager-APIs oder Fenstergrößenklassen, um responsive und adaptive Layouts für verschiedene Bildschirmgrößen und ‑dichten zu erstellen.
Unterstützung externer Peripheriegeräte
Wenn Nutzer eine Verbindung zu einem externen Display herstellen, schaffen sie oft eine eher desktopähnliche Umgebung. Dazu werden häufig externe Tastaturen, Mäuse, Trackpads, Webcams, Mikrofone und Lautsprecher verwendet. Sie müssen dafür sorgen, dass Ihre App nahtlos mit diesen Peripheriegeräten funktioniert. Dazu gehören die Verarbeitung von Tastenkombinationen, die Verwaltung von Mauszeigerinteraktionen, die korrekte Unterstützung externer Kameras oder Mikrofone und die Berücksichtigung des Audioausgabe-Routings. Weitere Informationen finden Sie unter Eingabekompatibilität auf großen Bildschirmen.
Nutzerproduktivität steigern
Verbundene Displays bieten eine große Chance, die Nutzerproduktivität zu steigern. Sie haben jetzt die Tools, um mobile Apps zu entwickeln, die mit Desktopanwendungen vergleichbar sind. Sie können die Nutzerproduktivität steigern, indem Sie die folgenden Funktionen implementieren:
- Nutzern ermöglichen, mehrere Instanzen derselben App zu öffnen. Das ist sehr nützlich, wenn Sie beispielsweise Dokumente vergleichen, verschiedene Unterhaltungen verwalten oder mehrere Dateien gleichzeitig ansehen möchten.
- Ermöglichen Sie Nutzern, mit Drag-and-drop umfangreiche Daten in Ihrer App und aus Ihrer App heraus freizugeben.
- Helfen Sie Nutzern, ihren Workflow bei Konfigurationsänderungen beizubehalten, indem Sie ein robustes Statusverwaltungssystem implementieren.
Wenn Sie diese Richtlinien befolgen und die bereitgestellten Codebeispiele verwenden, können Sie Apps erstellen, die sich nahtlos an verbundene Displays anpassen und Nutzern eine bessere und produktivere Nutzung ermöglichen.