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

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

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

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

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

หากการกำหนดค่าอุปกรณ์จำเป็นต้องมีการจำกัดการเข้าถึงจอแสดงผลตั้งแต่หนึ่งจอขึ้นไป คำแนะนำคือให้ใช้แฟล็ก Display#FLAG_PRIVATE เพื่อกำหนดจอแสดงผลดังกล่าวให้เป็น แบบส่วนตัว การทำเช่นนี้จะจำกัดทั้งหมดยกเว้นเจ้าของไม่ให้เพิ่มเนื้อหาลงในจอแสดงผล ความพยายามใดๆ ที่จะเปิดตัวกิจกรรมหรือเพิ่มหน้าต่างโดยใครก็ตามยกเว้นเจ้าของจะส่งผลให้เกิด SecurityException หากระบบเป็นเจ้าของจอแสดงผล ระบบจะสามารถเพิ่มหน้าต่างและเปิดกิจกรรมได้

นอกจากนี้ เอนทิตีที่วางอยู่บนจอแสดงผลจะสามารถเข้าถึงจอแสดงผลนั้นได้ตลอดเวลา หากเจ้าของเปิดกิจกรรมบนจอแสดงผล กิจกรรมนั้นก็สามารถเปิดกิจกรรมอื่นบนจอแสดงผลนี้ได้ ด้วยเหตุนี้ เจ้าของจึงต้องรับผิดชอบในการจำกัดการเข้าถึงและอนุญาตเฉพาะแอปที่เชื่อถือได้ เท่านั้น

นอกจากนี้ ยังมีการเพิ่มข้อจำกัดเพิ่มเติมในจอแสดงผลเสมือน เนื่องจากแอปใดๆ ก็ตามสามารถสร้างได้โดยไม่ต้องให้ผู้ใช้มองเห็นได้ หากระบบไม่ได้เป็นเจ้าของจอแสดงผลเสมือน จะอนุญาตเฉพาะกิจกรรมที่ allowEmbedded เท่านั้นและผู้โทรควรมีสิทธิ์ ACTIVITY_EMBEDDING

สำหรับข้อมูลเพิ่มเติม โปรดดูที่:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#isUidPresentOnDisplay()

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

กำหนดการตั้งค่าหน้าต่างแสดงผลและการตกแต่งระบบ

การตกแต่งระบบ สามารถกำหนดค่าต่อจอแสดงผลใน DisplayWindowSettings การใช้งานอุปกรณ์สามารถจัดให้มีการกำหนดค่าเริ่มต้นใน /data/system/display_settings.xml

ค่านี้กำหนดว่าการตกแต่งระบบ (ตัวเรียกใช้งาน รูปพื้นหลัง แถบนำทาง และหน้าต่างการตกแต่งอื่นๆ) และ IME ปรากฏบนจอแสดงผลหรือไม่ สำหรับรายละเอียด โปรดดู DisplayWindowSettings#shouldShowSystemDecorsLocked() และ DisplayWindowSettings#shouldShowImeLocked()

หากต้องการระบุจอแสดงผล ให้ใช้ ID เฉพาะ (ค่าเริ่มต้นนี้ใช้ DisplayInfo#uniqueId ) หรือ ID พอร์ตทางกายภาพสำหรับจอแสดงผลฮาร์ดแวร์ (ดู 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 ใช้สำหรับการระบุการแสดงผลในแอตทริบิวต์ name ซึ่งสำหรับการแสดงผลที่จำลองจะ 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>

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

สำหรับข้อมูลเพิ่มเติม โปรดดูที่: