Ниже приведены изменения, внесенные в эти области, относящиеся к конкретному дисплею:
- Приложения, работающие на нестандартном дисплее.
- Поддержка редактора методов ввода для нескольких сессий
Android 10 поддерживает программную клавиатуру для приложений, работающих на экране, отличном от стандартного.
Приложения, работающие на нестандартном дисплее.
Существуют различные режимы отображения программной клавиатуры редактора методов ввода (IME). Программная клавиатура отображается на:
- Тот же экран, на котором отображается активное приложение.
- Отображение по умолчанию, если активное приложение работает на экране, отличном от стандартного.
- Отсутствует изображение вообще.
Система определяет, какой режим использовать, исходя из настроек дисплея, на котором отображается активное приложение. Для получения более подробной информации см.:
-
WindowManager#setDisplayImePolicy() -
WindowManager#getDisplayImePolicy()

Рисунок 1. Программная клавиатура IME, как она отображается на дополнительном дисплее, включая целевое приложение.
Система использует один IME, но может переключаться между экранами в соответствии с фокусом пользователя. Android 10 автоматически ожидает, что все собственные и сторонние IME будут изменять макет и размер в соответствии с новым размером экрана при создании.
Если на дисплее A установлено активное соединение, и поле ввода запрашивает фокус на дисплее B, то происходит следующее:
- Новое входное соединение поступает из поля ввода на дисплее B.
-
InputMethodManagerServiceпроверяет, следует ли разрешить соединение. - Для отображения IME выбирается один из дисплеев. Если дисплей B поддерживает отображение IME и имеет разрешение на его отображение, то используется дисплей B. В противном случае выбирается основной дисплей устройства.
- Если выбранный дисплей не относится к дисплею A, соединение восстанавливается.
InputMethodServiceуничтожается, а затем создается заново.
Ограничение безопасности
Система не будет отображать IME на виртуальных дисплеях, не принадлежащих системе. Это связано с проблемой безопасности, заключающейся в том, что вредоносное приложение может создать виртуальный дисплей с включенной поддержкой системных декораций и считывать конфиденциальную информацию пользователя с этого дисплея, такую как подсказки ввода и пользовательские фоны.
Выполнение
В Android 9 (и более ранних версиях) экранный интерфейс ввода (IME) был доступен только на основном экране, как описано в разделе «Методы экранного ввода» . В Android 10 (и более поздних версиях) пользователь может переключаться между различными текстовыми полями ввода на разных дисплеях, меняя фокус, и окно IME перемещается на дополнительные дисплеи.
В реализации WindowManager отслеживаются окно метода ввода (окно IME, где отображается экранная клавиатура) и целевое окно метода ввода (окно, куда поступает ввод IME) для управления состоянием IME.
Для InputMethodManagerService (IMMS) ни один другой встроенный механизм не может передать изменение отображения в InputMethodService (IMS) и перенастроить раскладку клавиатуры во время выполнения при перемещении фокуса на другой дисплей.
Для переключения окон IME между дисплеями в Android 10 реализовано следующее:
- Теперь окно ввода и окно IME отслеживаются для каждого дисплея в
DisplayContent#mInputMethodWindowиDisplayContent#mInputMethodTarget, так что WindowManager (WM) может управлять состоянием фокуса IME независимо от каждого дисплея. - На стороне IMMS, когда запрос на фокусировку от клиента приложения с внешнего дисплея поступает через
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus, сначала отключается текущая служба метода ввода, а затем она повторно подключается для повторного присоединения нового токена окна IME для внешнего дисплея вonServiceConnected(). - На стороне IMS после получения
IMS#attachTokenпроисходит следующий процесс:-
ContextImpl#updateDisplayвызывается для обновления отображения контекста службы вInputMethodService#attachToken(). Это вызываетViewGroup#addView()для изменения раскладки клавиатуры и адаптации к целевому отображению с учетом текущего контекста. - После вызова
DisplayContent#setInputMethodWindowLocked()реализация отправляет изменения конфигурации отображения на уровне процесса с помощьюWindowProcessControllerв процесс IME для переопределения ресурсов и метрик отображения. - После
onConfigurationChanged()и вызоваViewGroup#addView()для повторной инициализации представления ввода клиентInputMethodServiceполучает правильную конфигурацию с корректными метриками отображения.
-