A continuación, se indican 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 pantalla para las apps que se ejecutan en una pantalla no predeterminada.
Apps que se ejecutan en una pantalla no predeterminada
En cuanto a qué pantalla muestra el teclado de software del Editor del método de entrada (IME), existen diferentes modos. El teclado en pantalla se muestra en los siguientes lugares:
- Es la pantalla misma en la que aparece la app enfocada.
- Pantalla Predeterminada mientras la app enfocada se ejecuta en una pantalla no 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 recursos:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Figura 1: Teclado de software del IME tal 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 de terceros y de origen revisen el diseño y cambien el tamaño según el nuevo tamaño de pantalla cuando se creen.
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 de 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 se le permite mostrarlo, se usa B. De lo contrario, se selecciona la pantalla principal del dispositivo.
- Si la pantalla seleccionada no es 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 propiedad del sistema. Esto se debe a una preocupación de seguridad de que una app maliciosa pueda crear una pantalla virtual con compatibilidad con decoraciones del sistema habilitada y leer 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 entre diferentes campos de texto de entrada en diferentes pantallas cambiando el enfoque, 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 del destino del método de entrada (la ventana a la que va 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 reconfigurar el diseño del teclado en el tiempo de ejecución cuando se mueve el enfoque a otra pantalla.
Para lograr el cambio de la ventana del IME entre pantallas, Android 10 implementa lo siguiente:
- Ahora se hace un seguimiento del IME y de la ventana de destino de entrada por pantalla en
DisplayContent#mInputMethodWindow
yDisplayContent#mInputMethodTarget
, de modo que WindowManager (WM) pueda administrar el estado de enfoque del IME de forma independiente de cada pantalla. - En el lado del IMMS, cuando se recibe una solicitud de enfoque de un cliente de la app desde la pantalla externa a través de
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, primero se desvincula el servicio del método de entrada actual y, luego, se vuelve a vincular el servicio para volver a adjuntar el nuevo token de la ventana del IME para la pantalla externa enonServiceConnected()
. - En el IMS, después de que se recibe 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 adaptarlo a la pantalla objetivo verificando el contexto actual. - Después de que se llama a
DisplayContent#setInputMethodWindowLocked()
, la implementación envía cambios en la configuración de la pantalla a nivel del proceso conWindowProcessController
al proceso del 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 reinicializar la vista de entrada.
- Se llama a