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

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

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 mặc định.

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

Về màn hình 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 giống với màn hình hiển thị ứng dụng được lấy tiêu điểm.
  • 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 mặc định.
  • Không hiển thị.

Hệ thống xác định chế độ sẽ 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 khi 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 duy nhất, nhưng có thể chuyển đổi giữa các màn hình để theo tiêu điểm của người dùng. Android 10 tự động dự kiến tất cả IME của bên thứ nhất và bên thứ ba sẽ 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 đầu vào yêu cầu tâm điểm đầu vào trên màn hình B, thì luồng sau sẽ xảy ra:

  1. Một kết nối đầu vào 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ị IME, thì 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 tạo lại.

Hạn chế bảo mật

Hệ thống sẽ không hiển thị IME trên màn hình ảo không thuộc sở hữu của hệ thống. Điều này là do mối 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 với tính năng hỗ trợ trang trí hệ thống được bật và đọc thông tin nhạy cảm của người dùng từ giao diện, chẳng hạn như nội dung dự đoán khi 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 bài viết 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 văn bản nhập trên các màn hình khác nhau bằng cách chuyển đổi 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 vẽ bàn phím mềm) và mục tiêu phương thức nhập (cửa sổ nơi nhập dữ liệu IME) để 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 thay đổi về màn hình đến InputMethodService (IMS) và định cấu hình lại bố cục bàn phím trong thời gian chạy khi di chuyển tiêu điểm sang một 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 các thao tác sau:

  • IME và cửa sổ mục tiêu đầu vào 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 nhận được yêu cầu lấy tiêu điểm của ứng dụng khách từ màn hình ngoài thông qua ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus, trước tiên, dịch vụ 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 đây 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à điều chỉnh cho phù hợp 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 hiển thị cấp quy trình bằng cách sử dụng WindowProcessController đến quy trình IME để ghi đè tài nguyên và chỉ số hiển thị.
    • Ứng dụng InputMethodService nhận được cấu hình chính xác với các chỉ số hiển thị chính xác sau onConfigurationChanged() và lệnh gọi ViewGroup#addView() để khởi động lại khung hiển thị đầu vào.