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

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

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

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() เพื่อเริ่มต้นมุมมองอินพุตใหม่