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

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

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

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

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