Ниже приведены обновления, внесенные в эти области отображения:
- Приложения, работающие на дисплее, отличном от дисплея по умолчанию
- Поддержка редактора многосессионного метода ввода
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 для переопределения ресурсов и отображения метрик. - Клиент
InputMethodService
получает правильную конфигурацию с правильными метриками отображения после вызоваonConfigurationChanged()
иViewGroup#addView()
для повторной инициализации представления ввода.
-