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

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

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

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

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

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

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

  • DisplayWindowSettings#shouldShowImeLocked()
  • DisplayWindowSettings#setShouldShowImeLocked()

รูปที่ 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 DisplayContent#mInputMethodTarget เพื่อให้ WindowManager (WM) สามารถจัดการสถานะการโฟกัส IME แยกจากกันของแต่ละจอแสดงผล
  • ทางฝั่ง IMMS เมื่อได้รับคำขอโฟกัสของไคลเอ็นต์แอปจากจอแสดงผลภายนอกผ่าน ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus อันดับแรก จะยกเลิกการเชื่อมโยงบริการวิธีการป้อนข้อมูลปัจจุบัน จากนั้นจึงเชื่อมโยงบริการใหม่กับ I โทเค็นหน้าต่างสำหรับจอแสดงผลภายนอกใน onServiceConnected()
  • ทางฝั่ง IMS หลังจากได้รับ IMS#attachToken ลว์ต่อไปนี้จะเกิดขึ้น:
    • ContextImpl#updateDisplay ถูกเรียกให้อัปเดตการแสดงบริบทของบริการใน InputMethodService#attachToken() สิ่งนี้เรียก ViewGroup#addView() เพื่อแก้ไขเลย์เอาต์ของคีย์บอร์ดและปรับให้เข้ากับการแสดงผลเป้าหมายที่ตรวจสอบบริบทปัจจุบัน
    • หลังจาก DisplayContent#setInputMethodWindowLocked() ถูกเรียก การใช้งานจะส่งการเปลี่ยนแปลงการกำหนดค่าการแสดงผลระดับกระบวนการโดยใช้ WindowProcessController ไปยังกระบวนการ IME เพื่อแทนที่ทรัพยากรและแสดงเมตริก
    • ไคลเอ็นต์ InputMethodService ได้รับการกำหนดค่าที่ถูกต้องพร้อมเมตริกการแสดงผลที่ถูกต้องหลังจาก onConfigurationChanged() และการ ViewGroup#addView() เพื่อเริ่มต้นมุมมองอินพุตใหม่

รองรับตัวแก้ไขวิธีการป้อนข้อมูลแบบหลายเซสชัน

การใช้งานอุปกรณ์ที่มีจอแสดงผลหลายจอที่คาดว่าจะใช้พร้อมกันโดยผู้ใช้หลายรายเพื่อจัดหาแหล่งอินพุตที่เหมาะสม สามารถกำหนดค่าให้แสดงตัวแก้ไขวิธีการป้อนข้อมูล (IME) หลายตัวพร้อมกันได้มากสุดหนึ่งรายการต่อจอแสดงผล ตัวเลขสองรูปต่อไปนี้แสดงตัวอย่าง IME แบบหลายเซสชันบนจอแสดงผลสองจอ:

รูปที่ 2 ตัวอย่าง IME แบบหลายเซสชัน

รูปที่ 3 ตัวอย่าง IME แบบหลายเซสชัน

การรองรับ โฟกัสต่อการแสดงผล เป็นข้อกำหนดเบื้องต้นสำหรับฟีเจอร์นี้ มิฉะนั้น จะไม่สามารถเปิดใช้งานคุณลักษณะนี้ได้ เนื่องจากข้อจำกัดด้านความปลอดภัย การจำกัดโฟกัสต่อการแสดงผลจึงจำกัดคุณลักษณะนี้ไว้เฉพาะอุปกรณ์ชุดย่อย

ใน Android 10 จะมีการรองรับ IME แบบหลายเซสชันด้วยบริการระบบที่แยกจากกันซึ่งมีชุด API ที่แตกต่างกันและฟังก์ชันการทำงานที่ลดลง IME แบบหลายเซสชันเข้ากันไม่ได้กับ IME ที่มีอยู่ สามารถใช้หลายเซสชันหรือบริการเซสชันเดียวได้ แต่ไม่ใช่ทั้งสองอย่าง

ไม่สามารถใช้ IME ของ Android ที่มีอยู่ซึ่งสร้างบนคลาส InputMethodService ได้ เนื่องจากมีการตั้งสมมติฐานว่าไคลเอ็นต์ IME ตัวเดียวสามารถโฟกัสได้พร้อมๆ กันก่อนที่จะมีการเปิดตัว Android IME API ใน Android 1.5 และ API สาธารณะจำนวนมากใน InputMethodService มี อาศัยสมมติฐานนั้นอย่างมากแล้ว อย่างไรก็ตาม การอัปเดตคลาส InputMethodService เพื่อรองรับสถานการณ์จำลองหลายไคลเอนต์นั้นท้าทายเพราะ:

  1. การทำเช่นนี้จะทำให้เกิดความซับซ้อนในปริมาณที่ยอมรับไม่ได้ใน InputMethodService ซึ่งรักษาได้ยากอยู่แล้ว
  2. นักพัฒนา IME ยังคงต้องอัปเดตการนำไปใช้เพื่อให้สามารถรองรับคำขอแบบขนานจากไคลเอนต์ IME ที่เน้นหลายตัว ซึ่งอาจต้องมีการออกแบบใหม่ที่ไม่น่าสนใจในด้านของพวกเขา (เช่น ตัวถอดรหัสอินพุตและฐานข้อมูลประวัติการพิมพ์)
  3. กรณีการใช้งานจริงสำหรับไคลเอนต์ multi-IME คาดว่าจะพัฒนาอย่างรวดเร็ว ดังนั้นโปรโตคอลใหม่จึงไม่เสถียรและไม่พร้อมที่จะเปิดเผยเป็น API สาธารณะ

เช่นเดียวกับ IME แบบเซสชันเดียว (ปกติ) การควบคุมการแสดง IME บนจอแสดงผลแต่ละจอจะดำเนินการโดยใช้ DisplayWindowSettings

มีตัวอย่าง IME แบบหลายเซสชันอยู่ที่ development/samples/MultiClientInputMethod

วิธีทดสอบ IME แบบหลายเซสชัน:

  1. ตั้งค่า config_perDisplayFocusEnabled true
  2. รันคำสั่งเหล่านี้:
    1. $ make -j MultiClientInputMethod
    2. $ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
    3. $ adb root
    4. $ adb shell setprop persist.debug.multi_client_ime \
      com.example.android.multiclientinputmethod/.MultiClientInputMethod
    5. $ adb reboot
  3. ลองใช้สถานการณ์การป้อนข้อความหลายแบบ

การดำเนินการ

ดู MultiClientInputMethodManagerService สำหรับรายละเอียดการใช้งาน