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