รองรับตัวแก้ไขวิธีการป้อนข้อมูล

การอัปเดตที่ทำในพื้นที่เฉพาะการแสดงผลเหล่านี้มีดังต่อไปนี้:

Android 10 รองรับ แป้นพิมพ์ซอฟต์แวร์ สำหรับแอปที่ทำงานบนจอแสดงผลที่ไม่ใช่ค่าเริ่มต้น

แอพที่ทำงานบนจอแสดงผลที่ไม่ใช่ค่าเริ่มต้น

ในส่วนของจอแสดงผลที่แสดงแป้นพิมพ์ซอฟต์แวร์ของ Input Method Editor (IME) มีโหมดที่แตกต่างกัน แป้นพิมพ์ซอฟต์แวร์จะแสดงบน:

  • จอแสดงผล เดียวกัน กับที่แอปที่โฟกัสปรากฏขึ้น
  • การแสดงผล เริ่มต้น ในขณะที่แอปที่โฟกัสกำลังทำงานบนจอแสดงผลที่ไม่ใช่ค่าเริ่มต้น
  • ไม่มี การแสดงผลเลย

ระบบจะกำหนดโหมดที่จะใช้ตามการตั้งค่าของจอแสดงผลที่แอปที่โฟกัสปรากฏขึ้น สำหรับรายละเอียดเพิ่มเติม โปรดดู:

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

รูปที่ 1 แป้นพิมพ์ซอฟต์แวร์ IME ตามที่ปรากฏบนจอแสดงผลรอง รวมถึงแอปเป้าหมาย

ระบบใช้ IME เดียว แต่สามารถสลับระหว่างจอแสดงผลเพื่อให้เป็นไปตามโฟกัสของผู้ใช้ Android 10 คาดหวัง IME ของบุคคลที่หนึ่งและบุคคลที่สามทั้งหมดโดยอัตโนมัติเพื่อแก้ไขเค้าโครงและปรับขนาดตามขนาดการแสดงผลใหม่เมื่อสร้างขึ้น

หากมีการเชื่อมต่อที่ใช้งานอยู่บนจอแสดงผล A และฟิลด์อินพุตร้องขอโฟกัสอินพุตบนจอแสดงผล B ขั้นตอนต่อไปนี้จะเกิดขึ้น:

  1. การเชื่อมต่ออินพุตใหม่มาจากช่องอินพุตบนจอแสดงผล B
  2. InputMethodManagerService ตรวจสอบว่าการเชื่อมต่อควรได้รับการอนุมัติหรือไม่
  3. มีการเลือกจอแสดงผลสำหรับ IME หากจอแสดงผล B รองรับการแสดง IME และได้รับอนุญาตให้แสดงได้ แสดงว่า B ถูกใช้ มิฉะนั้น ระบบจะเลือกการแสดงผลของอุปกรณ์หลัก
  4. หากจอแสดงผลที่เลือกไม่ได้มาจากจอแสดงผล 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() เพื่อเริ่มต้นมุมมองอินพุตใหม่