Im Folgenden finden Sie die Änderungen an diesen anzeigespezifischen Bereichen:
- Apps, die auf einem anderen Display als dem Standarddisplay ausgeführt werden
- Unterstützung für den Editor für Eingabemethoden für mehrere Sitzungen
Android 10 unterstützt die Softwaretastatur für Apps, die auf einem nicht standardmäßigen Bildschirm ausgeführt werden.
Apps, die auf einem nicht standardmäßigen Bildschirm ausgeführt werden
Es gibt verschiedene Modi, in denen die Softwaretastatur des Eingabemethoden-Editors (IME) auf dem Display angezeigt wird. Die Softwaretastatur wird an folgenden Stellen angezeigt:
- Auf dem selben Display, auf dem die App angezeigt wird, auf die der Fokus gerichtet ist.
- Standard-Display, während die App im Fokus auf einem anderen Display ausgeführt wird.
- Kein Display.
Das System bestimmt anhand der Einstellungen des Displays, auf dem die App mit Fokus angezeigt wird, welcher Modus verwendet werden soll. Weitere Informationen finden Sie hier:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Abbildung 1: Softwaretastatur der Eingabemethode, wie sie auf dem sekundären Display angezeigt wird, einschließlich Ziel-App
Das System verwendet eine einzelne IME, kann aber zwischen den Displays wechseln, um dem Nutzerfokus zu folgen. Unter Android 10 wird automatisch davon ausgegangen, dass alle IMEs von Drittanbietern und von Google das Layout überarbeiten und die Größe entsprechend der neuen Displaygröße anpassen, wenn sie erstellt werden.
Wenn auf Display A eine aktive Verbindung besteht und ein Eingabefeld den Eingabefokus auf Display B anfordert, geschieht Folgendes:
- Eine neue Eingabeverbindung kommt vom Eingabefeld auf Display B.
InputMethodManagerService
prüft, ob die Verbindung genehmigt werden soll.- Für den IME wird ein Display ausgewählt. Wenn Display B die Anzeige der IME unterstützt und sie anzeigen darf, wird B verwendet. Andernfalls wird das primäre Display des Geräts ausgewählt.
- Wenn das ausgewählte Display nicht zu Display A gehört, wird die Verbindung wiederhergestellt.
InputMethodService
wird gelöscht und dann wieder erstellt.
Sicherheitseinschränkung
Das System zeigt auf virtuellen Displays, die nicht dem System gehören, keine IME an. Das liegt an einem Sicherheitsrisiko: Eine schädliche App könnte ein virtuelles Display mit aktivierter Unterstützung für Systemdekorationen erstellen und vertrauliche Informationen des Nutzers von der Oberfläche lesen, z. B. Vorschläge zur Textvervollständigung und benutzerdefinierte Hintergründe.
Implementierung
Unter Android 9 und niedriger war die IME nur auf dem Standardbildschirm verfügbar, wie unter Eingabemethoden auf dem Bildschirm beschrieben. Unter Android 10 (und höher) kann ein Nutzer durch Wechseln des Fokus zwischen verschiedenen Eingabetextfeldern auf verschiedenen Displays wechseln. Das IME-Fenster wird dann auf die sekundären Displays verschoben.
Die Implementierung in WindowManager
überwacht das Fenster der Eingabemethode (das IME-Fenster, in dem die Soft-Tastatur gezeichnet wird) und das Ziel der Eingabemethode (das Fenster, in das die IME-Eingabe erfolgt), um den IME-Status zu verwalten.
Bei InputMethodManagerService
(IMMS) kann kein anderer integrierter Mechanismus die Displayänderung an InputMethodService
(IMS) weitergeben und das Tastaturlayout zur Laufzeit neu konfigurieren, wenn der Fokus auf ein anderes Display verschoben wird.
Damit das IME-Fenster zwischen Displays wechseln kann, werden in Android 10 folgende Funktionen implementiert:
- Das IME- und Eingabezielfenster werden jetzt in
DisplayContent#mInputMethodWindow
undDisplayContent#mInputMethodTarget
pro Display erfasst, damit der WindowManager (WM) den IME-Fokusstatus unabhängig von jedem Display verwalten kann. - Wenn auf IMMS-Seite die Fokusanfrage eines App-Clients vom externen Display über
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
empfangen wird, wird zuerst die Bindung des aktuellen Eingabemethodendienstes aufgehoben und dann wieder hergestellt, um das neue IME-Fenstertoken für das externe Display inonServiceConnected()
wieder zu verknüpfen. - Auf der IMS-Seite erfolgt nach dem Empfang von
IMS#attachToken
der folgende Ablauf:ContextImpl#updateDisplay
wird aufgerufen, um die Anzeige des Dienstkontexts inInputMethodService#attachToken()
zu aktualisieren. Dadurch wirdViewGroup#addView()
aufgerufen, um das Layout der Tastatur zu überarbeiten und an das Zieldisplay anzupassen. Dabei wird der aktuelle Kontext geprüft.- Nach dem Aufruf von
DisplayContent#setInputMethodWindowLocked()
sendet die Implementierung Änderungen der Anzeigekonfiguration auf Prozessebene überWindowProcessController
an den IME-Prozess, um Ressourcen und Anzeigemesswerte zu überschreiben. - Der
InputMethodService
-Client erhält nachonConfigurationChanged()
und demViewGroup#addView()
-Aufruf die richtige Konfiguration mit den richtigen Anzeigemesswerten, um die Eingabeansicht neu zu initialisieren.