輸入法編輯器支持

下面提供了這些特定於顯示的區域所做的更新:

Android 10 支援在非預設顯示器上執行的應用程式的軟體鍵盤

在非預設顯示器上運行的應用程式

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

  • 焦點應用程式出現在同一顯示器上。
  • 當焦點應用程式在非預設顯示器上運行時的預設顯示。
  • 根本沒有顯示。

系統根據焦點應用程式出現的顯示器的設定來決定使用哪種模式。有關更多詳細信息,請參閱:

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

圖 1.輔助顯示器上顯示的 IME 軟體鍵盤,包括目標應用程式

該系統使用單一 IME,但可以在顯示器之間切換以追蹤使用者焦點。 Android 10 自動要求所有第一方和第三方 IME 在建立時根據新的顯示尺寸修改佈局並調整大小。

如果顯示器 A 上存在活動連接,且輸入欄位請求顯示器 B 上的輸入焦點,則會發生以下流程:

  1. 新的輸入連線來自顯示器 B 上的輸入欄位。
  2. InputMethodManagerService檢查是否應批准連線。
  3. 為 IME 選擇顯示器。如果顯示器 B 支援顯示 IME 並且允許顯示它,則使用 B。否則,選擇主設備顯示。
  4. 如果所選顯示器不是來自顯示器 A,則重新建立連線。 InputMethodService被銷毀然後再次建立。

安全限制

系統不會在不屬於系統的虛擬顯示器上顯示 IME。這是由於安全問題,惡意應用程式可能會創建啟用系統裝飾支援的虛擬顯示器,並從表面讀取用戶敏感訊息,例如打字預測和自訂背景。

執行

在 Android 9(及更低版本)中,IME 僅在預設螢幕上可用,如螢幕輸入方法中所述。在 Android 10(及更高版本)中,使用者可以透過切換焦點在不同顯示器上的不同輸入文字欄位之間切換,並且 IME 視窗會移至輔助顯示器。

WindowManager中的實作追蹤輸入法視窗(繪製軟鍵盤的 IME 視窗)和輸入法目標(IME 輸入所在的視窗)來管理 IME 狀態。

對於InputMethodManagerService (IMMS),沒有其他內建機制可以將顯示變更傳播到InputMethodService (IMS),並在運行時將焦點移至另一個顯示器時重新配置鍵盤佈局。

為了實現 IME 視窗在顯示器之間切換,Android 10 實現了以下功能:

  • 現在,在DisplayContent#mInputMethodWindowDisplayContent#mInputMethodTarget中追蹤每個顯示器的 IME 和輸入目標窗口,以便 WindowManager (WM) 可以獨立於每個顯示器管理 IME 焦點狀態。
  • 在 IMMS 端,當透過ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus收到應用程式用戶端來自外部顯示器的焦點請求時,它首先解決目前輸入綁定法服務,然後重新綁定服務以重新附加新的IME onServiceConnected()中外部顯示器的視窗令牌。
  • 在IMS側,收到IMS#attachToken後,會發生以下流程:
    • 呼叫ContextImpl#updateDisplay來更新InputMethodService#attachToken()中服務上下文的顯示。這會呼叫ViewGroup#addView()來修改鍵盤佈局並適應目標顯示,檢查目前上下文。
    • 呼叫DisplayContent#setInputMethodWindowLocked()後,實作使用WindowProcessController將進程級顯示配置變更傳送至 IME 進程,以覆寫資源和顯示指標。
    • onConfigurationChanged()ViewGroup#addView()呼叫重新初始化輸入視圖之後, InputMethodService用戶端將獲得具有正確顯示指標的正確配置。