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

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

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

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

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

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

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

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

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

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