Unterstützung für Eingabemethoden-Editoren

Nachfolgend finden Sie Aktualisierungen, die an diesen anzeigespezifischen Bereichen vorgenommen wurden:

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:

  1. Eine neue Eingabeverbindung kommt aus dem Eingabefeld auf Display B.
  2. InputMethodManagerService prüft, ob die Verbindung genehmigt werden soll.
  3. 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.
  4. 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 und DisplayContent#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 in onServiceConnected() .
  • Auf der IMS-Seite findet nach dem Empfang des IMS#attachToken der folgende Ablauf statt:
    • ContextImpl#updateDisplay wird aufgerufen, um die Anzeige des Dienstkontexts in InputMethodService#attachToken() zu aktualisieren. Dadurch wird ViewGroup#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 des WindowProcessController an den IME-Prozess, um Ressourcen zu überschreiben und Metriken anzuzeigen.
    • Der InputMethodService Client erhält die richtige Konfiguration mit den richtigen Anzeigemetriken nach onConfigurationChanged() und dem ViewGroup#addView() Aufruf, um die Eingabeansicht neu zu initialisieren.