หน้านี้แสดงคำแนะนำสำหรับการทำงานกับจอแสดงผลหลายจอ
แอปสำหรับอุปกรณ์พับได้และอุปกรณ์ที่มีหลายหน้าจอ
โดยทั่วไปแล้ว แอปไม่ควรใช้ตัวระบุแบบคงที่หรือตรรกะที่ขึ้นอยู่กับรหัสจอแสดงผลบางรายการ ในกรณีส่วนใหญ่ แอปควรปรับขนาดและทำงานบนจอแสดงผลต่างๆ ได้ และระบบควรควบคุมตำแหน่งที่จะวางแอป เช่น สร้างประสบการณ์การใช้งานใหม่และไม่ซ้ำใครสำหรับอุปกรณ์พับได้ และเปิดแอปพิเศษบนหน้าจอภายนอกเมื่อพับอุปกรณ์
ในกรณีนี้ UI ของระบบหรือคอมโพเนนต์ระบบอื่นๆ ควรตรวจจับการพับ กำหนดว่าควรดำเนินการหรือไม่ จากนั้นเปิดใช้งานเป้าหมายและระบุรหัสจอแสดงผลภายนอกเป็นเป้าหมายการเปิดใช้งาน แอปไม่ควรตรวจจับการดำเนินการนี้หรือดำเนินการใดๆ เพื่อตอบสนอง จากนั้นจึงเปิดใช้งานบนจอแสดงผลที่เฉพาะเจาะจง ดังนั้นอย่าคิดว่าสิ่งที่ใช้ได้กับอุปกรณ์เครื่องหนึ่งจะใช้ได้กับอุปกรณ์เครื่องอื่นๆ กล่าวโดยย่อคือ โค้ดที่เฉพาะเจาะจงกับอุปกรณ์จะเพิ่มการแยกส่วน
จำกัดการเข้าถึงจอแสดงผล
หากการกำหนดค่าอุปกรณ์กำหนดให้จำกัดการเข้าถึงจอแสดงผลอย่างน้อย 1 จอ เราขอแนะนำให้ใช้แฟล็ก Display#FLAG_PRIVATE เพื่อกำหนดให้จอแสดงผลเป็นส่วนตัว การกำหนดนี้จะจำกัดไม่ให้ทุกคนยกเว้นเจ้าของเพิ่มเนื้อหาลงในจอแสดงผล หากบุคคลอื่นที่ไม่ใช่เจ้าของพยายามเปิดใช้งานหรือเพิ่มหน้าต่าง ระบบจะทริกเกอร์ SecurityException
หากระบบเป็นเจ้าของจอแสดงผล ระบบจะเพิ่มหน้าต่างและเปิดใช้งานได้
นอกจากนี้ เอนทิตีที่วางไว้บนจอแสดงผลจะเข้าถึงจอแสดงผลนั้นได้เสมอ หากเจ้าของเปิดใช้งานบนจอแสดงผล กิจกรรมนั้นจะเปิดใช้งานอื่นๆ บนจอแสดงผลนี้ได้ ดังนั้น เจ้าของจึงมีหน้าที่รับผิดชอบในการจำกัดการเข้าถึงและอนุญาตเฉพาะแอปที่เชื่อถือได้
นอกจากนี้ ระบบยังเพิ่มข้อจำกัดเพิ่มเติมลงในจอแสดงผลเสมือนเนื่องจากแอปใดๆ ก็สร้างจอแสดงผลเสมือนได้โดยไม่ต้องทำให้ผู้ใช้มองเห็น หากระบบไม่ได้เป็นเจ้าของจอแสดงผลเสมือน ระบบจะอนุญาตเฉพาะกิจกรรมที่มี allowEmbedded และผู้เรียกควรมีสิทธิ์ ACTIVITY_EMBEDDING
ดูข้อมูลเพิ่มเติมได้ที่
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplayActivityDisplay#isUidPresentDisplayManagerService#isUidPresentOnDisplay
หากต้องการควบคุมการเปิดใช้งานกิจกรรมแบบมีเงื่อนไข ให้ใช้ LaunchParamsController ซึ่งจะสกัดกั้นการเปิดใช้งานกิจกรรมทั้งหมดและอนุญาตให้คอมโพเนนต์ระบบแก้ไขพารามิเตอร์ที่ใช้สำหรับการเปิดใช้งาน ฟีเจอร์นี้มีให้บริการใน system_server
กำหนดค่าการตั้งค่าการแสดงหน้าต่างและการตกแต่งระบบ
คุณกำหนดค่าการตกแต่งระบบต่อจอแสดงผลได้ในDisplayWindowSettings การติดตั้งใช้งานอุปกรณ์สามารถให้การกำหนดค่าเริ่มต้นใน /data/system/display_settings.xml
ค่านี้จะกำหนดว่าการตกแต่งระบบ (ตัวเรียกใช้ วอลเปเปอร์ แถบการนำทาง และหน้าต่างตกแต่งอื่นๆ) และ IME จะปรากฏบนจอแสดงผลหรือไม่
ดูรายละเอียดได้ที่ DisplayWindowSettings#shouldShowSystemDecorsLocked และ DisplayWindowSettings#shouldShowImeLocked
หากต้องการระบุจอแสดงผล ให้ใช้รหัสที่ไม่ซ้ำกัน (ค่าเริ่มต้นนี้ใช้ DisplayInfo#uniqueId) หรือรหัสพอร์ตจริงสำหรับจอแสดงผลฮาร์ดแวร์ (ดู DisplayInfo#address)
ตัวอย่างเช่น ตัวอย่างการกำหนดค่าจอแสดงผลต่อไปนี้จะเปิดใช้การตกแต่งระบบและ IME บนจอแสดงผลจำลอง
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
ในตัวอย่างด้านบน ระบบจะใช้ uniqueId เพื่อระบุจอแสดงผลในแอตทริบิวต์ชื่อ ซึ่งสำหรับจอแสดงผลจำลองจะเป็น overlay:1
สำหรับจอแสดงผลในตัว ค่าตัวอย่างอาจเป็น "local:45354385242535243453"
อีกทางเลือกหนึ่งคือใช้ข้อมูลพอร์ตฮาร์ดแวร์และตั้งค่า identifier="1"
ให้สอดคล้องกับ DisplayWindowSettings#IDENTIFIER_PORT จากนั้นอัปเดต
ชื่อให้ใช้รูปแบบ "port:<port_id>"
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
ดูรายละเอียดได้ที่ตัวระบุจอแสดงผลแบบคงที่
ดูข้อมูลเพิ่มเติมได้ที่
สลับจอแสดงผลระหว่างการมิเรอร์และการโฮสต์งาน
ใน Android 17 ขึ้นไป DisplayManager จะใช้
FLAG_ALLOWS_CONTENT_MODE_SWITCH แฟล็กเพื่อควบคุมว่าจอแสดงผลจะสลับ
ระหว่างการมิเรอร์และการโฮสต์ งาน ในรันไทม์หรือไม่ โดยค่าเริ่มต้น แฟล็กนี้จะเปิดใช้สำหรับจอแสดงผลภายนอกและปิดใช้สำหรับจอแสดงผลอื่นๆ ทั้งหมด
เมื่อมี FLAG_ALLOWS_CONTENT_MODE_SWITCH อยู่ DisplayManager จะตรวจสอบการตั้งค่าที่ปลอดภัย android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY เพื่อกำหนดว่าจะมิเรอร์หรือโฮสต์งาน แม้ว่านี่จะเป็นตรรกะเริ่มต้น แต่ OEM ก็สามารถปรับแต่งลักษณะการทำงานนี้ได้
โทโพโลยีจอแสดงผลและการเคลื่อนไหวของตัวชี้
ใน Android 17 ขึ้นไป โทโพโลยีจอแสดงผลจะกำหนดตำแหน่งสัมพัทธ์ของจอแสดงผลและจำกัดการเคลื่อนไหวของเคอร์เซอร์เมาส์ไว้ที่จอแสดงผลชุดหนึ่งที่เฉพาะเจาะจงในโทโพโลยี
WindowManager จะตัดสินใจว่าจะรวมจอแสดงผลไว้ในโทโพโลยีหรือไม่ และเรียก DisplayManagerInternal.onDisplayBelongToTopologyChanged DisplayManager
จะตรวจสอบ DisplayTopologyCoordinator.isDisplayAllowedInTopology ก่อนที่จะเพิ่มจอแสดงผล โดยค่าเริ่มต้น หากจอแสดงผลในเครื่องโฮสต์งานได้ ระบบจะเพิ่มจอแสดงผลเหล่านั้น
หากมีจอแสดงผลสาธารณะหลายจอที่โฮสต์งานได้ ระบบจะจัดการการตัดสินใจว่าจะรวมจอแสดงผลเริ่มต้นไว้หรือไม่โดยผู้ให้บริการบูลีน shouldIncludeDefaultDisplayInTopology ที่ส่งไปยัง DisplayTopologyCoordinator หากจอแสดงผลเริ่มต้นเป็นจอแสดงผลสาธารณะเพียงจอเดียวที่โฮสต์งานได้ จอแสดงผลนั้นจะอยู่ในโทโพโลยีเสมอ ใน AOSP ผู้ให้บริการบูลีนจะแสดงผล true ก็ต่อเมื่อจอแสดงผลเริ่มต้นรองรับการแสดงหน้าต่างเดสก์ท็อปหรือหากการตั้งค่าที่ปลอดภัย Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY เป็น true
แอปจะค้นหาโทโพโลยีปัจจุบันโดยใช้ DisplayManager.getDisplayTopology และตอบสนองต่อการเปลี่ยนแปลงโทโพโลยีโดยลงทะเบียน Listener ด้วย DisplayManager.registerTopologyListener