Las actualizaciones realizadas en estas áreas específicas de visualización se proporcionan a continuación:
- Aplicaciones que se ejecutan en una pantalla no predeterminada
- Compatibilidad con el editor de métodos de entrada multisesión
Android 10 es compatible con el teclado de software para aplicaciones que se ejecutan en una pantalla no predeterminada.
Aplicaciones que se ejecutan en una pantalla no predeterminada
En cuanto a qué pantalla muestra el teclado de software del Editor de métodos de entrada (IME), hay dos modos diferentes. El teclado del software se muestra en:
- Misma pantalla en la que aparece la aplicación enfocada.
- Pantalla predeterminada mientras la aplicación enfocada se ejecuta en una pantalla no predeterminada.
El sistema determina qué modo usar en función de la configuración de la pantalla en la que aparece la aplicación enfocada. Para más detalles, consulte:
-
DisplayWindowSettings#shouldShowImeLocked()
-
DisplayWindowSettings#setShouldShowImeLocked()
Figura 1. Teclado de software IME tal como aparece en la pantalla secundaria, incluida la aplicación 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 de acuerdo con el nuevo tamaño de pantalla 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
comprueba 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, entonces se usa B. De lo contrario, se selecciona 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 propiedad del sistema. Esto se debe a un problema de seguridad de que una aplicación malintencionada podría crear una pantalla virtual con soporte de decoraciones del sistema habilitado y leer información confidencial del usuario desde la superficie, como escribir predicciones 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 IME se mueve a las pantallas secundarias.
La implementación en WindowManager
rastrea la ventana del método de entrada (la ventana IME donde se dibuja el teclado en pantalla) y el destino del método de entrada (la ventana donde va la entrada IME) para administrar el estado IME.
Para InputMethodManagerService
(IMMS), ningún otro mecanismo integrado puede propagar el cambio de visualización a InputMethodService
(IMS) y reconfigurar la distribución del teclado en tiempo de ejecución al mover el foco a otra pantalla.
Para lograr el cambio de ventana IME entre pantallas, Android 10 implementa lo siguiente:
- El IME y la ventana de destino de entrada ahora se rastrean por pantalla en
DisplayContent#mInputMethodWindow
yDisplayContent#mInputMethodTarget
, de modo que WindowManager (WM) puede administrar el estado de enfoque de IME independientemente de cada pantalla. - En el lado de IMMS, cuando la solicitud de enfoque de un cliente de aplicación desde la pantalla externa se recibe a través
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, primero desvincula el servicio de método de entrada actual y luego vuelve a vincular el servicio para volver a conectar el nuevo IME token de ventana para la pantalla externa enonServiceConnected()
. - En el lado de IMS, después de
IMS#attachToken
, ocurre 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 de destino comprobando el contexto actual. - Después
DisplayContent#setInputMethodWindowLocked()
, la implementación envía los cambios de configuración de visualización a nivel de proceso medianteWindowProcessController
al proceso 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 laViewGroup#addView()
para reinicializar la vista de entrada.
- Se llama a
Compatibilidad con el editor de métodos de entrada multisesión
Las implementaciones de dispositivos con varias pantallas que se espera que varios usuarios utilicen simultáneamente para proporcionar fuentes de entrada adecuadas se pueden configurar para mostrar simultáneamente varios editores de métodos de entrada (IME), como máximo uno por pantalla. Las siguientes dos figuras muestran un IME multisesión de muestra en dos pantallas:
Figura 2. Ejemplo de IME multisesión
Figura 3. Ejemplo de IME multisesión
La compatibilidad con el enfoque por pantalla es un requisito previo para esta característica. De lo contrario, esta función no se puede habilitar. Debido a restricciones de seguridad, la limitación de enfoque por pantalla restringió esta función a un pequeño subconjunto de dispositivos.
En Android 10, la compatibilidad con IME multisesión se implementa con servicios de sistema separados con un conjunto diferente de API y funcionalidad reducida. El IME multisesión no es compatible con los IME existentes. Se puede utilizar el servicio de sesión única o multisesión, pero no ambos.
No es posible usar los IME de Android existentes creados sobre la clase InputMethodService
porque se supuso que un único cliente IME se puede enfocar al mismo tiempo antes de que se introdujeran las API de IME de Android en Android 1.5 y muchas API públicas en InputMethodService
tienen ya se basó en gran medida en esa suposición. Sin embargo, actualizar la clase InputMethodService
para admitir un escenario de múltiples clientes es un desafío porque:
- Hacerlo introduciría una cantidad inaceptable de complejidad en
InputMethodService
, que ya es difícil de mantener. - Los desarrolladores de IME aún necesitan actualizar su implementación para poder admitir solicitudes paralelas de varios clientes de IME enfocados, lo que puede requerir un rediseño no trivial de su lado (como el decodificador de entrada y la base de datos del historial de escritura).
- Se espera que los casos de uso reales para clientes de IME múltiples evolucionen rápidamente, por lo que el nuevo protocolo no es estable y no está listo para exponerse como API públicas.
Al igual que con el IME de sesión única (regular), el control sobre la visualización del IME en pantallas individuales se realiza mediante DisplayWindowSettings
.
Hay un IME multisesión de muestra ubicado en development/samples/MultiClientInputMethod
.
Para probar el IME multisesión:
- Establezca
config_perDisplayFocusEnabled
entrue
. - Ejecute estos comandos:
-
$ make -j MultiClientInputMethod
-
$ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
-
$ adb root
-
$ adb shell setprop persist.debug.multi_client_ime \
com.example.android.multiclientinputmethod/.MultiClientInputMethod -
$ adb reboot
-
- Pruebe múltiples escenarios de entrada de texto.
Implementación
Consulte MultiClientInputMethodManagerService
para obtener detalles de implementación.
Las actualizaciones realizadas en estas áreas específicas de visualización se proporcionan a continuación:
- Aplicaciones que se ejecutan en una pantalla no predeterminada
- Compatibilidad con el editor de métodos de entrada multisesión
Android 10 es compatible con el teclado de software para aplicaciones que se ejecutan en una pantalla no predeterminada.
Aplicaciones que se ejecutan en una pantalla no predeterminada
En cuanto a qué pantalla muestra el teclado de software del Editor de métodos de entrada (IME), hay dos modos diferentes. El teclado del software se muestra en:
- Misma pantalla en la que aparece la aplicación enfocada.
- Pantalla predeterminada mientras la aplicación enfocada se ejecuta en una pantalla no predeterminada.
El sistema determina qué modo usar en función de la configuración de la pantalla en la que aparece la aplicación enfocada. Para más detalles, consulte:
-
DisplayWindowSettings#shouldShowImeLocked()
-
DisplayWindowSettings#setShouldShowImeLocked()
Figura 1. Teclado de software IME tal como aparece en la pantalla secundaria, incluida la aplicación 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 de acuerdo con el nuevo tamaño de pantalla 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
comprueba 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, entonces se usa B. De lo contrario, se selecciona 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 propiedad del sistema. Esto se debe a un problema de seguridad de que una aplicación malintencionada podría crear una pantalla virtual con soporte de decoraciones del sistema habilitado y leer información confidencial del usuario desde la superficie, como escribir predicciones 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 IME se mueve a las pantallas secundarias.
La implementación en WindowManager
rastrea la ventana del método de entrada (la ventana IME donde se dibuja el teclado en pantalla) y el destino del método de entrada (la ventana donde va la entrada IME) para administrar el estado IME.
Para InputMethodManagerService
(IMMS), ningún otro mecanismo integrado puede propagar el cambio de visualización a InputMethodService
(IMS) y reconfigurar la distribución del teclado en tiempo de ejecución al mover el foco a otra pantalla.
Para lograr el cambio de ventana IME entre pantallas, Android 10 implementa lo siguiente:
- El IME y la ventana de destino de entrada ahora se rastrean por pantalla en
DisplayContent#mInputMethodWindow
yDisplayContent#mInputMethodTarget
, de modo que WindowManager (WM) puede administrar el estado de enfoque de IME independientemente de cada pantalla. - En el lado de IMMS, cuando la solicitud de enfoque de un cliente de aplicación desde la pantalla externa se recibe a través
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, primero desvincula el servicio de método de entrada actual y luego vuelve a vincular el servicio para volver a conectar el nuevo IME token de ventana para la pantalla externa enonServiceConnected()
. - En el lado de IMS, después de
IMS#attachToken
, ocurre 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 de destino comprobando el contexto actual. - Después
DisplayContent#setInputMethodWindowLocked()
, la implementación envía los cambios de configuración de visualización a nivel de proceso medianteWindowProcessController
al proceso 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 laViewGroup#addView()
para reinicializar la vista de entrada.
- Se llama a
Compatibilidad con el editor de métodos de entrada multisesión
Las implementaciones de dispositivos con varias pantallas que se espera que varios usuarios utilicen simultáneamente para proporcionar fuentes de entrada adecuadas se pueden configurar para mostrar simultáneamente varios editores de métodos de entrada (IME), como máximo uno por pantalla. Las siguientes dos figuras muestran un IME multisesión de muestra en dos pantallas:
Figura 2. Ejemplo de IME multisesión
Figura 3. Ejemplo de IME multisesión
La compatibilidad con el enfoque por pantalla es un requisito previo para esta característica. De lo contrario, esta función no se puede habilitar. Debido a restricciones de seguridad, la limitación de enfoque por pantalla restringió esta función a un pequeño subconjunto de dispositivos.
En Android 10, la compatibilidad con IME multisesión se implementa con servicios de sistema separados con un conjunto diferente de API y funcionalidad reducida. El IME multisesión no es compatible con los IME existentes. Se puede utilizar el servicio de sesión única o multisesión, pero no ambos.
No es posible usar los IME de Android existentes creados sobre la clase InputMethodService
porque se supuso que un único cliente IME se puede enfocar al mismo tiempo antes de que se introdujeran las API de IME de Android en Android 1.5 y muchas API públicas en InputMethodService
tienen ya se basó en gran medida en esa suposición. Sin embargo, actualizar la clase InputMethodService
para admitir un escenario de múltiples clientes es un desafío porque:
- Hacerlo introduciría una cantidad inaceptable de complejidad en
InputMethodService
, que ya es difícil de mantener. - Los desarrolladores de IME aún necesitan actualizar su implementación para poder admitir solicitudes paralelas de varios clientes de IME enfocados, lo que puede requerir un rediseño no trivial de su lado (como el decodificador de entrada y la base de datos del historial de escritura).
- Se espera que los casos de uso reales para clientes de IME múltiples evolucionen rápidamente, por lo que el nuevo protocolo no es estable y no está listo para exponerse como API públicas.
Al igual que con el IME de sesión única (regular), el control sobre la visualización del IME en pantallas individuales se realiza mediante DisplayWindowSettings
.
Hay un IME multisesión de muestra ubicado en development/samples/MultiClientInputMethod
.
Para probar el IME multisesión:
- Establezca
config_perDisplayFocusEnabled
entrue
. - Ejecute estos comandos:
-
$ make -j MultiClientInputMethod
-
$ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
-
$ adb root
-
$ adb shell setprop persist.debug.multi_client_ime \
com.example.android.multiclientinputmethod/.MultiClientInputMethod -
$ adb reboot
-
- Pruebe múltiples escenarios de entrada de texto.
Implementación
Consulte MultiClientInputMethodManagerService
para obtener detalles de implementación.