แนวทางปฏิบัติที่แนะนํา

แอปสำหรับอุปกรณ์แบบพับได้และรองรับหลายหน้าจอ

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

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

จำกัดการเข้าถึงจอแสดงผล

หากการกำหนดค่าอุปกรณ์จำเป็นต้องจำกัดการเข้าถึงจอแสดงผลอย่างน้อย 1 จอ ขอแนะนำให้ใช้แฟล็ก 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>

โปรดดูรายละเอียดที่หัวข้อตัวระบุการแสดงผลแบบคงที่

โปรดดูข้อมูลเพิ่มเติมจากหัวข้อดังนี้