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

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

ฟีเจอร์เฉพาะทั้งหมดของการแสดงหน้าต่างเดสก์ท็อปจะใช้กับจอแสดงผลที่เชื่อมต่อ เมื่อ คุณเชื่อมต่อโทรศัพท์กับจอแสดงผล สถานะของโทรศัพท์จะยังคงไม่เปลี่ยนแปลง และเซสชันเดสก์ท็อปที่ว่างเปล่าจะเริ่มขึ้นบนจอแสดงผลที่เชื่อมต่อ อุปกรณ์และ จอแสดงผลจะทําหน้าที่เป็น 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 เพื่อรับข้อมูล เช่น ขนาดการแสดงผล ความหนาแน่น หรือ Flag ได้ ใช้บริการของระบบ 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() ไม่เช่นนั้น ระบบจะเปิดกิจกรรมอีกครั้ง

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

คุณเปิดใช้กิจกรรมบนจอแสดงผลที่ต้องการได้โดยใช้ 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 หรือคลาสขนาดหน้าต่างเพื่อสร้างเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์และปรับได้สำหรับขนาดและความหนาแน่นของหน้าจอต่างๆ

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

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

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

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

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

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