Nachfolgend finden Sie Aktualisierungen, die an diesen anzeigespezifischen Bereichen vorgenommen wurden:
- Apps, die auf einem nicht standardmäßigen Display ausgeführt werden
- Unterstützung für Eingabemethoden-Editoren für mehrere Sitzungen
Android 10 unterstützt 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
Hinsichtlich der Anzeige der Softwaretastatur des Input Method Editor (IME) gibt es verschiedene Modi. Die Softwaretastatur wird angezeigt auf:
- Gleiches Display, auf dem die fokussierte App erscheint.
- Standardanzeige , während die fokussierte App auf einer nicht standardmäßigen Anzeige ausgeführt wird.
- Überhaupt keine Anzeige.
Das System bestimmt, welcher Modus verwendet werden soll, basierend auf den Einstellungen des Displays, auf dem die fokussierte App angezeigt wird. Weitere Einzelheiten finden Sie unter:
-
WindowManager#setDisplayImePolicy()
-
WindowManager#getDisplayImePolicy()
Abbildung 1. IME-Softwaretastatur, wie sie auf dem sekundären Display angezeigt wird, einschließlich der Ziel-App
Das System verwendet einen einzelnen IME, kann jedoch zwischen den Anzeigen wechseln, um dem Benutzerfokus zu folgen. Android 10 erwartet automatisch, dass alle IMEs von Erst- und Drittanbietern bei der Erstellung das Layout und die Größe entsprechend der neuen Anzeigegröße überarbeiten.
Wenn auf Anzeige A eine aktive Verbindung besteht und ein Eingabefeld den Eingabefokus auf Anzeige B anfordert, erfolgt der folgende Ablauf:
- Eine neue Eingabeverbindung kommt aus dem Eingabefeld auf Display B.
-
InputMethodManagerService
prüft, ob die Verbindung genehmigt werden soll. - Für den IME wird eine Anzeige ausgewählt. Wenn Display B die Anzeige des IME unterstützt und es anzeigen darf, wird B verwendet. Andernfalls wird die primäre Geräteanzeige ausgewählt.
- Wenn das ausgewählte Display nicht von Display A stammt, wird die Verbindung wiederhergestellt.
InputMethodService
wird zerstört und dann erneut erstellt.
Sicherheitsbeschränkung
Das System zeigt keinen IME auf virtuellen Displays an, die nicht dem System gehören. Dies ist auf Sicherheitsbedenken zurückzuführen, dass eine bösartige App eine virtuelle Anzeige mit aktivierter Unterstützung für Systemdekorationen erstellen und benutzersensible Informationen von der Oberfläche lesen könnte, z. B. Tippvorhersagen und benutzerdefinierte Hintergründe.
Implementierung
In Android 9 (und niedriger) war der IME nur auf dem Standardbildschirm verfügbar, wie unter Bildschirmeingabemethoden beschrieben. In Android 10 (und höher) kann ein Benutzer zwischen verschiedenen Eingabetextfeldern auf verschiedenen Displays wechseln, indem er den Fokus wechselt, und das IME-Fenster wechselt zu den sekundären Displays.
Die Implementierung in WindowManager
verfolgt das Eingabemethodenfenster (das IME-Fenster, in dem die Softtastatur gezeichnet wird) und das Eingabemethodenziel (das Fenster, in das die IME-Eingabe geht), um den IME-Status zu verwalten.
Für InputMethodManagerService
(IMMS) kann kein anderer integrierter Mechanismus die Anzeigeänderung an InputMethodService
(IMS) weitergeben und das Tastaturlayout zur Laufzeit neu konfigurieren, wenn der Fokus auf eine andere Anzeige verschoben wird.
Um den IME-Fensterwechsel zwischen Anzeigen zu erreichen, implementiert Android 10 Folgendes:
- Der IME und das Eingabezielfenster werden jetzt pro Anzeige in
DisplayContent#mInputMethodWindow
undDisplayContent#mInputMethodTarget
verfolgt, sodass der WindowManager (WM) den IME-Fokusstatus unabhängig von jeder Anzeige verwalten kann. - Wenn auf der IMMS-Seite die Fokusanforderung eines App-Clients von der externen Anzeige über
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
empfangen wird, wird zunächst die Bindung des aktuellen Eingabemethodendiensts aufgehoben und dann der Dienst erneut gebunden, um den neuen IME erneut anzuhängen Fenster-Token für die externe Anzeige inonServiceConnected()
. - Auf der IMS-Seite findet nach dem Empfang des
IMS#attachToken
der folgende Ablauf statt:-
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 die Zielanzeige anzupassen, indem der aktuelle Kontext überprüft wird. - Nachdem
DisplayContent#setInputMethodWindowLocked()
aufgerufen wurde, sendet die Implementierung Änderungen der Anzeigekonfiguration auf Prozessebene mithilfe desWindowProcessController
an den IME-Prozess, um Ressourcen zu überschreiben und Metriken anzuzeigen. - Der
InputMethodService
Client erhält die richtige Konfiguration mit den richtigen Anzeigemetriken nachonConfigurationChanged()
und demViewGroup#addView()
Aufruf, um die Eingabeansicht neu zu initialisieren.
-