以下為這些多媒體特定區域的更新:
Android 10 支援在非預設螢幕上執行的應用程式使用軟體鍵盤。
在非預設螢幕上執行的應用程式
就顯示哪個畫面顯示輸入法編輯器 (IME) 的軟體鍵盤而言,有不同的模式。軟體鍵盤會顯示在以下位置:
- 相同:顯示所選應用程式的螢幕。
- 當焦點應用程式在非預設顯示器上執行時,顯示預設畫面。
- 「No」:完全不顯示。
系統會根據顯示畫面 (即焦點應用程式所在畫面) 的設定,決定要使用的模式。詳情請參閱:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
圖 1. IME 軟體鍵盤在次要螢幕上顯示的樣子,包括目標應用程式
系統會使用單一輸入法編輯器,但可在螢幕之間切換,以便追蹤使用者的焦點。Android 10 會自動預期所有第一方和第三方 IME 會根據建立時的新螢幕大小修改版面配置和調整大小。
如果螢幕 A 上有有效連線,且輸入欄位要求在螢幕 B 上取得輸入焦點,就會發生下列流程:
- 新的輸入連線來自螢幕 B 的輸入欄位。
InputMethodManagerService
會檢查是否應核准連線。- 已為輸入法編輯器選取螢幕。如果顯示器 B 支援顯示 IME 且允許顯示 IME,則會使用 B。否則,系統會選取主要裝置螢幕。
- 如果所選顯示器不是來自顯示器 A,則會重新建立連線。
InputMethodService
會先刪除,然後再重新建立。
安全性限制
系統不會在非系統所擁有的虛擬螢幕上顯示 IME。這是因為惡意應用程式可能會建立虛擬顯示畫面,並啟用系統裝飾支援功能,從途徑讀取使用者敏感資訊,例如輸入預測內容和自訂背景。
實作
在 Android 9 (和以下版本) 中,輸入法編輯器僅適用於預設畫面,如「螢幕輸入法」一節所述。在 Android 10 (及以上版本) 中,使用者可以透過切換焦點,在不同螢幕上切換不同的輸入文字欄位,而輸入法編輯器視窗會移至次要螢幕。
WindowManager
中的實作項目會追蹤輸入法視窗 (繪製螢幕鍵盤的 IME 視窗) 和輸入法目標 (IME 輸入的視窗),以管理 IME 狀態。
對於 InputMethodManagerService
(IMMS),沒有其他內建機制可將顯示變更傳播至 InputMethodService
(IMS),並在將焦點移至其他螢幕時重新設定鍵盤配置。
為了在螢幕之間執行輸入法編輯器視窗切換,Android 10 會實作以下內容:
- IME 和輸入目標視窗現在會在
DisplayContent#mInputMethodWindow
和DisplayContent#mInputMethodTarget
中依顯示器追蹤,讓 WindowManager (WM) 能夠獨立管理每個顯示器的 IME 焦點狀態。 - 在 IMMS 端,透過
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
收到外部螢幕的應用程式用戶端焦點要求時,系統會先解除繫結目前的輸入法服務,然後重新繫結服務,重新連結onServiceConnected()
中外部螢幕的新 IME 視窗權杖。 - 在 IMS 端,收到
IMS#attachToken
後,會發生以下流程:- 系統會呼叫
ContextImpl#updateDisplay
,以更新InputMethodService#attachToken()
中的服務內容顯示畫面。這會呼叫ViewGroup#addView()
來修訂鍵盤的版面配置,並配合檢查目前情境的目標螢幕進行調整。 - 呼叫
DisplayContent#setInputMethodWindowLocked()
後,實作會使用WindowProcessController
將程序層級顯示設定變更傳送至 IME 程序,以便覆寫資源和顯示指標。 onConfigurationChanged()
和ViewGroup#addView()
呼叫重新初始化輸入檢視畫面後,InputMethodService
用戶端會取得正確的設定,並顯示正確的指標。
- 系統會呼叫