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

การอัปเดตที่ทำในส่วนที่เกี่ยวข้องกับโฆษณา Display โดยเฉพาะมีดังนี้

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

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

ในส่วนของจอแสดงผลที่แสดงแป้นพิมพ์เสมือนของตัวแก้ไขวิธีการป้อนข้อมูล (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) และ กำหนดค่ารูปแบบแป้นพิมพ์ใหม่ขณะรันไทม์เมื่อย้ายโฟกัสไปยังจอแสดงผลอื่น

Android 10 ได้ติดตั้งใช้งานสิ่งต่อไปนี้เพื่อให้หน้าต่าง IME สลับระหว่างจอแสดงผลได้

  • ตอนนี้ระบบจะติดตาม 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() เพื่อเริ่มต้นมุมมองอินพุตใหม่