Обновления, внесенные в эти области дисплея, представлены ниже:
- Приложения, работающие на дисплее, отличном от стандартного
- Поддержка редактора многосессионного метода ввода
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()
для повторной инициализации входного представления.
-