支援輸入法編輯器

以下為這些多媒體特定區域的更新:

Android 10 支援在非預設螢幕上執行的應用程式使用軟體鍵盤

在非預設螢幕上執行的應用程式

就顯示哪個畫面顯示輸入法編輯器 (IME) 的軟體鍵盤而言,有不同的模式。軟體鍵盤會顯示在以下位置:

  • 相同:顯示所選應用程式的螢幕。
  • 當焦點應用程式在非預設顯示器上執行時,顯示預設畫面。
  • 「No」:完全不顯示。

系統會根據顯示畫面 (即焦點應用程式所在畫面) 的設定,決定要使用的模式。詳情請參閱:

  • WindowManager#setDisplayImePolicy()
  • WindowManager#getDisplayImePolicy()

圖 1. IME 軟體鍵盤在次要螢幕上顯示的樣子,包括目標應用程式

系統會使用單一輸入法編輯器,但可在螢幕之間切換,以便追蹤使用者的焦點。Android 10 會自動預期所有第一方和第三方 IME 會根據建立時的新螢幕大小修改版面配置和調整大小。

如果螢幕 A 上有有效連線,且輸入欄位要求在螢幕 B 上取得輸入焦點,就會發生下列流程:

  1. 新的輸入連線來自螢幕 B 的輸入欄位。
  2. InputMethodManagerService 會檢查是否應核准連線。
  3. 已為輸入法編輯器選取螢幕。如果顯示器 B 支援顯示 IME 且允許顯示 IME,則會使用 B。否則,系統會選取主要裝置螢幕。
  4. 如果所選顯示器不是來自顯示器 A,則會重新建立連線。InputMethodService 會先刪除,然後再重新建立。

安全性限制

系統不會在非系統所擁有的虛擬螢幕上顯示 IME。這是因為惡意應用程式可能會建立虛擬顯示畫面,並啟用系統裝飾支援功能,從途徑讀取使用者敏感資訊,例如輸入預測內容和自訂背景。

實作

在 Android 9 (和以下版本) 中,輸入法編輯器僅適用於預設畫面,如「螢幕輸入法」一節所述。在 Android 10 (及以上版本) 中,使用者可以透過切換焦點,在不同螢幕上切換不同的輸入文字欄位,而輸入法編輯器視窗會移至次要螢幕。

WindowManager 中的實作項目會追蹤輸入法視窗 (繪製螢幕鍵盤的 IME 視窗) 和輸入法目標 (IME 輸入的視窗),以管理 IME 狀態。

對於 InputMethodManagerService (IMMS),沒有其他內建機制可將顯示變更傳播至 InputMethodService (IMS),並在將焦點移至其他螢幕時重新設定鍵盤配置。

為了在螢幕之間執行輸入法編輯器視窗切換,Android 10 會實作以下內容:

  • IME 和輸入目標視窗現在會在 DisplayContent#mInputMethodWindowDisplayContent#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 用戶端會取得正確的設定,並顯示正確的指標。