Im Folgenden finden Sie die Änderungen, die an diesen anzeigenspezifischen Bereichen vorgenommen wurden:
- Apps, die auf einem nicht standardmäßigen Display ausgeführt werden
- Unterstützung von Eingabemethoden-Editoren für mehrere Sitzungen
Android 10 unterstützt die Softwaretastatur für Apps, die auf einem nicht standardmäßigen Display ausgeführt werden.
Apps, die auf einem nicht standardmäßigen Display ausgeführt werden
Es gibt verschiedene Modi, in denen die Softwaretastatur des IME (Input Method Editor) auf dem Display angezeigt wird. Die Softwaretastatur wird auf folgenden Geräten angezeigt:
- Same (Gleicher Bildschirm), auf dem die fokussierte App angezeigt wird.
- Standardanzeige, während die fokussierte App auf einem nicht standardmäßigen Display ausgeführt wird.
- Keine Anzeige.
Das System bestimmt anhand der Einstellungen des Displays, auf dem die fokussierte App angezeigt wird, welcher Modus verwendet werden soll. Weitere Informationen finden Sie unter:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Abbildung 1: IME-Softwaretastatur auf dem sekundären Display, einschließlich der Ziel-App
Das System verwendet ein einzelnes IME, kann aber zwischen Displays wechseln, um dem Fokus des Nutzers zu folgen. Unter Android 10 wird automatisch erwartet, dass alle IMEs von Erst- und Drittanbietern 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 auf Display B den Eingabefokus anfordert, passiert Folgendes:
- Eine neue Eingabeverbindung kommt vom Eingabefeld auf Display B.
InputMethodManagerService
prüft, ob die Verbindung genehmigt werden soll.- Für die IME ist ein Display ausgewählt. Wenn auf Display B die IME angezeigt werden kann und dies zulässig ist, wird Display B verwendet. Andernfalls wird das primäre Gerätedisplay ausgewählt.
- Wenn das ausgewählte Display nicht Display A ist, wird die Verbindung wiederhergestellt.
InputMethodService
wird zerstört und dann neu erstellt.
Sicherheitseinschränkung
Das System zeigt keine IME auf virtuellen Displays an, die nicht dem System gehören. Das liegt an einem Sicherheitsrisiko, da eine schädliche App ein virtuelles Display mit aktivierter Unterstützung für Systemdekorationen erstellen und nutzersensible Informationen von der Oberfläche lesen könnte, z. B. Tippvorhersagen und benutzerdefinierte Hintergründe.
Implementierung
Unter Android 9 und niedriger war die IME nur auf dem Standardbildschirm verfügbar, wie unter On-Screen-Eingabemethoden beschrieben. Unter Android 10 und höher können Nutzer zwischen verschiedenen Eingabefeldern auf verschiedenen Displays wechseln, indem sie den Fokus ändern. Das IME-Fenster wird dann auf die sekundären Displays verschoben.
Die Implementierung in WindowManager
verfolgt das Eingabemethodenfenster (das IME-Fenster, in dem die Bildschirmtastatur gezeichnet wird) und das Eingabemethodenziel (das Fenster, in das die IME-Eingabe erfolgt), um den IME-Status zu verwalten.
Bei InputMethodManagerService
(IMMS) kann keine andere integrierte Funktion die Anzeigeä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 gewechselt werden kann, wird in Android 10 Folgendes implementiert:
- Die IME und das Eingabeziel-Fenster werden jetzt pro Display in
DisplayContent#mInputMethodWindow
undDisplayContent#mInputMethodTarget
erfasst, sodass der WindowManager (WM) den IME-Fokusstatus unabhängig von jedem Display verwalten kann. - Wenn auf der IMMS-Seite die Fokusanfrage eines App-Clients vom externen Display über
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
empfangen wird, wird zuerst der aktuelle Eingabemethodendienst entbunden und dann wieder gebunden, um das neue IME-Fenster-Token für das externe Display inonServiceConnected()
neu anzuhängen. - 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 Tastaturlayout zu überarbeiten und an das Zieldisplay anzupassen. Dabei wird der aktuelle Kontext berücksichtigt.- Nachdem
DisplayContent#setInputMethodWindowLocked()
aufgerufen wurde, sendet die Implementierung Änderungen an der Anzeigekonfiguration auf Prozessebene überWindowProcessController
an den IME-Prozess, um Ressourcen und Anzeigemesswerte zu überschreiben. - Der
InputMethodService
-Client erhält die richtige Konfiguration mit den richtigen Display-Messwerten nachonConfigurationChanged()
und demViewGroup#addView()
-Aufruf zum Reinitialisieren der Eingabeansicht.