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

Các cập nhật được thực hiện cho các khu vực dành riêng cho màn hình này được cung cấp bên dưới:

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

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

Về phần 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 liệu (IME), có nhiều chế độ khác nhau. Bàn phím phần mềm được hiển thị trên:

  • Cùng một màn hình nơi ứng dụng được tập trung xuất hiện.
  • Hiển thị mặc định trong khi ứng dụng tập trung đang chạy trên màn hình không phải mặc định.
  • Không có hiển thị nào cả.

Hệ thống xác định chế độ nào sẽ sử dụng dựa trên cài đặt của màn hình nơi ứng dụng được tập trung xuất hiện. Để biết thêm chi tiết, 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 đích

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 dõi trọng tâ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à thay đổi kích thước theo kích thước hiển thị mới khi được tạo.

Nếu có kết nối đang hoạt động trên màn hình A và trường đầu vào yêu cầu tiêu điểm đầu vào trên màn hình B thì quy trình sau sẽ xảy ra:

  1. Một kết nối đầu vào mới đến từ trường đầu vào trên màn hình B.
  2. InputMethodManagerService kiểm tra xem kết nối có được chấp thuận 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ị nó 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 đã chọn không phải từ màn hình A thì kết nối sẽ được thiết lập lại. InputMethodService bị hủy và sau đó được 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 quyền 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ột 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 với người dùng từ bề mặt, chẳng hạn như dự đoán khi nhập và hình nền tùy chỉnh.

Thực hiện

Trong Android 9 (và phiên bản thấp hơn), IME chỉ khả dụng trên màn hình mặc định, như được 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 văn bản nhập khác nhau trên các màn hình khác nhau bằng cách chuyển tiêu điểm và cửa sổ IME di chuyển sang màn hình phụ.

Việc 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 nhập 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 hiển thị 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 di chuyển tiêu điểm sang màn hình khác.

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

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