Multi-Window คือชุดของโหมดการทำงานหลายอย่างพร้อมกันใน Android ที่ช่วยให้เรียกใช้หลายแอปบนหน้าจอพร้อมกันได้ ระบบประกอบด้วยสามโหมด: Split Screen สำหรับแบ่งหน้าจอเป็นสองส่วน, Picture-in-Picture สำหรับวิดีโอในหน้าต่างขนาดเล็ก และ Freeform สำหรับหน้าต่างขนาดตามต้องการบนหน้าจอขนาดใหญ่ ตามข้อมูลจาก Android Developers (2025) การรองรับ Multi-Window เป็นข้อบังคับสำหรับอุปกรณ์ที่มีความกว้างหน้าจอ 600 dp ขึ้นไป และนักพัฒนาทุกคนต้องปรับแอปของตนให้เข้ากับ การเปลี่ยนแปลงขนาดหน้าต่าง ที่อาจเกิดขึ้น
ประเด็นสำคัญ
Multi-Window คือคุณสมบัติของ Android ที่เปิดตัวในเวอร์ชัน 7.0 Nougat (API 24) ซึ่งช่วยให้เรียกใช้สองแอปขึ้นไปบนหน้าจอพร้อมกันได้ โหมดนี้เป็นคำตอบของ Google ต่อความนิยมที่เพิ่มขึ้นของแท็บเล็ตและอุปกรณ์หน้าจอขนาดใหญ่ ซึ่งโหมดงานเดียวจำกัดประสิทธิภาพการทำงาน
ก่อน Android 7.0 แต่ละแอปจะกินพื้นที่เต็มหน้าจอ — เมื่อสลับระหว่างแอป แอปก่อนหน้าจะถูกย่อเล็กสุด Multi-Window เปลี่ยนโมเดลนี้: ตอนนี้แอปสามารถกินพื้นที่ส่วนหนึ่งของหน้าจอในขณะที่ยังคงสถานะทำงานอยู่ได้ สำหรับนักพัฒนา นี่หมายความว่า onConfigurationChanged และการจัดการการเปลี่ยนแปลงขนาดกลายเป็นสิ่งจำเป็น
บน Android 12L (2022) Google ทำให้ Multi-Window เป็นโหมดเริ่มต้นสำหรับอุปกรณ์หน้าจอขนาดใหญ่ — แอปทั้งหมดบนแท็บเล็ตทำงานในโหมดที่อนุญาตให้มีหลายหน้าต่างได้ ข้อยกเว้นเพียงอย่างเดียวคือแอปที่มีการห้ามอย่างชัดเจนในแมนิเฟสต์
Split Screen — โหมดที่พบบ่อยที่สุด หน้าจอถูกแบ่งเป็นสองส่วนในแนวนอนหรือแนวตั้ง ผู้ใช้ลากตัวแบ่ง ใช้ได้บนโทรศัพท์และแท็บเล็ต เปิดใช้งานผ่าน Overview (Recents) — โดยการลากไอคอนแอปไปที่ขอบบนหรือล่าง
Picture-in-Picture (PiP) — โหมดสำหรับแอปวิดีโอและการนำทาง เนื้อหาจะแสดงในหน้าต่างขนาดเล็กลอย (ประมาณ 15–25% ของหน้าจอ) ที่สามารถย้ายได้ ใช้ได้บน Android 8.0+ หากต้องการเปิดใช้งาน ให้ใช้ enterPictureInPictureMode() ใน Activity
Freeform — โหมดสำหรับหน้าต่างขนาดตามต้องการ คล้ายกับตัวจัดการหน้าต่างบนเดสก์ท็อป ใช้ได้บน Android TV และอุปกรณ์หน้าจอขนาดใหญ่บางรุ่นจากผู้ผลิต (Samsung DeX) แอปทำงานในหน้าต่างที่มีแถบชื่อเรื่องและ ปุ่มควบคุม
เมื่อผู้ใช้เปิดใช้งาน Multi-Window Android จะสร้างอินสแตนซ์ Activity ใหม่สำหรับแต่ละแอปและจัดสรรพื้นที่หน้าจอที่มีอยู่ Activity ถูกวางใน Task แยกกัน แต่ใช้ StackView เดียวกันกับตัวแบ่งระหว่างกัน
ระบบแจ้งให้แต่ละ Activity ทราบเกี่ยวกับการเปลี่ยนแปลงขนาดผ่าน onConfigurationChanged() หาก Activity ไม่จัดการเหตุการณ์นี้ มันจะถูกสร้างใหม่ สำหรับ Split Screen ความกว้างของหน้าต่างสามารถลดลงได้ถึง 220 dp — ความกว้างขั้นต่ำที่รองรับโดยแพลตฟอร์ม
Android อนุญาตให้แอปประกาศความกว้างขั้นต่ำผ่าน android:minWidth และ android:minHeight ในแมนิเฟสต์ หากพื้นที่ที่มีอยู่น้อยกว่าค่าเหล่านี้ Activity จะเข้าสู่สถานะหยุดชั่วคราว
เพื่อรองรับ Multi-Window คุณต้องตั้งธง android:resizeableActivity="true" ในแมนิเฟสต์ ซึ่งหมายความว่าแอปสามารถปรับขนาดเมื่อหน้าต่างเปลี่ยน โดยค่าเริ่มต้นบน Android 12L+ แอปทั้งหมดถือว่าสามารถปรับขนาดได้ — ธงจะถูกละเว้น
เมื่อขนาดหน้าต่างเปลี่ยน Activity สามารถถูกสร้างใหม่ (ค่าเริ่มต้น) หรือจัดการเหตุการณ์ใน onConfigurationChanged หากระบุ configChanges="screenSize|smallestScreenSize" ในแมนิเฟสต์ ขอแนะนำให้ระบุ configChanges สำหรับ Activity หลักเพื่อหลีกเลี่ยงการสูญเสียสถานะ
<activity
android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|orientation" />
สำหรับแอปที่ไม่รองรับการปรับขนาด Android จะแสดงกล่องโต้ตอบคำเตือน ในกรณีนี้ เมื่อเปลี่ยนไปใช้โหมดหลายหน้าต่าง ระบบอาจยุติ Activity และแสดง snackbar พร้อมข้อเสนอให้เริ่มใหม่
Multi-Window เปลี่ยนแปลงวงจรชีวิตมาตรฐานของ Activity เมื่อแอปอื่นกลายเป็นทำงานในหน้าต่างข้างเคียง Activity ปัจจุบันได้รับการเรียก onPause() แต่ไม่ใช่ onStop() — มันยังคงมองเห็นได้แม้จะไม่ได้อยู่ในโฟกัส นี่เป็นสิ่งสำคัญ: เครื่องเล่นวิดีโอควรเล่นต่อที่ onPause ไม่ใช่ที่ onStop
นักพัฒนาต้องแยกความแตกต่างระหว่างสถานะ: onPause + isInMultiWindowMode() = true หมายถึงเพียงการสูญเสียโฟกัส ไม่ใช่การออกจากหน้าจอ สำหรับวิดีโอและแอนิเมชัน นี่เป็นสัญญาณให้ไม่หยุดการเล่น แต่เพียงยกเลิกการเลือกองค์ประกอบควบคุม
เมื่อออกจาก Multi-Window onMultiWindowModeChanged() จะถูกเรียกก่อน onResume() ซึ่งให้โอกาสในการสร้างอินเทอร์เฟซใหม่สำหรับโหมดเต็มหน้าจอก่อนที่ผู้ใช้จะเริ่มโต้ตอบ
กฎข้อแรกคือการบันทึกสถานะ ในโหมดหลายหน้าต่าง Activity สามารถถูกสร้างใหม่ได้ทุกเวลา ใช้ SavedStateHandle ใน ViewModel หรือ onSaveInstanceState สำหรับข้อมูลทั้งหมดที่ควรคงอยู่ระหว่างการเปลี่ยนแปลงการกำหนดค่า
กฎข้อที่สองคือทดสอบที่ความกว้างขั้นต่ำ 220 dp ค่านี้ถือเป็นหน้าต่างที่แคบที่สุดใน Split Screen อินเทอร์เฟซควรยังคงอ่านได้และใช้งานได้ หากองค์ประกอบบางอย่างเกินขอบเขต ให้ใช้ Window Size Class เพื่อสลับระหว่างเลย์เอาต์
กฎข้อที่สามคือปิดการทำงานที่ไม่ทำงานใน Multi-Window ตัวอย่างเช่น กล้อง อาจไม่พร้อมใช้งานหากหน้าจอเล็กเกินไป ตรวจสอบ isInMultiWindowMode() ก่อนเริ่มกล้องหรือฟังก์ชันเต็มหน้าจออื่น ๆ
คำถามที่พบบ่อย
ตั้งค่า android:resizeableActivity="false" ในแมนิเฟสต์ บน Android 12L+ ธงจะถูกละเว้นสำหรับอุปกรณ์หน้าจอขนาดใหญ่ ดังนั้นสำหรับการห้ามโดยสมบูรณ์ให้ใช้ android:maxAspectRatio
เรียก isInMultiWindowMode() จาก Activity เมธอดจะคืนค่า true หากแอปกำลังทำงานใน Split Screen, PiP หรือ Freeform คุณยังสามารถสมัครรับ onMultiWindowModeChanged() ได้
บน Android TV มีเฉพาะโหมด Picture-in-Picture เท่านั้นที่ใช้งานได้ Split Screen และ Freeform ไม่รองรับ — ทีวีใช้หน้าจอหลักหนึ่งหน้าจอพร้อมหน้าต่าง PiP ที่มุม
บริการพื้นหน้ายังคงทำงานต่อไปโดยไม่ขึ้นกับโหมด อย่างไรก็ตาม หากแอปเปลี่ยนเป็น PiP ระบบอาจหยุดการทำงานชั่วคราวเพื่อประหยัดทรัพยากร
Android รองรับ การลากและวาง ระหว่างหน้าต่างใน Multi-Window ผ่าน ClipData และ View.OnDragListener ข้อมูลจะถูกถ่ายโอนผ่าน ContentProvider หรือ Intent ด้วย FLAG_GRANT_READ_URI_PERMISSION
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ