ลักษณะการทำงานในการเปิดตัวกิจกรรมกำหนดโดยโหมดการเปิดตัวในไฟล์ AndroidManifest.xml ของแอป แฟล็ก Intent และ ActivityOptions ที่ผู้เรียกใช้ระบุ ใช้ ActivityOption#setLaunchDisplayId(int) เพื่อกำหนดเป้าหมายการแสดงผลที่เฉพาะเจาะจงสำหรับการเปิดตัวกิจกรรม
- โดยค่าเริ่มต้น กิจกรรมจะเปิดตัวในการแสดงผลเดียวกับผู้เรียกใช้ ตัวอย่างเช่น อินสแตนซ์ใหม่ของกิจกรรมที่เริ่มต้นจากตัวเรียกใช้แอปควรวางไว้ในการแสดงผลเดียวกันโดยไม่มีแฟล็กหรือตัวเลือกเพิ่มเติม ตรวจสอบว่าคุณใช้บริบทที่ถูกต้อง (กิจกรรมเทียบกับแอปพลิเคชัน) สำหรับการเปิดตัว
- หากการเปิดตัวดำเนินการจากแหล่งที่มาซึ่งไม่ได้เชื่อมโยงกับการแสดงผลที่เฉพาะเจาะจง (เช่น จากเชลล์หรือบริบทของแอปพลิเคชัน) ระบบจะวางกิจกรรมไว้ในการแสดงผลด้านบนที่ผู้ใช้โต้ตอบกับอุปกรณ์ล่าสุด หรือจากที่ที่เปิดตัวกิจกรรมล่าสุด
- Intent ในการเปิดตัวกิจกรรมสามารถแก้ไขเป็นอินสแตนซ์กิจกรรมที่มีอยู่ในระบบได้ ในกรณีดังกล่าว หากไม่มีการระบุแฟล็กเพิ่มเติม กิจกรรมจะปรากฏในการแสดงผลเดียวกันกับที่ใช้ล่าสุด หากมีการระบุการแสดงผลเป้าหมายด้วย
ActivityOptions#setTargetDisplayId()ระบบจะย้ายกิจกรรมไปยังการแสดงผลนั้น (หากได้รับอนุญาตตามข้อจำกัดด้านความปลอดภัยและข้อจำกัดอื่นๆ)
ข้อจำกัดด้านความปลอดภัย
เพื่อป้องกันไม่ให้แอปที่เป็นอันตรายนำข้อมูลที่ละเอียดอ่อนของผู้ใช้ไปใช้ในทางที่ผิดด้วยการอ่านข้อมูลจากพื้นผิวของการแสดงผลเสมือนที่แอปสร้างขึ้น แอปจะเปิดตัวกิจกรรมของตนเองได้ เฉพาะ ในการแสดงผลเสมือนที่แอปสร้างขึ้นใน Android 10 แต่โปรดทราบว่า
- คอมโพเนนต์ของระบบที่มีสิทธิ์
INTERNAL_SYSTEM_WINDOWสามารถเปิดตัวในการแสดงผลใดก็ได้ - ผู้เรียกใช้ที่มีสิทธิ์
ACTIVITY_EMBEDDINGสามารถเปิดตัวกิจกรรมจากแอปอื่นๆ ที่มีแฟล็กActivityInfo.FLAG_ALLOW_EMBEDDED - อนุญาตให้เปิดตัวกิจกรรมในการแสดงผลส่วนตัวสำหรับเจ้าของหรือกิจกรรมที่ปรากฏในการแสดงผลนั้นเท่านั้น
ข้อจำกัดที่คล้ายกันนี้ใช้กับการเพิ่มหน้าต่างลงในการแสดงผล
Android 10 มีเมธอด
ActivityManager#isActivityStartAllowedOnDisplay(Context context, int
displayId, Intent intent) เพื่อตรวจสอบข้อจำกัดด้านความปลอดภัยของ
แอปก่อนที่จะพยายามเปิดตัวในการแสดงผล ใน Android 9 (และเวอร์ชันก่อนหน้า) ผลลัพธ์การเปิดตัวที่ถูกจำกัดจะแสดง SecurityException
ข้อจำกัดด้านความปลอดภัยส่วนใหญ่ใช้ในเมธอด ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()