Dưới đây là những điểm cập nhật đối với các khu vực dành riêng cho quảng cáo hiển thị:
- Ứng dụng chạy trên màn hình không phải là màn hình mặc định
- Hỗ trợ trình chỉnh sửa phương thức nhập nhiều phiên
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à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:
- Cùng màn hình mà ứng dụng được lấy tiêu điểm xuất hiện.
- Chế độ hiển thị Mặc định trong khi ứng dụng được lấy tiêu điểm đang chạy trên một màn hình không phải là màn hình mặc định.
- Không hiển thị.
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, 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 duy nhất, 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ả cá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 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:
- 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.
InputMethodManagerService
kiểm tra xem có nên phê duyệt kết nối hay không.- 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 dùng. Nếu không, màn hình chính của thiết bị sẽ được chọn.
- Nếu màn hình đã 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ế bảo mật
Hệ thống sẽ không hiển thị IME trên những 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ừ màn hình, chẳng hạn như tính năng 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ần 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 nhiều màn hình bằng cách chuyển tiêu điểm và cửa sổ IME sẽ di chuyển đến 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à đích đến của phương thức nhập (cửa sổ nơi dữ liệu nhập của IME đi đến) để 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 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ột màn hình khác.
Để đạt được việc chuyển đổi cửa sổ IME giữa các màn hình, Android 10 triển khai những điều sau:
- Giờ đây, IME và cửa sổ đích nhập liệu được theo dõi theo từng màn hình trong
DisplayContent#mInputMethodWindow
vàDisplayContent#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 lấy tiêu điểm của ứng dụng khách từ màn hình 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 ngoài trongonServiceConnected()
. - 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ụ trongInputMethodService#attachToken()
. Thao tác này gọiViewGroup#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ụngWindowProcessController
cho quy trình IME để ghi đè tài nguyên và chỉ số hiển thị. - Ứng dụng
InputMethodService
sẽ 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 khionConfigurationChanged()
và lệnh gọiViewGroup#addView()
để khởi động lại khung hiển thị đầu vào.