Hỗ trợ trình chỉnh sửa phương thức nhập

Dưới đây là thông tin cập nhật về các khu vực dành riêng cho màn hình:

Android 10 hỗ trợ bàn phím phần mềm cho các ứng dụng chạy trên màn hình không phải là màn hình mặc định.

Ứng dụng chạy trên màn hình không phải là màn hình mặc định

Về việc màn hình nào hiển thị bàn phím phần mềm của Trình chỉnh sửa phương thức nhập (IME), có nhiều chế độ. Bàn phím phần mềm xuất hiện trên:

  • Màn hình tương tự mà ứng dụng được lấy tiêu điểm xuất hiện.
  • Màn hình mặc định trong khi ứng dụng được lấy tiêu điểm đang chạy trên màn hình không phải là màn hình mặc định.
  • Không có màn hình nào cả.

Hệ thống xác định chế độ cần sử dụng dựa trên chế độ cài đặt của màn hình mà ứng dụng được lấy tiêu điểm xuất hiện. Để biết thêm thông tin chi tiết, hãy xem:

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

Hình 1. Bàn phím phần mềm IME xuất hiện trên màn hình phụ, bao gồm cả ứng dụng mục tiêu

Hệ thống sử dụng một IME, nhưng có thể chuyển đổi giữa các màn hình để theo dõi tiêu điểm của người dùng. Android 10 tự động yêu cầu tất cả IME của bên thứ nhất và bên thứ ba sửa đổi bố cục và đổi kích thước theo kích thước màn hình mới khi được tạo.

Nếu có một kết nối đang hoạt động trên màn hình A và một trường nhập dữ liệu yêu cầu tiêu điểm nhập trên màn hình B, thì quy trình sau sẽ diễn ra:

  1. Một kết nối nhập mới đến từ trường nhập trên màn hình B.
  2. InputMethodManagerService kiểm tra xem có nên phê duyệt kết nối hay không.
  3. Một màn hình được chọn cho IME. Nếu màn hình B hỗ trợ hiển thị IME và được phép hiển thị, thì màn hình B sẽ được sử dụng. Nếu không, màn hình thiết bị chính sẽ được chọn.
  4. Nếu màn hình được chọn không phải là màn hình A, thì kết nối sẽ được thiết lập lại. InputMethodService bị huỷ rồi được tạo lại.

Hạn chế về bảo mật

Hệ thống sẽ không hiển thị IME trên các màn hình ảo không thuộc sở hữu của hệ thống. Điều này là do lo ngại về bảo mật rằng một ứng dụng độc hại có thể tạo màn hình ảo có hỗ trợ trang trí hệ thống và đọc thông tin nhạy cảm của người dùng từ giao diện, chẳng hạn như dự đoán nội dung nhập và hình nền tuỳ chỉnh.

Triển khai

Trong Android 9 (trở xuống), IME chỉ có trên màn hình mặc định, như mô tả trong Phương thức nhập trên màn hình. Trong Android 10 (trở lên), người dùng có thể chuyển đổi giữa các trường nhập văn bản trên các màn hình bằng cách chuyển tiêu điểm và cửa sổ IME sẽ chuyển sang màn hình phụ.

Quá trình triển khai trong WindowManager theo dõi cửa sổ phương thức nhập (cửa sổ IME nơi bàn phím mềm được vẽ) và mục tiêu phương thức nhập (cửa sổ nơi nội dung nhập IME đi vào) để quản lý trạng thái IME.

Đối với InputMethodManagerService (IMMS), không có cơ chế tích hợp nào khác có thể truyền bá thay đổi màn hình sang InputMethodService (IMS) và định cấu hình lại bố cục bàn phím trong thời gian chạy khi chuyển tiêu điểm sang màn hình khác.

Để chuyển đổi cửa sổ IME giữa các màn hình, Android 10 triển khai như sau:

  • Cửa sổ IME và mục tiêu nhập hiện được theo dõi theo từng màn hình trong DisplayContent#mInputMethodWindowDisplayContent#mInputMethodTarget, để WindowManager (WM) có thể quản lý trạng thái tiêu điểm IME độc lập với từng màn hình.
  • Về phía IMMS, khi yêu cầu tiêu điểm của ứng dụng khách từ màn hình bên ngoài được nhận thông qua ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus, trước tiên, yêu cầu này sẽ huỷ liên kết dịch vụ phương thức nhập hiện tại, sau đó liên kết lại dịch vụ để đính kèm lại mã thông báo cửa sổ IME mới cho màn hình bên ngoài trong onServiceConnected().
  • Về phía IMS, sau khi nhận được IMS#attachToken, quy trình sau sẽ diễn ra:
    • ContextImpl#updateDisplay được gọi để cập nhật màn hình của ngữ cảnh dịch vụ trong InputMethodService#attachToken(). Thao tác này sẽ gọi ViewGroup#addView() để sửa đổi bố cục của bàn phím và thích ứng với màn hình mục tiêu bằng cách kiểm tra ngữ cảnh hiện tại.
    • Sau khi DisplayContent#setInputMethodWindowLocked() được gọi, quá trình triển khai sẽ gửi các thay đổi về cấu hình màn hình ở cấp quy trình bằng WindowProcessController đến quy trình IME để ghi đè các tài nguyên và chỉ số màn hình.
    • Ứng dụng khách InputMethodService sẽ nhận được cấu hình chính xác với các chỉ số màn hình chính xác sau khi onConfigurationChanged() và lệnh gọi ViewGroup#addView() để khởi động lại khung hiển thị nhập.