แอปสำหรับอุปกรณ์ที่พับได้และอุปกรณ์แบบหลายหน้าจอ
โดยทั่วไปแล้ว แอปไม่ควรใช้ตัวระบุแบบคงที่หรือตรรกะที่ขึ้นอยู่กับ รหัสการแสดงผลบางรายการ ในกรณีส่วนใหญ่ แอปควรปรับขนาดและทำงานบนจอแสดงผลต่างๆ และระบบควรควบคุมตำแหน่งของแอป เช่น เพื่อสร้าง ประสบการณ์ใหม่ที่ไม่เหมือนใครสำหรับอุปกรณ์พับได้และเปิดตัวแอปพิเศษบน หน้าจอด้านนอกเมื่อพับอุปกรณ์
ในกรณีนี้ SystemUI (หรือคอมโพเนนต์ระบบอื่น) ควรตรวจหาการพับ กำหนดว่าควรดำเนินการหรือไม่ จากนั้นเปิดกิจกรรมเป้าหมายและระบุรหัสจอแสดงผลภายนอกเป็นเป้าหมายการเปิด แอปไม่ควรตรวจจับการดำเนินการนี้หรือดำเนินการใดๆ เพื่อตอบสนอง แล้ว เปิดแอปบนจอแสดงผลที่เฉพาะเจาะจง กล่าวคือ อย่าคิดว่าสิ่งที่ใช้ได้ในอุปกรณ์หนึ่งจะใช้ได้ในอุปกรณ์อื่นๆ กล่าวโดยย่อคือ โค้ดเฉพาะอุปกรณ์ จะเพิ่มการแยกส่วน
จำกัดการเข้าถึงจอแสดงผล
หากการกำหนดค่าอุปกรณ์กำหนดให้จำกัดการเข้าถึงจอแสดงผลอย่างน้อย 1 จอ เราขอแนะนำให้ใช้Display#FLAG_PRIVATE
Flag
เพื่อกำหนดให้จอแสดงผลดังกล่าวเป็นส่วนตัว การทำเช่นนี้จะจำกัดไม่ให้ทุกคนยกเว้นเจ้าของเพิ่มเนื้อหาลงในจอแสดงผล การพยายามเปิดกิจกรรมหรือเพิ่มหน้าต่างโดยบุคคลอื่นที่ไม่ใช่เจ้าของจะส่งผลให้เกิด SecurityException
หากระบบเป็นเจ้าของจอแสดงผล ระบบจะเพิ่มหน้าต่างและเปิดใช้งานได้
นอกจากนี้ เอนทิตีที่วางบนจอแสดงผลจะเข้าถึงจอแสดงผลนั้นได้เสมอ หากเจ้าของเปิดใช้กิจกรรมบนจอแสดงผล กิจกรรมนั้นจะเปิดใช้กิจกรรมอื่นๆ บนจอแสดงผลนี้ได้ ด้วยเหตุนี้ เจ้าของจึงมีหน้าที่รับผิดชอบในการจำกัด การเข้าถึงและอนุญาตให้เฉพาะแอปที่เชื่อถือได้เท่านั้น
นอกจากนี้ เรายังเพิ่มข้อจำกัดให้กับจอแสดงผลเสมือนด้วย เนื่องจากแอปใดๆ ก็สามารถ
สร้างจอแสดงผลเสมือนได้โดยไม่ต้องทำให้ผู้ใช้มองเห็น หากระบบไม่ได้เป็นเจ้าของจอแสดงผลเสมือน ระบบจะอนุญาตเฉพาะกิจกรรมที่มี
allowEmbedded
และผู้เรียกใช้ควรมีสิทธิ์ ACTIVITY_EMBEDDING
โปรดดูข้อมูลเพิ่มเติมจากหัวข้อดังนี้
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#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>
โปรดดูรายละเอียดที่หัวข้อตัวระบุการแสดงผลแบบคงที่
โปรดดูข้อมูลเพิ่มเติมจากหัวข้อดังนี้