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