Di seguito sono riportati gli aggiornamenti apportati a queste aree specifiche per il display:
- App in esecuzione su un display non predefinito
- Supporto dell'editor del metodo di input multiseduta
Android 10 supporta la tastiera su schermo per le app eseguite su un display non predefinito.
App in esecuzione su un display non predefinito
Per quanto riguarda il display che mostra la tastiera su schermo dell'Input Method Editor (IME), esistono diverse modalità. La tastiera su schermo viene visualizzata su:
- Stessa visualizzazione in cui viene visualizzata l'app in primo piano.
- Visualizzazione predefinita mentre l'app in primo piano è in esecuzione su un display non predefinito.
- Nessuna visualizzazione.
Il sistema determina quale modalità utilizzare in base alle impostazioni del display su cui viene visualizzata l'app in primo piano. Per ulteriori dettagli, vedi:
WindowManager#setDisplayImePolicy()WindowManager#getDisplayImePolicy()

Figura 1. Tastiera su schermo IME visualizzata sul display secondario, inclusa l'app di destinazione
Il sistema utilizza un unico IME, ma può spostarsi tra i display per seguire lo stato attivo dell'utente. Android 10 prevede automaticamente che tutti gli IME di prima e terza parte rivedano il layout e ridimensionino in base alle nuove dimensioni di visualizzazione al momento della creazione.
Se è presente una connessione attiva sul display A e un campo di immissione richiede il focus di input sul display B, si verifica il seguente flusso:
- Una nuova connessione di input proviene dal campo di immissione sul display B.
InputMethodManagerServicecontrolla se la connessione deve essere approvata.- È selezionato un display per l'IME. Se il display B supporta la visualizzazione dell'IME e è autorizzato a mostrarlo, viene utilizzato B. In caso contrario, viene selezionato il display del dispositivo principale.
- Se il display selezionato non è il display A, la connessione viene
ristabilita.
InputMethodServiceviene eliminato e poi ricreato.
Limitazione di sicurezza
Il sistema non mostrerà un IME su display virtuali non di proprietà del sistema. Ciò è dovuto a un problema di sicurezza: un'app dannosa potrebbe creare un display virtuale con il supporto delle decorazioni di sistema abilitato e leggere informazioni sensibili dell'utente dalla superficie, ad esempio le previsioni di digitazione e gli sfondi personalizzati.
Implementazione
In Android 9 (e versioni precedenti), l'IME era disponibile solo nella schermata predefinita, come descritto in Metodi di input sullo schermo. In Android 10 e versioni successive, un utente può passare da un campo di testo di input all'altro su display diversi cambiando il focus e la finestra IME si sposta sui display secondari.
L'implementazione in WindowManager tiene traccia della finestra del metodo di immissione (la finestra IME in cui viene disegnata la tastiera su schermo) e della destinazione del metodo di immissione (la finestra in cui viene inserito l'input IME) per gestire lo stato IME.
Per InputMethodManagerService (IMMS), nessun altro meccanismo integrato può
propagare la modifica della visualizzazione a InputMethodService (IMS) e
riconfigurare il layout della tastiera in fase di runtime quando si sposta lo stato attivo su un altro display.
Per ottenere il cambio della finestra IME tra i display, Android 10 implementa quanto segue:
- L'IME e la finestra di destinazione dell'input vengono ora monitorati per display in
DisplayContent#mInputMethodWindoweDisplayContent#mInputMethodTarget, in modo che WindowManager (WM) possa gestire lo stato di messa a fuoco dell'IME indipendentemente da ogni display. - Sul lato IMMS, quando una richiesta di messa a fuoco di un client app dal display esterno
viene ricevuta tramite
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus, il servizio di metodo di input corrente viene prima scollegato e poi ricollegato per ricollegare il nuovo token della finestra IME per il display esterno inonServiceConnected(). - Sul lato IMS, dopo la ricezione di
IMS#attachToken, si verifica il seguente flusso:ContextImpl#updateDisplayviene chiamato per aggiornare la visualizzazione del contesto del servizio inInputMethodService#attachToken(). Questa chiamataViewGroup#addView()per rivedere il layout della tastiera e adattarsi al display di destinazione controllando il contesto attuale.- Dopo la chiamata di
DisplayContent#setInputMethodWindowLocked(), l'implementazione invia le modifiche alla configurazione di visualizzazione a livello di processo utilizzandoWindowProcessControlleral processo IME per ignorare le risorse e visualizzare le metriche. - Il client
InputMethodServiceottiene la configurazione corretta con le metriche di visualizzazione corrette dopoonConfigurationChanged()e la chiamataViewGroup#addView()per reinizializzare la visualizzazione dell'input.