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