การรองรับการแสดงผล

การอัปเดตเกี่ยวกับพื้นที่ที่แสดงผลโดยเฉพาะมีดังต่อไปนี้

ปรับขนาดกิจกรรมและจอแสดงผล

หากต้องการระบุว่าแอปอาจไม่รองรับโหมดหลายหน้าต่างหรือการปรับขนาด กิจกรรมใช้แอตทริบิวต์ resizeableActivity=false ทั่วไป ปัญหาที่พบเมื่อปรับขนาดกิจกรรม ได้แก่

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

ใน Android 7 (ขึ้นไป) คุณสามารถตั้งค่าแอป resizeableActivity=falseเพื่อให้ทำงานในโหมดเต็มหน้าจอเสมอ ใน ในกรณีนี้ แพลตฟอร์มจะป้องกันไม่ให้แยกกิจกรรมที่ปรับขนาดไม่ได้ บนหน้าจอ หากผู้ใช้พยายามเรียกใช้กิจกรรมที่ปรับขนาดไม่ได้จาก Launcher เมื่ออยู่ในโหมดแยกหน้าจออยู่แล้ว แพลตฟอร์มจะออกจากโหมดแยกหน้าจอ เปิดกิจกรรมที่ปรับขนาดไม่ได้ในโหมดเต็มหน้าจอ

แอปที่ตั้งค่าแอตทริบิวต์นี้เป็น false อย่างชัดเจนใน ไฟล์ Manifest ต้องไม่เปิดขึ้นในโหมดหลายหน้าต่าง ยกเว้นกรณีที่สามารถใช้งานร่วมกัน ใช้โหมด:

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

ใน Android 10 แพลตฟอร์มนี้ยังคงป้องกัน กิจกรรมที่ปรับขนาดไม่ได้ ตั้งแต่การเข้าสู่โหมดแยกหน้าจอ แต่ก็อาจทำได้ ปรับขนาดชั่วคราวหากกิจกรรมมีการประกาศการวางแนวหรือลักษณะคงที่ หากไม่ กิจกรรมจะปรับขนาดเพื่อแสดงเต็มหน้าจอเหมือนใน Android 9 และต่ำกว่า

การใช้งานเริ่มต้นจะใช้นโยบายต่อไปนี้

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

  • มีการวางแนวตายตัวเมื่อใช้ android:screenOrientation
  • แอปมีสัดส่วนภาพสูงสุดหรือต่ำสุดเริ่มต้นตามระดับ API การกำหนดเป้าหมาย หรือประกาศสัดส่วนภาพอย่างชัดแจ้ง

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

เมื่อกางอุปกรณ์ออก การกำหนดค่า ขนาด และสัดส่วนภาพ กิจกรรมไม่มีการเปลี่ยนแปลง แต่ตัวเลือกในการเริ่มกิจกรรมใหม่จะปรากฏ

เมื่อไม่ได้ตั้งค่า resizeableActivity (หรือตั้งค่าเป็น true) แอปรองรับการปรับขนาดอย่างเต็มรูปแบบ

การใช้งาน

เราจะเรียกกิจกรรมซึ่งปรับขนาดไม่ได้ซึ่งมีการวางแนวหรืออัตราส่วนคงที่เรียกว่า โหมดความเข้ากันได้กับขนาด (SCM) ในโค้ด เงื่อนไขจะกำหนดไว้ใน ActivityRecord#shouldUseSizeCompatMode() เมื่อกิจกรรม SCM เปิดตัว การกำหนดค่าที่เกี่ยวข้องกับหน้าจอ (เช่น ขนาดหรือความหนาแน่น) คงที่ ในการกำหนดค่าการลบล้างที่ขอ กิจกรรมจึงไม่เกี่ยวข้องอีกต่อไป ในการกำหนดค่าการแสดงผลปัจจุบัน

ถ้ากิจกรรม SCM ไม่สามารถแสดงเต็มหน้าจอ กิจกรรมนั้นจะอยู่ในแนวบนสุด อยู่กึ่งกลางในแนวนอน ขอบเขตของกิจกรรมจะคำนวณตาม AppWindowToken#calculateCompatBoundsTransformation()

เมื่อกิจกรรม SCM ใช้การกำหนดค่าหน้าจอที่ต่างจากกิจกรรม SCM คอนเทนเนอร์ (เช่น ปรับขนาดจอแสดงผลหรือกิจกรรมย้ายไปยังรายการอื่น การแสดงผล) ActivityRecord#inSizeCompatMode() เป็นจริงและ SizeCompatModeActivityController (ใน UI ของระบบ) ได้รับ Callback เพื่อแสดงปุ่มรีสตาร์ทกระบวนการ

ขนาดการแสดงผลและสัดส่วนภาพ

Android 10 รองรับสัดส่วนภาพใหม่ ตั้งแต่อัตราส่วนหน้าจอยาวและบาง ไปจนถึง 1:1 แอปสามารถกำหนดได้ ApplicationInfo#maxAspectRatio และ ApplicationInfo#minAspectRatio ของหน้าจอ สามารถจัดการได้

อัตราส่วนแอปใน Android 10

รูปที่ 1 ตัวอย่างอัตราส่วนของแอปที่รองรับใน Android 10 คน

การใช้งานอุปกรณ์อาจมีจอแสดงผลรองที่มีขนาดและ ความละเอียดที่น้อยกว่าที่ Android 9 กำหนด และต่ำกว่า (ขั้นต่ำ 2.5 ความกว้างหรือความสูงอย่างน้อย 320 DP สำหรับsmallestScreenWidth) แต่คุณจะวางได้เฉพาะกิจกรรมที่เลือกใช้การสนับสนุนจอแสดงผลขนาดเล็กเหล่านี้เท่านั้น จากที่นั่น

แอปสามารถเลือกใช้ได้โดยประกาศขนาดที่รองรับขั้นต่ำซึ่งเล็กกว่า หรือเท่ากับขนาดการแสดงผลเป้าหมาย ใช้ android:minHeight และ แอตทริบิวต์รูปแบบกิจกรรม android:minWidth ใน AndroidManifest เพื่อทำเช่นนั้น

นโยบายดิสเพลย์

Android 10 แยกและขยับการแสดงผลบางอย่าง นโยบายจากการใช้งาน WindowManagerPolicy เริ่มต้นใน PhoneWindowManager ไปยังคลาสต่อการแสดงผล เช่น

  • สถานะการแสดงผลและการหมุน
  • แป้นบางแป้นและการติดตามกิจกรรมการเคลื่อนไหว
  • UI ของระบบและหน้าต่างการตกแต่ง

ใน Android 9 (หรือต่ำกว่า) ชั้นเรียน PhoneWindowManager จะมีการจัดการ แสดงนโยบาย สถานะและการตั้งค่า การหมุน กรอบหน้าต่างการตกแต่ง การติดตาม และอื่นๆ Android 10 ย้ายข้อมูลส่วนใหญ่ไปยัง คลาส DisplayPolicy ยกเว้นการติดตามการหมุนเวียน ซึ่งมี ถูกย้ายไปที่ DisplayRotation

การตั้งค่าหน้าต่างที่แสดง

ใน Android 10 การกำหนดค่าต่อจอแสดงผล เราได้ขยายการตั้งค่ากรอบเวลาให้ครอบคลุมรายการต่อไปนี้

  • โหมดการจัดกรอบการแสดงผลเริ่มต้น
  • ค่าโอเวอร์สแกน
  • โหมดการหมุนและการหมุนผู้ใช้
  • โหมดบังคับขนาด ความหนาแน่น และโหมดการปรับขนาด
  • โหมดการนำเนื้อหาออก (เมื่อนำการแสดงผลออก)
  • การสนับสนุนสำหรับการตกแต่งระบบและ IME

ชั้นเรียน DisplayWindowSettings มีการตั้งค่าสำหรับรายการเหล่านี้ ตัวเลือก เก็บอยู่ในดิสก์ในพาร์ติชัน /data ใน display_settings.xml ทุกครั้งที่เปลี่ยนการตั้งค่า สำหรับ โปรดดูรายละเอียดที่ DisplayWindowSettings.AtomicFileStorage และ DisplayWindowSettings#writeSettings() ผู้ผลิตอุปกรณ์สามารถ ระบุค่าเริ่มต้นสำหรับอุปกรณ์ของบุตรหลานเป็น display_settings.xml การกำหนดค่า แต่เนื่องจากไฟล์ดังกล่าวเก็บอยู่ใน /data อาจจำเป็นต้องใช้ตรรกะเพิ่มเติมเพื่อกู้คืนไฟล์หากถูกลบโดยการล้างข้อมูล

โดยค่าเริ่มต้น Android 10 จะใช้ DisplayInfo#uniqueId เป็นตัวระบุสำหรับจอแสดงผลเมื่อยืนยัน การตั้งค่า ควรป้อนข้อมูล uniqueId สำหรับจอแสดงผลทั้งหมด ใน นอกจากนี้ ยังมีความเสถียรสำหรับการแสดงผลในเครือข่ายและทางกายภาพด้วย นอกจากนี้คุณยังสามารถ ใช้พอร์ตของอุปกรณ์แสดงผลจริงเป็นตัวระบุ ซึ่งสามารถตั้งค่าใน DisplayWindowSettings#mIdentifier การตั้งค่าทั้งหมดทุกครั้งที่เขียน เขียนขึ้นเพื่อให้อัปเดตคีย์ที่ใช้สำหรับรายการที่แสดงผลใน พื้นที่เก็บข้อมูล โปรดดูรายละเอียดที่หัวข้อ ตัวระบุโฆษณาแบบดิสเพลย์แบบคงที่

การตั้งค่าจะยังคงอยู่ในไดเรกทอรี /data สำหรับข้อมูลย้อนหลัง เหตุผล เดิมทีฟังก์ชันนี้จะใช้เพื่อยืนยันการตั้งค่าที่ผู้ใช้ตั้งไว้ เช่น การหมุนจอแสดงผล

ตัวระบุโฆษณาแบบดิสเพลย์แบบคงที่

Android 9 (และต่ำกว่า) ไม่มีตัวระบุที่เสถียรสำหรับจอแสดงผลใน เมื่อมีการเพิ่มจอแสดงผลลงในระบบ Display#mDisplayId หรือ DisplayInfo#displayId เดิมคือ ที่สร้างขึ้นสำหรับจอแสดงผลนั้นโดยเพิ่มตัวนับแบบคงที่ หากระบบ เพิ่มและนำจอแสดงผลเดียวกันออก ทำให้เกิดรหัสที่แตกต่างกัน

หากอุปกรณ์มีจอแสดงผลหลายจอที่พร้อมใช้งานตั้งแต่เปิดเครื่อง จอแสดงผลอาจ กำหนดตัวระบุที่แตกต่างกัน โดยขึ้นอยู่กับช่วงเวลา ขณะที่ Android 9 (และ ก่อนหน้านี้) รวม DisplayInfo#uniqueId ซึ่งมีข้อมูลไม่เพียงพอ ในการแยกความแตกต่างระหว่างจอแสดงผล เนื่องจากจอแสดงผลทางกายภาพ ที่ระบุเป็น local:0 หรือ local:1 เพื่อแสดงถึง จอแสดงผลในตัวและภายนอก

การเปลี่ยนแปลงของ Android 10 DisplayInfo#uniqueId เพื่อเพิ่มตัวระบุแบบคงที่ และเพื่อแยกความแตกต่างระหว่างเครือข่ายภายใน เครือข่าย และ จอแสดงผลเสมือน

ประเภทการแสดงผล รูปแบบ
ในพื้นที่
local:<stable-id>
เครือข่าย
network:<mac-address>
ออนไลน์
virtual:<package-name-and-name>

นอกจากการอัปเดต uniqueId แล้ว DisplayInfo.address มี DisplayAddress, ตัวระบุที่แสดงซึ่งคงที่เมื่อรีบูต ใน Android 10, DisplayAddress รองรับอุปกรณ์จริง และเครือข่าย DisplayAddress.Physical มีแท็ก รหัสที่แสดง (เหมือนกับใน uniqueId) และสามารถสร้างด้วย DisplayAddress#fromPhysicalDisplayId()

Android 10 ยังมอบวิธีการที่สะดวกในการ ข้อมูลพอร์ต (Physical#getPort()) วิธีการนี้ใช้ใน ของกรอบที่ต้องการระบุ จอแสดงผลแบบคงที่ ตัวอย่างเช่น ใช้ใน DisplayWindowSettings) วันที่ DisplayAddress.Network มีที่อยู่ MAC และสามารถสร้างด้วย DisplayAddress#fromMacAddress()

ส่วนเพิ่มเติมเหล่านี้ช่วยให้ผู้ผลิตอุปกรณ์ระบุจอแสดงผลแบบคงที่ได้ การตั้งค่าแบบหลายจอแสดงผลและเพื่อกำหนดการตั้งค่าระบบและฟีเจอร์ต่างๆ โดยใช้ตัวระบุการแสดงผลแบบคงที่ เช่น พอร์ตสำหรับจอแสดงผลจริง เหล่านี้ จะซ่อนไว้และมีไว้เพื่อใช้ภายใน system_server

จากรหัส Display ของ HWC (ซึ่งอาจเป็นแบบทึบและไม่เสถียรเสมอไป) จะแสดงหมายเลขพอร์ต 8 บิต (เฉพาะแพลตฟอร์ม) ที่ระบุ ตัวเชื่อมสายสำหรับการแสดงเอาต์พุต ตลอดจน BLOB EDID ของจอแสดงผล SurfaceFlinger จะดึงข้อมูลผู้ผลิตหรือรุ่นจาก EDID เพื่อ สร้างรหัสการแสดงผล 64 บิตที่เสถียรซึ่งเห็นในเฟรมเวิร์ก หากวิธีนี้ ไม่ได้รับการสนับสนุนหรือเกิดข้อผิดพลาด SurfaceFlinger จะกลับไปใช้โหมด MD แบบเดิม โดยที่ DisplayInfo#address เป็นค่าว่างและ DisplayInfo#uniqueId เป็นแบบฮาร์ดโค้ดตามที่อธิบายไว้ข้างต้น

หากต้องการยืนยันว่าระบบรองรับฟีเจอร์นี้ ให้เรียกใช้คำสั่งต่อไปนี้

$ dumpsys SurfaceFlinger --display-id
# Example output.
Display 21691504607621632 (HWC display 0): port=0 pnpId=SHP displayName="LQ123P1JX32"
Display 9834494747159041 (HWC display 2): port=1 pnpId=HWP displayName="HP Z24i"
Display 1886279400700944 (HWC display 1): port=2 pnpId=AUS displayName="ASUS MB16AP"

ใช้จอแสดงผลมากกว่า 2 จอ

ใน Android 9 (และต่ำกว่า), SurfaceFlinger และ DisplayManagerService สันนิษฐานว่ามีจอแสดงผลจริงอย่างมากสองจอที่มีรหัสแบบฮาร์ดโค้ดเป็น 0 และ 1.

สำหรับ Android 10 เป็นต้นไป SurfaceFlinger สามารถใช้ประโยชน์ Computer Composer (HWC) API เพื่อสร้างรหัสการแสดงผลแบบคงที่ซึ่งจะช่วยให้จัดการได้ จำนวนอุปกรณ์แสดงผลได้ตามใจชอบ ดูข้อมูลเพิ่มเติมได้ที่ ตัวระบุโฆษณาแบบดิสเพลย์แบบคงที่

เฟรมเวิร์กสามารถค้นหาโทเค็น IBinder สำหรับอุปกรณ์จริง แสดงผ่าน SurfaceControl#getPhysicalDisplayToken หลังจากได้รับ ID การแสดงผล 64 บิตจาก SurfaceControl#getPhysicalDisplayIds หรือ จากเหตุการณ์ HotPlug ของ DisplayEventReceiver

ใน Android 10 (และต่ำกว่า) จอแสดงผลภายในหลักคือ TYPE_INTERNAL และจอแสดงผลรองทั้งหมดได้รับแจ้งเป็น TYPE_EXTERNAL โดยไม่คำนึงถึงประเภทการเชื่อมต่อ ดังนั้น จอแสดงผลภายในเพิ่มเติมจะถือว่าเป็นการแสดงผลภายนอก ในการแก้ปัญหาเฉพาะหน้า โค้ดเฉพาะอุปกรณ์สามารถตั้งสมมติฐานเกี่ยวกับ DisplayAddress.Physical#getPort หากทราบ HWC และการจัดสรรพอร์ต ก็คาดการณ์ได้

เรายกเลิกข้อจำกัดนี้ใน Android 11 (และสูงกว่า)

  • ใน Android 11 หน้าจอแรกที่รายงานระหว่างการเปิดเครื่องคือ จอแสดงผลหลัก ประเภทการเชื่อมต่อ (ภายในกับภายนอก) ไม่เกี่ยวข้อง อย่างไรก็ตาม ยังคงเป็นจริงว่าจอแสดงผลหลักจะตัดการเชื่อมต่อไม่ได้และเป็นไปตามนั้น ก็ต้องเป็นการแสดงผลภายใน โปรดทราบว่าโทรศัพท์แบบพับได้บางรุ่นอาจมี จอแสดงผลภายใน
  • จอแสดงผลรองได้รับการจัดหมวดหมู่อย่างถูกต้องเป็น Display.TYPE_INTERNAL หรือ Display.TYPE_EXTERNAL (ชื่อเดิมคือ Display.TYPE_BUILT_IN และ Display.TYPE_HDMI ตามลำดับ) ขึ้นอยู่กับประเภทการเชื่อมต่อ

การใช้งาน

ใน Android 9 และต่ำกว่า จอแสดงผลจะระบุด้วยรหัส 32 บิต โดย 0 คือจอแสดงผลภายใน และ 1 คือจอแสดงผลภายนอก [2, INT32_MAX] เป็นจอแสดงผลเสมือนของ HWC และ -1 หมายถึงจอแสดงผลที่ไม่ถูกต้องหรือจอแสดงผลเสมือนที่ไม่ใช่ HWC

ตั้งแต่ Android 10 เป็นต้นไป จอแสดงผลจะมีความเสถียร และรหัสถาวร ซึ่งทำให้ SurfaceFlinger และ DisplayManagerService เพื่อติดตามจอแสดงผลมากกว่า 2 จอและจดจำจอแสดงผลที่เคยเห็นก่อนหน้านี้ หาก HWC รองรับ IComposerClient.getDisplayIdentificationData และให้บริการจอแสดงผล ข้อมูลระบุ SurfaceFlinger จะแยกวิเคราะห์โครงสร้าง EDID และจัดสรรข้อมูลที่เสถียร รหัสจอแสดงผล 64 บิตสำหรับจอแสดงผลเสมือนจริงและ HWC รหัสจะแสดงโดยใช้ ประเภทตัวเลือก ซึ่งมีค่า Null แทน Display ที่ไม่ถูกต้องหรือข้อมูลเสมือนที่ไม่ใช่ HWC จอแสดงผล หากไม่มีการสนับสนุน HWC แพลตฟอร์ม SurfaceFlinger จะกลับไปใช้ลักษณะการทำงานเดิม จอแสดงผลเกือบ 2 หน้าจอ

การโฟกัสต่อจอแสดงผล

เพื่อรองรับแหล่งที่มาของอินพุตหลายแหล่งที่กำหนดเป้าหมายไปยังแต่ละจอแสดงผลโดยมีหน้าจอเดียวกัน คุณสามารถกำหนดค่า Android 10 ให้รองรับ หน้าต่างที่โฟกัสไม่เกิน 1 หน้าต่างต่อจอแสดงผล มีไว้สำหรับพิเศษเท่านั้น ของอุปกรณ์ประเภทต่างๆ เมื่อผู้ใช้หลายคนโต้ตอบกับอุปกรณ์เดียวกัน และใช้วิธีการป้อนข้อมูลหรืออุปกรณ์ที่แตกต่างกัน เช่น Android ยานยนต์

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

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

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

ใช้ com.android.internal.R.bool.config_perDisplayFocusEnabled เพื่อตั้งค่าโฟกัสต่อการแสดงผล

ความเข้ากันได้

ปัญหา: ใน Android 9 และต่ำกว่า ไม่เกิน 1 หน้าต่างใน ในแต่ละระบบมีสมาธิ

วิธีแก้ไข: ในกรณีที่เกิดขึ้นไม่บ่อยนักเมื่อ 2 หน้าต่างจาก กระบวนการเดียวกันจะมุ่งเน้น ระบบจะมุ่งเน้นเฉพาะกรอบเวลา สูงขึ้นใน Z-order การจำกัดนี้จะถูกนำออกสำหรับแอปที่กำหนดเป้าหมาย Android 10 จึงคาดหวังว่าจะสามารถ สนับสนุนหน้าต่างหลายหน้าต่างที่โฟกัสพร้อมกัน

การใช้งาน

WindowManagerService#mPerDisplayFocusEnabled ควบคุม ของฟีเจอร์นี้ ในอีก ActivityManager มีการใช้ ActivityDisplay#getFocusedStack() แทนส่วนกลาง การติดตามในตัวแปร ActivityDisplay#getFocusedStack() จะกำหนดโฟกัสตามคำสั่ง Z แทนการแคชค่า ทั้งนี้เพื่อให้ WindowManager แหล่งที่มาเดียวต้องติดตาม Z-order ของกิจกรรม

ActivityStackSupervisor#getTopDisplayFocusedStack() ทำประตู แนวทางที่คล้ายกันสำหรับกรณีที่สแต็กที่โฟกัสด้านบนสุดในระบบ ต้องระบุ ซ้อนกันจากบนลงล่าง เพื่อค้นหา สแต็กแรกที่มีสิทธิ์

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

โปรดดู InputDispatcher::mFocusedWindowHandlesByDisplay และ InputDispatcher::setFocusedDisplay() แอปที่โฟกัสจะมีการอัปเดตด้วย แยกต่างหากใน InputManagerService ผ่าน NativeInputManager::setFocusedApplication()

ใน WindowManager หน้าต่างที่โฟกัสจะมีการติดตามแยกต่างหากเช่นกัน โปรดดู DisplayContent#mCurrentFocus และ DisplayContent#mFocusedApp และการใช้งานที่เกี่ยวข้อง เนื้อหาที่เกี่ยวข้อง วิธีการติดตามและการอัปเดตได้ย้ายจาก WindowManagerService ไปยัง DisplayContent