รองรับจอแสดงผลที่เชื่อมต่อ

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

ฟีเจอร์เฉพาะทั้งหมดของหน้าต่างเดสก์ท็อปจะใช้กับจอแสดงผลที่เชื่อมต่อ เมื่อเชื่อมต่อโทรศัพท์กับจอแสดงผล สถานะของโทรศัพท์จะยังคงเหมือนเดิม และเซสชันเดสก์ท็อปเปล่าจะเริ่มขึ้นบนจอแสดงผลที่เชื่อมต่อ อุปกรณ์และจอแสดงผลจะทำหน้าที่เป็น 2 ระบบแยกกัน โดยมีแอปเฉพาะสำหรับจอแสดงผลแต่ละจอ

รูปที่ 1 โทรศัพท์เชื่อมต่อกับจอแสดงผลภายนอก โดยมีเซสชันเดสก์ท็อปบนจอแสดงผลขณะที่โทรศัพท์ยังคงรักษาสถานะของตนเองไว้

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

รูปที่ 2 แท็บเล็ตเชื่อมต่อกับจอภาพภายนอก โดยขยายเซสชันเดสก์ท็อปไปยังจอแสดงผลทั้ง 2 จอ

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

จัดการการเปลี่ยนแปลงการแสดงผลแบบไดนามิก

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

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

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

ใช้บริบทที่ถูกต้อง

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

บริบทของกิจกรรมมีข้อมูลเกี่ยวกับการแสดงผลและจะปรับให้เข้ากับพื้นที่แสดงผลที่กิจกรรมปรากฏอยู่เสมอ ซึ่งจะช่วยให้คุณได้รับข้อมูลที่ถูกต้องเกี่ยวกับความหนาแน่นของการแสดงผลหรือเมตริกหน้าต่างของแอป โปรดใช้บริบทกิจกรรม (หรือบริบทอื่นๆ ที่อิงตาม UI) เสมอเพื่อรับข้อมูลเกี่ยวกับหน้าต่างหรือการแสดงผลปัจจุบัน ซึ่งจะส่งผลต่อ API ของระบบบางรายการที่ใช้ข้อมูลจากบริบทด้วย

ใน Jetpack Compose คุณสามารถเข้าถึงข้อมูลเฉพาะจอแสดงผลได้โดยใช้ออบเจ็กต์ CompositionLocal เช่น LocalConfiguration.current และ LocalDensity.current เมื่อกิจกรรมหรือหน้าต่างย้ายไปมาระหว่างจอแสดงผล การกำหนดค่าอุปกรณ์จะเปลี่ยนไป ซึ่งจะทริกเกอร์การจัดองค์ประกอบใหม่ด้วยเมตริกการแสดงผลใหม่ ออบเจ็กต์ CompositionLocal ช่วยให้ UI ของคุณปรับเปลี่ยนได้อย่างราบรื่น

ดูข้อมูลจอแสดงผล

คุณสามารถใช้คลาส Display เพื่อรับข้อมูล เช่น ขนาดการแสดงผล ความหนาแน่น หรือแฟล็ก ใช้บริการระบบ DisplayManager เพื่อรับจอแสดงผลที่พร้อมใช้งาน หากต้องการระบุจอแสดงผลภายนอก ให้กรอง Display.DEFAULT_DISPLAY ออก ซึ่งโดยปกติจะเป็นหน้าจอโทรศัพท์หรือแท็บเล็ตในตัว

val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
// The default display is 0. External displays have other IDs.
val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }

จัดการการเปิดตัวและการกำหนดค่ากิจกรรม

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

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

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

คุณเปิดกิจกรรมบนจอแสดงผลที่ต้องการได้โดยใช้ ActivityOptions โปรดทราบว่า launchDisplayId ต้องใช้ Android 8 (ระดับ API 26) ขึ้นไป

// Get DisplayManager and find the first external display.
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val externalDisplayId = displayManager.displays
    .firstOrNull { it.displayId != Display.DEFAULT_DISPLAY }
    ?.displayId

// If an external display is found, launch the activity on it.
if (externalDisplayId != null) {
    val intent = Intent(this, MySecondaryActivity::class.java)
    val options = ActivityOptions.makeBasic()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        options.launchDisplayId = externalDisplayId
    }
    startActivity(intent, options.toBundle())
} else {
    // Optionally, handle the case where no external display is connected.
}

หลีกเลี่ยงรายการที่อนุญาตของอุปกรณ์

บางครั้งแอปจะจำกัด UI และฟีเจอร์สำหรับหน้าจอขนาดใหญ่ไว้เฉพาะอุปกรณ์บางรุ่นผ่านรายการที่อนุญาต หรือโดยการตรวจสอบ BUILD.MODEL และขนาดจอแสดงผลในตัว วิธีนี้ใช้ไม่ได้ผลกับจอแสดงผลที่เชื่อมต่อ เนื่องจากอุปกรณ์เกือบทุกชนิดสามารถเชื่อมต่อกับหน้าจอขนาดใหญ่ได้ และรุ่นของอุปกรณ์จะไม่เปลี่ยนแปลงเมื่อเชื่อมต่อจอแสดงผลภายนอก

แทนที่จะใช้รายการที่อนุญาตหรือตรวจสอบ BUILD.MODEL และขนาดการแสดงผลในตัว ให้ตรวจสอบเมตริกหน้าต่างหรือความสามารถของอุปกรณ์ขณะรันไทม์เพื่อตัดสินใจเกี่ยวกับ UI ใช้ API ของ Jetpack WindowManager หรือคลาสขนาดหน้าต่างเพื่อสร้างเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์และปรับเปลี่ยนตามขนาดและความหนาแน่นของหน้าจอต่างๆ

รองรับอุปกรณ์ต่อพ่วงภายนอก

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

เพิ่มประสิทธิภาพการทำงานของผู้ใช้

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

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

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