การอัปเดตที่ทำในพื้นที่เฉพาะการแสดงผลเหล่านี้มีดังต่อไปนี้:
Android 10 รองรับ แป้นพิมพ์ซอฟต์แวร์ สำหรับแอปที่ทำงานบนจอแสดงผลที่ไม่ใช่ค่าเริ่มต้น
แอพที่ทำงานบนจอแสดงผลที่ไม่ใช่ค่าเริ่มต้น
ในส่วนของจอแสดงผลที่แสดงแป้นพิมพ์ซอฟต์แวร์ของ Input Method Editor (IME) มีโหมดที่แตกต่างกัน แป้นพิมพ์ซอฟต์แวร์จะแสดงบน:
- จอแสดงผล เดียวกัน กับที่แอปที่โฟกัสปรากฏขึ้น
- การแสดงผล เริ่มต้น ในขณะที่แอปที่โฟกัสกำลังทำงานบนจอแสดงผลที่ไม่ใช่ค่าเริ่มต้น
- ไม่มี การแสดงผลเลย
ระบบจะกำหนดโหมดที่จะใช้ตามการตั้งค่าของจอแสดงผลที่แอปที่โฟกัสปรากฏขึ้น สำหรับรายละเอียดเพิ่มเติม โปรดดู:
-
WindowManager#setDisplayImePolicy()
-
WindowManager#getDisplayImePolicy()
รูปที่ 1 แป้นพิมพ์ซอฟต์แวร์ IME ตามที่ปรากฏบนจอแสดงผลรอง รวมถึงแอปเป้าหมาย
ระบบใช้ IME เดียว แต่สามารถสลับระหว่างจอแสดงผลเพื่อให้เป็นไปตามโฟกัสของผู้ใช้ Android 10 คาดหวัง IME ของบุคคลที่หนึ่งและบุคคลที่สามทั้งหมดโดยอัตโนมัติเพื่อแก้ไขเค้าโครงและปรับขนาดตามขนาดการแสดงผลใหม่เมื่อสร้างขึ้น
หากมีการเชื่อมต่อที่ใช้งานอยู่บนจอแสดงผล A และฟิลด์อินพุตร้องขอโฟกัสอินพุตบนจอแสดงผล B ขั้นตอนต่อไปนี้จะเกิดขึ้น:
- การเชื่อมต่ออินพุตใหม่มาจากช่องอินพุตบนจอแสดงผล B
-
InputMethodManagerService
ตรวจสอบว่าการเชื่อมต่อควรได้รับการอนุมัติหรือไม่ - มีการเลือกจอแสดงผลสำหรับ IME หากจอแสดงผล B รองรับการแสดง IME และได้รับอนุญาตให้แสดงได้ แสดงว่า B ถูกใช้ มิฉะนั้น ระบบจะเลือกการแสดงผลของอุปกรณ์หลัก
- หากจอแสดงผลที่เลือกไม่ได้มาจากจอแสดงผล A การเชื่อมต่อจะถูกสร้างขึ้นใหม่อีกครั้ง
InputMethodService
ถูกทำลายและสร้างใหม่อีกครั้ง
ข้อจำกัดด้านความปลอดภัย
ระบบจะไม่แสดง IME บนจอแสดงผลเสมือนที่ระบบไม่ได้เป็นเจ้าของ นี่เป็นเพราะข้อกังวลด้านความปลอดภัยที่แอปที่เป็นอันตรายสามารถสร้างจอแสดงผลเสมือนที่ รองรับการตกแต่งระบบ ที่เปิดใช้งาน และอ่านข้อมูลที่ละเอียดอ่อนของผู้ใช้จากพื้นผิว เช่น การคาดเดาการพิมพ์และพื้นหลังที่กำหนดเอง
การนำไปปฏิบัติ
ใน Android 9 (และต่ำกว่า) IME จะใช้งานได้บนหน้าจอเริ่มต้นเท่านั้น ตามที่อธิบายไว้ใน วิธีการป้อนข้อมูลบนหน้าจอ ใน Android 10 (และสูงกว่า) ผู้ใช้สามารถสลับระหว่างช่องข้อความอินพุตต่างๆ บนจอแสดงผลที่แตกต่างกันได้โดยการสลับโฟกัส และหน้าต่าง IME จะย้ายไปยังจอแสดงผลรอง
การใช้งานใน WindowManager
ติดตามหน้าต่างวิธีการป้อนข้อมูล (หน้าต่าง IME ที่วาดซอฟต์คีย์บอร์ด) และเป้าหมายวิธีการป้อนข้อมูล (หน้าต่างที่อินพุต IME ไป) เพื่อจัดการสถานะ IME
สำหรับ InputMethodManagerService
(IMMS) ไม่มีกลไกในตัวอื่นใดที่สามารถเผยแพร่การเปลี่ยนแปลงการแสดงผลเป็น InputMethodService
(IMS) และกำหนดค่าเค้าโครงแป้นพิมพ์ใหม่ในขณะรันไทม์เมื่อย้ายโฟกัสไปยังจอแสดงผลอื่น
เพื่อให้สลับหน้าต่าง IME ระหว่างจอแสดงผลได้ Android 10 จึงใช้สิ่งต่อไปนี้:
- ขณะนี้หน้าต่าง IME และเป้าหมายอินพุตได้รับการติดตามต่อจอแสดงผลใน
DisplayContent#mInputMethodWindow
และDisplayContent#mInputMethodTarget
เพื่อให้ WindowManager (WM) สามารถจัดการสถานะโฟกัส IME ได้อย่างอิสระจากแต่ละจอแสดงผล - ในด้าน IMMS เมื่อได้รับคำขอโฟกัสของไคลเอ็นต์แอปจากจอแสดงผลภายนอกผ่าน
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
ขั้นแรกจะยกเลิกการเชื่อมโยงบริการวิธีการป้อนข้อมูลปัจจุบัน จากนั้นจึงเชื่อมโยงบริการอีกครั้งเพื่อแนบ IME ใหม่อีกครั้ง โทเค็นหน้าต่างสำหรับจอแสดงผลภายนอกในonServiceConnected()
- ในด้าน IMS หลังจากได้รับ
IMS#attachToken
แล้ว โฟลว์ต่อไปนี้จะเกิดขึ้น:-
ContextImpl#updateDisplay
ถูกเรียกเพื่ออัปเดตการแสดงบริบทของบริการในInputMethodService#attachToken()
ซึ่งจะเรียกViewGroup#addView()
เพื่อแก้ไขเค้าโครงของแป้นพิมพ์และปรับให้เข้ากับการแสดงผลเป้าหมายที่ตรวจสอบบริบทปัจจุบัน - หลังจากเรียกใช้
DisplayContent#setInputMethodWindowLocked()
การใช้งานจะส่งการเปลี่ยนแปลงการกำหนดค่าการแสดงผลระดับกระบวนการโดยใช้กระบวนการWindowProcessController
ไปยัง IME เพื่อแทนที่ทรัพยากรและหน่วยวัดการแสดงผล - ไคลเอนต์
InputMethodService
ได้รับการกำหนดค่าที่ถูกต้องด้วยการวัดการแสดงผลที่ถูกต้องหลังจากonConfigurationChanged()
และการเรียกViewGroup#addView()
เพื่อเริ่มต้นมุมมองอินพุตใหม่
-