A continuación, se incluyen las actualizaciones realizadas en estas áreas específicas de la pantalla:
- Apps que se ejecutan en una pantalla no predeterminada
- Compatibilidad con el editor de método de entrada de varias sesiones
Android 10 admite el teclado en software para apps que se ejecutan en una pantalla no predeterminada.
Apps que se ejecutan en una pantalla no predeterminada
En términos de qué pantalla muestra el teclado en software del editor de métodos de entrada (IME), existen diferentes modos. El teclado en pantalla se muestra en las siguientes ubicaciones:
- La misma pantalla en la que aparece la app enfocada
- Pantalla predeterminada mientras la app enfocada se ejecuta en una pantalla que no es predeterminada.
- No se muestra nada.
El sistema determina qué modo usar en función de la configuración de la pantalla en la que aparece la app enfocada. Para obtener más información, consulta los siguientes vínculos:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Figura 1: Teclado en software IME como aparece en la pantalla secundaria, incluida la app de destino
El sistema usa un solo IME, pero puede cambiar entre pantallas para seguir el enfoque del usuario. Android 10 espera automáticamente que todos los IME propios y de terceros revisen el diseño y cambien el tamaño en función del nuevo tamaño de visualización cuando se crean.
Si hay una conexión activa en la pantalla A y un campo de entrada solicita el enfoque de entrada en la pantalla B, se produce el siguiente flujo:
- Una nueva conexión de entrada proviene del campo de entrada en la pantalla B.
InputMethodManagerService
verifica si se debe aprobar la conexión.- Se selecciona una pantalla para el IME. Si la pantalla B admite mostrar el IME y puede mostrarlo, se usa B. De lo contrario, se seleccionará la pantalla del dispositivo principal.
- Si la pantalla seleccionada no es de la pantalla A, se restablece la conexión.
InputMethodService
se destruye y, luego, se vuelve a crear.
Restricción de seguridad
El sistema no mostrará un IME en pantallas virtuales que no sean del sistema. Esto se debe a un problema de seguridad que podría permitir que una app maliciosa cree una pantalla virtual con la compatibilidad con decoraciones del sistema habilitada y lea información sensible del usuario desde la superficie, como predicciones de escritura y fondos personalizados.
Implementación
En Android 9 (y versiones anteriores), el IME solo estaba disponible en la pantalla predeterminada, como se describe en Métodos de entrada en pantalla. En Android 10 (y versiones posteriores), un usuario puede cambiar de enfoque entre diferentes campos de texto de entrada en diferentes pantallas, y la ventana del IME se mueve a las pantallas secundarias.
La implementación en WindowManager
hace un seguimiento de la ventana del método de entrada (la ventana del IME en la que se dibuja el teclado en pantalla) y el objetivo del método de entrada (la ventana en la que se coloca la entrada del IME) para administrar el estado del IME.
En el caso de InputMethodManagerService
(IMMS), ningún otro mecanismo integrado puede propagar el cambio de pantalla a InputMethodService
(IMS) ni volver a configurar el diseño del teclado durante el tiempo de ejecución cuando se mueve el enfoque a otra pantalla.
Para lograr el cambio de ventana del IME entre pantallas, Android 10 implementa lo siguiente:
- Ahora se realiza un seguimiento del IME y de la ventana de destino de entrada por pantalla en
DisplayContent#mInputMethodWindow
yDisplayContent#mInputMethodTarget
, de modo que WindowManager (WM) puede administrar el estado del enfoque del IME de forma independiente de cada pantalla. - En el lado de IMMS, cuando se recibe a través de
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
la solicitud de enfoque de un cliente de app desde la pantalla externa, primero se desvincula el servicio de método de entrada actual y, luego, se vuelve a vincular el servicio para volver a conectar el nuevo token de ventana del IME para la pantalla externa enonServiceConnected()
. - En el lado del IMS, después de recibir el
IMS#attachToken
, se produce el siguiente flujo:- Se llama a
ContextImpl#updateDisplay
para actualizar la visualización del contexto del servicio enInputMethodService#attachToken()
. Esto llama aViewGroup#addView()
para revisar el diseño del teclado y adaptarse a la pantalla de destino verificando el contexto actual. - Después de llamar a
DisplayContent#setInputMethodWindowLocked()
, la implementación envía cambios de configuración de la pantalla a nivel del proceso conWindowProcessController
al proceso de IME para anular los recursos y mostrar las métricas. - El cliente
InputMethodService
obtiene la configuración correcta con las métricas de visualización correctas después deonConfigurationChanged()
y la llamadaViewGroup#addView()
para volver a inicializar la vista de entrada.
- Se llama a