輸入法編輯器支援

以下是這些顯示器專屬區域的更新內容:

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

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

至於要在哪個螢幕上顯示輸入法編輯器 (IME) 的軟體鍵盤,則有不同模式。軟體鍵盤會顯示在:

  • 相同:顯示焦點應用程式的螢幕。
  • 在非預設螢幕上執行焦點應用程式時,預設顯示畫面。
  • 完全不會顯示。

系統會根據顯示器設定,決定要使用哪種模式。詳情請參閱:

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

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

系統會使用單一輸入法編輯器,但可根據使用者焦點在不同螢幕間切換。Android 10 會自動要求所有第一方和第三方 IME 在建立時,根據新的螢幕大小修訂版面配置並調整大小。

如果螢幕 A 上有連線處於啟用狀態,且輸入欄位要求螢幕 B 上的輸入焦點,則會發生下列流程:

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

安全性限制

系統不會在不屬於系統的虛擬螢幕上顯示 IME。這是因為惡意應用程式可能會建立啟用系統裝飾支援的虛擬螢幕,並從介面讀取使用者私密資訊,例如輸入預測和自訂背景,因此有安全疑慮。

實作

在 Android 9 以下版本中,輸入法編輯器只能在預設畫面上使用,如「螢幕上輸入法」一文所述。在 Android 10 以上版本中,使用者可以切換焦點,在不同螢幕上的不同輸入文字欄位之間切換,輸入法編輯器視窗也會移至次要螢幕。

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

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

為在不同螢幕間切換 IME 視窗,Android 10 實作了下列項目:

  • 現在系統會根據 DisplayContent#mInputMethodWindowDisplayContent#mInputMethodTarget 追蹤每個螢幕的 IME 和輸入目標視窗,因此 WindowManager (WM) 可以獨立管理每個螢幕的 IME 焦點狀態。
  • 在 IMMS 端,當應用程式用戶端的焦點要求透過 ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus 從外部螢幕收到時,系統會先取消繫結目前的輸入法服務,然後重新繫結服務,以便在 onServiceConnected() 中重新附加外部螢幕的新輸入法編輯器視窗權杖。
  • 在 IMS 端,收到 IMS#attachToken 後,會發生下列流程:
    • ContextImpl#updateDisplay 會呼叫 InputMethodService#attachToken(),更新服務環境的顯示畫面。這會呼叫 ViewGroup#addView() 修訂鍵盤版面配置,並檢查目前環境,以配合目標螢幕。
    • 呼叫 DisplayContent#setInputMethodWindowLocked() 後,實作會使用 WindowProcessController 將程序層級的顯示設定變更傳送至 IME 程序,以覆寫資源和顯示指標。
    • InputMethodService 用戶端會在 onConfigurationChanged()ViewGroup#addView() 呼叫後,取得正確的設定和顯示指標,重新初始化輸入檢視區塊。