โหมดหลายหน้าต่างช่วยให้แอปหลายแอปใช้หน้าจอเดียวกันได้พร้อมกัน แอปอาจแสดงอยู่ข้างกันหรือซ้อนทับกัน (โหมดแยกหน้าจอ) แอปเดียวในหน้าต่างขนาดเล็กที่วางซ้อนกับแอปอื่นๆ (โหมดภาพซ้อนภาพ) หรือแอปแต่ละแอปในหน้าต่างแยกต่างหากที่ย้ายและปรับขนาดได้ (โหมดหน้าต่างเดสก์ท็อป)
ดูวิธีการสำหรับผู้ใช้เกี่ยวกับวิธีเข้าถึงโหมดแยกหน้าจอในโทรศัพท์ได้ที่ดู 2 แอปพร้อมกันในโทรศัพท์ Pixel
ฟีเจอร์หลายหน้าต่างเฉพาะเวอร์ชัน
ประสบการณ์การใช้งานแบบหลายหน้าต่างจะขึ้นอยู่กับเวอร์ชัน Android และประเภทของอุปกรณ์ ดังนี้
Android 7.0 (API ระดับ 24) ได้เปิดตัวโหมดแยกหน้าจอในอุปกรณ์หน้าจอขนาดเล็กและโหมดภาพในภาพในอุปกรณ์บางรุ่น
โหมดแยกหน้าจอจะแสดงแอป 2 แอปเต็มหน้าจอ โดยแสดงแอปข้างกันหรือซ้อนกัน ผู้ใช้สามารถลากตัวแบ่งที่แยกแอป 2 แอปออกจากกันเพื่อทำให้แอปหนึ่งมีขนาดใหญ่ขึ้นและอีกแอปหนึ่งมีขนาดเล็กลง
โหมดการแสดงภาพซ้อนภาพช่วยให้ผู้ใช้เล่นวิดีโอต่อไปได้ขณะโต้ตอบกับแอปอื่น (ดูการรองรับการแสดงภาพซ้อนภาพ)
ผู้ผลิตอุปกรณ์หน้าจอขนาดใหญ่สามารถเปิดใช้โหมดหน้าต่างเดสก์ท็อป ซึ่งผู้ใช้สามารถปรับขนาดแต่ละกิจกรรมได้อย่างอิสระ
คุณสามารถกำหนดค่าวิธีที่แอปจัดการโหมดหลายหน้าต่างได้โดยระบุขนาดขั้นต่ำที่อนุญาตของกิจกรรม นอกจากนี้ คุณยังปิดใช้โหมดหลายหน้าต่างสำหรับแอปได้โดยการตั้งค่า
resizeableActivity="false"
เพื่อให้ระบบแสดงแอปแบบเต็มหน้าจอเสมอ
Android 8.0 (API ระดับ 26) ขยายโหมดภาพในภาพไปยังอุปกรณ์หน้าจอขนาดเล็ก
Android 12 (API ระดับ 31) กำหนดให้โหมดหลายหน้าต่างเป็นลักษณะการทำงานมาตรฐาน
ในหน้าจอขนาดใหญ่ (คลาสขนาดหน้าต่างกลางหรือขยาย) แพลตฟอร์มจะรองรับแอปทั้งหมดในโหมดหลายหน้าต่าง ไม่ว่าจะกำหนดค่าแอปอย่างไรก็ตาม หากเป็น
resizeableActivity="false"
ระบบจะใส่แอปไว้ในโหมดความเข้ากันได้เมื่อจำเป็นเพื่อรองรับขนาดการแสดงผลในหน้าจอขนาดเล็ก (คลาสขนาดหน้าต่างกะทัดรัด) ระบบจะตรวจสอบ
minWidth
และminHeight
ของกิจกรรมเพื่อพิจารณาว่ากิจกรรมจะทํางานในโหมดหลายหน้าต่างได้หรือไม่ หากเป็นresizeableActivity="false"
ระบบจะป้องกันไม่ให้แอปทำงานในโหมดหลายหน้าต่าง ไม่ว่าจะมีความกว้างและความสูงขั้นต่ำเท่าใดก็ตาม
โหมดแยกหน้าจอ
ผู้ใช้เปิดใช้งานโหมดแยกหน้าจอได้โดยทำดังนี้
- เปิดหน้าจอล่าสุด
- ปัดแอปให้แสดง
- กดไอคอนแอปในแถบชื่อแอป
- เลือกตัวเลือกเมนูการแยกหน้าจอ
- เลือกแอปอื่นจากหน้าจอล่าสุด หรือปิดหน้าจอล่าสุดแล้วเรียกใช้แอปอื่น
ผู้ใช้จะออกจากโหมดแยกหน้าจอได้โดยลากตัวแบ่งหน้าต่างไปยังขอบของหน้าจอ ไม่ว่าจะขึ้นหรือลง ซ้ายหรือขวา
เปิดแอปที่อยู่ติดกัน
หากแอปของคุณจำเป็นต้องเข้าถึงเนื้อหาผ่าน Intent คุณสามารถใช้ FLAG_ACTIVITY_LAUNCH_ADJACENT
เพื่อเปิดเนื้อหาในหน้าต่างแยกหน้าจอที่อยู่ติดกัน
FLAG_ACTIVITY_LAUNCH_ADJACENT
เปิดตัวใน Android 7.0 (API ระดับ 24) เพื่อเปิดใช้แอปที่ทำงานในโหมดแยกหน้าจอให้เปิดกิจกรรมในหน้าต่างที่อยู่ติดกัน
Android 12L (API ระดับ 32) ขึ้นไปได้ขยายคำจำกัดความของ Flag นี้เพื่อเปิดใช้แอปที่ทำงานแบบเต็มหน้าจอเพื่อเปิดใช้งานโหมดแยกหน้าจอ จากนั้นเปิดกิจกรรมในหน้าต่างที่อยู่ติดกัน
หากต้องการเปิดใช้งานกิจกรรมที่อยู่ติดกัน ให้ใช้ FLAG_ACTIVITY_LAUNCH_ADJACENT
ร่วมกับ FLAG_ACTIVITY_NEW_TASK
เช่น
Kotlin
fun openUrlInAdjacentWindow(url: String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK) }.also { intent -> startActivity(intent) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
วงจรชีวิตของกิจกรรมในโหมดหลายหน้าต่าง
โหมดหลายหน้าต่างจะไม่เปลี่ยนวงจรชีวิตของกิจกรรม อย่างไรก็ตาม สถานะการกลับมาทำงานของแอปในหลายหน้าต่างจะแตกต่างกันไปตาม Android แต่ละเวอร์ชัน
หลายไฟล์
Android 10 (API ระดับ 29) ขึ้นไปรองรับการกลับมาทำงานหลายรายการ โดยกิจกรรมทั้งหมดจะยังคงอยู่ในสถานะ RESUMED
เมื่ออุปกรณ์อยู่ในโหมดหลายหน้าต่าง ระบบจะหยุดกิจกรรมชั่วคราวได้หากกิจกรรมที่โปร่งใสอยู่ด้านบนของกิจกรรมหรือกิจกรรมนั้นโฟกัสไม่ได้ เช่น กิจกรรมอยู่ในโหมดภาพซ้อนภาพ นอกจากนี้ อาจมีกิจกรรมที่ไม่มีโฟกัสในช่วงเวลาหนึ่งๆ เช่น หากลิ้นชักการแจ้งเตือนเปิดอยู่ เมธอด onStop()
จะทํางานตามปกติ กล่าวคือ ระบบจะเรียกใช้เมธอดทุกครั้งที่นํากิจกรรมออกจากหน้าจอ
นอกจากนี้ การกลับมาทำงานหลายรายการพร้อมกันยังพร้อมใช้งานในอุปกรณ์บางรุ่นที่ใช้ Android 9 (API ระดับ 28) ด้วย หากต้องการเลือกใช้การกลับมาทำงานหลายรายการในอุปกรณ์ Android 9 ให้เพิ่มข้อมูลเมตาต่อไปนี้ในไฟล์ Manifest
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
หากต้องการยืนยันว่าอุปกรณ์รองรับข้อมูลเมตาของไฟล์ Manifest นี้หรือไม่ โปรดดูข้อมูลจำเพาะของอุปกรณ์
Android 9
ในโหมดหลายหน้าต่างของ Android 9 (API ระดับ 28) และต่ำกว่า จะมีเฉพาะกิจกรรมที่ผู้ใช้โต้ตอบด้วยล่าสุดเท่านั้นที่ใช้งานอยู่ในช่วงเวลาหนึ่งๆ ระบบจะถือว่ากิจกรรมนี้สำคัญที่สุด และเป็นกิจกรรมเดียวที่อยู่ในสถานะ RESUMED
กิจกรรมอื่นๆ ที่มองเห็นได้ทั้งหมดคือ STARTED
แต่ไม่ใช่ RESUMED
อย่างไรก็ตาม ระบบจะให้ความสําคัญกับกิจกรรมที่มองเห็นได้แต่ไม่ได้กลับมาทํางานต่อสูงกว่ากิจกรรมที่มองไม่เห็น หากผู้ใช้โต้ตอบกับกิจกรรมที่มองเห็นได้ กิจกรรมนั้นจะกลับมาทำงานต่อ และกิจกรรมที่แสดงอยู่ด้านบนสุดก่อนหน้านี้จะเข้าสู่สถานะ STARTED
เมื่อมีหลายกิจกรรมภายในกระบวนการแอปที่ใช้งานอยู่รายการเดียว ระบบจะกลับมาดำเนินการกิจกรรมที่มีลําดับ z สูงสุดต่อ และหยุดกิจกรรมอื่นๆ ชั่วคราว
การเปลี่ยนแปลงการกําหนดค่า
เมื่อผู้ใช้เปิดแอปในโหมดหลายหน้าต่าง ระบบจะแจ้งเตือนกิจกรรมของการเปลี่ยนแปลงการกําหนดค่าตามที่ระบุไว้ในจัดการการเปลี่ยนแปลงการกําหนดค่า การดำเนินการนี้จะยังคงเกิดขึ้นเมื่อผู้ใช้ปรับขนาดแอปหรือเปลี่ยนแอปกลับไปเป็นโหมดเต็มหน้าจอ
โดยพื้นฐานแล้ว การเปลี่ยนแปลงนี้มีผลต่อวงจรของกิจกรรมเช่นเดียวกับเมื่อระบบแจ้งให้แอปทราบว่าอุปกรณ์เปลี่ยนจากแนวตั้งเป็นแนวนอน ยกเว้นว่าจะมีการเปลี่ยนแปลงขนาดของแอปแทนที่จะสลับกัน กิจกรรมสามารถจัดการการเปลี่ยนแปลงการกําหนดค่าด้วยตนเอง หรือแอปอาจอนุญาตให้ระบบทำลายกิจกรรมและสร้างใหม่ด้วยมิติข้อมูลใหม่
หากผู้ใช้ปรับขนาดหน้าต่างให้ใหญ่ขึ้นในมิติข้อมูลใดมิติข้อมูลหนึ่ง ระบบจะปรับขนาดกิจกรรมให้ตรงกับการกระทำของผู้ใช้และเปลี่ยนแปลงการกำหนดค่าตามที่จำเป็น หากแอปวาดภาพในพื้นที่ที่เพิ่งปรากฏขึ้นล่าช้า ระบบจะเติมพื้นที่เหล่านั้นด้วยสีที่ระบุโดยแอตทริบิวต์ windowBackground
หรือแอตทริบิวต์สไตล์ windowBackgroundFallback
เริ่มต้นเป็นการชั่วคราว
สิทธิ์เข้าถึงแหล่งข้อมูลสุดพิเศษ
หากต้องการรองรับฟีเจอร์การกลับมาทำงานหลายครั้ง ให้ใช้การเรียกกลับวงจรชีวิตของ onTopResumedActivityChanged()
ระบบจะเรียกใช้การเรียกกลับเมื่อกิจกรรมได้รับหรือสูญเสียตำแหน่งกิจกรรมที่กลับมาทำงานต่อสูงสุด ซึ่งสำคัญเมื่อกิจกรรมใช้ทรัพยากรแบบ Singleton ที่แชร์ เช่น ไมโครโฟนหรือกล้อง
Kotlin
override fun onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
โปรดทราบว่าแอปอาจสูญเสียทรัพยากรด้วยเหตุผลอื่นๆ เช่น การนำฮาร์ดแวร์ที่แชร์ออก
ไม่ว่าในกรณีใด แอปควรจัดการเหตุการณ์และการเปลี่ยนแปลงสถานะที่ส่งผลต่อทรัพยากรที่มีอยู่อย่างราบรื่น
สำหรับแอปที่ใช้กล้อง
CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged()
จะแสดงคำแนะนำว่าอาจถึงเวลาที่แอปควรพยายามเข้าถึงกล้อง
วิธีนี้ใช้ได้ตั้งแต่ Android 10 (API ระดับ 29)
โปรดทราบว่า resizeableActivity=false
ไม่ได้รับประกันสิทธิ์เข้าถึงกล้องแต่เพียงผู้เดียว เนื่องจากแอปอื่นๆ ที่ใช้กล้องสามารถเปิดในจอแสดงผลอื่นๆ ได้
แอปของคุณไม่จำเป็นต้องปล่อยกล้องเมื่อแอปเสียโฟกัส เช่น คุณอาจต้องการแสดงตัวอย่างกล้องต่อไปขณะที่ผู้ใช้โต้ตอบกับแอปที่กลับมาทำงานอยู่ด้านบนสุดซึ่งโฟกัสใหม่ แอปของคุณจะเรียกใช้กล้องต่อไปได้แม้ว่าจะไม่ใช่แอปที่กลับมาทำงานอยู่ด้านบนสุด แต่ต้องจัดการกรณีการเชื่อมต่อขาดตอนอย่างเหมาะสม เมื่อแอปที่กลับมาทำงานด้านบนสุดต้องการใช้กล้อง แอปดังกล่าวจะเปิดกล้องได้ และแอปของคุณจะเสียสิทธิ์เข้าถึง แอปจะเปิดกล้องอีกครั้งได้เมื่อได้รับโฟกัสอีกครั้ง
หลังจากที่แอปได้รับ CameraDevice.StateCallback#onDisconnected()
callbacks แล้ว การเรียกใช้อุปกรณ์กล้องในภายหลังจะแสดง CameraAccessException
การแสดงผลหลายจอ
Android 10 (API ระดับ 29) รองรับกิจกรรมในจอแสดงผลรอง หากมีกิจกรรมที่ทำงานอยู่ในอุปกรณ์ที่มีจอแสดงผลหลายจอ ผู้ใช้จะย้ายกิจกรรมจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่งได้ การกลับมาทำงานหลายรายการพร้อมกันใช้ได้กับสถานการณ์หลายหน้าจอด้วย โดยกิจกรรมหลายรายการสามารถรับอินพุตจากผู้ใช้พร้อมกันได้
แอปสามารถระบุจอแสดงผลที่ควรทำงานเมื่อเปิดหรือสร้างกิจกรรมอื่น ลักษณะการทํางานนี้ขึ้นอยู่กับโหมดการเริ่มกิจกรรมที่กําหนดไว้ในไฟล์ Manifest และ Flag ของ Intent และตัวเลือกที่ตั้งค่าโดยเอนทิตีที่เริ่มกิจกรรม ดูรายละเอียดเพิ่มเติมได้ที่คลาส ActivityOptions
เมื่อกิจกรรมย้ายไปยังจอแสดงผลรอง กิจกรรมอาจได้รับการอัปเดตบริบท การปรับขนาดหน้าต่าง รวมถึงการเปลี่ยนแปลงการกำหนดค่าและทรัพยากร หากกิจกรรมจัดการการเปลี่ยนแปลงการกําหนดค่าได้ ระบบจะแจ้งให้ทราบใน onConfigurationChanged()
ไม่เช่นนั้น ระบบจะเปิดกิจกรรมอีกครั้ง
กิจกรรมควรตรวจสอบการแสดงผลปัจจุบันใน onCreate()
และ
onConfigurationChanged()
หากจัดการการเปลี่ยนแปลงการกําหนดค่า อย่าลืมอัปเดตทรัพยากรและเลย์เอาต์เมื่อการแสดงผลมีการเปลี่ยนแปลง
หากโหมดการเริ่มที่เลือกสําหรับกิจกรรมอนุญาตให้มีอินสแตนซ์หลายรายการ การเริ่มในหน้าจอรองจะสร้างอินสแตนซ์ใหม่ของกิจกรรมได้ กิจกรรมทั้ง 2 รายการจะกลับมาทำงานต่อพร้อมกัน
นอกจากนี้ คุณยังอาจต้องอ่านเกี่ยวกับ API จอแสดงผลหลายจอที่เปิดตัวใน Android 8.0
กิจกรรมกับบริบทแอปพลิเคชัน
การใช้บริบทที่เหมาะสมเป็นสิ่งสําคัญในการแสดงผลหลายหน้าจอ เมื่อเข้าถึงทรัพยากร บริบทของกิจกรรม (ซึ่งแสดงอยู่) จะแตกต่างจากบริบทของแอปพลิเคชัน (ซึ่งไม่แสดง)
บริบทกิจกรรมมีข้อมูลเกี่ยวกับจอแสดงผลและได้รับการปรับให้เหมาะกับพื้นที่ในจอแสดงผลที่กิจกรรมปรากฏอยู่เสมอ วิธีนี้จะช่วยให้คุณได้รับข้อมูลที่ถูกต้องเกี่ยวกับความหนาแน่นของการแสดงผลหรือเมตริกกรอบเวลาของแอป คุณควรใช้บริบทกิจกรรม (หรือบริบทอื่นที่อิงตาม UI) เสมอเพื่อรับข้อมูลเกี่ยวกับกรอบเวลาหรือการแสดงผลปัจจุบัน ซึ่งจะส่งผลต่อ API ของระบบบางรายการที่ใช้ข้อมูลจากบริบทด้วย (เช่น ดูภาพรวมของ Toast)
การกําหนดค่ากรอบเวลาของกิจกรรมและการแสดงของรายการหลักจะกําหนดทรัพยากรและบริบท รับการแสดงผลปัจจุบันดังนี้
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
ดูเมตริกกรอบเวลากิจกรรมปัจจุบัน
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
รับเมตริกกรอบเวลาสูงสุดสําหรับการกําหนดค่าระบบปัจจุบัน
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
เมตริกกรอบเวลาสูงสุดมีไว้สําหรับคํานวณ เลือกเลย์เอาต์ หรือกําหนดขนาดทรัพยากรที่จะดึงข้อมูลล่วงหน้า การมีข้อมูลนี้ใน onCreate()
จะช่วยให้คุณตัดสินใจได้ก่อนการผ่านเลย์เอาต์ครั้งแรก คุณไม่ควรใช้เมตริกเหล่านี้ในการจัดวางองค์ประกอบมุมมองที่เฉพาะเจาะจง แต่ให้ใช้ข้อมูลจากออบเจ็กต์ Configuration
แทน
หน้าจอรอยบาก
อุปกรณ์แบบพับได้อาจมีรูปทรงของส่วนที่ถูกตัดออกแตกต่างกันเมื่อพับและไม่พับ หากต้องการหลีกเลี่ยงปัญหาเกี่ยวกับรอยบาก โปรดดูรองรับหน้าจอรอยบาก
จอแสดงผลรอง
คุณดูจอแสดงผลที่ใช้ได้ได้จากบริการระบบ DisplayManager
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays();
ใช้คลาส Display
เพื่อรับข้อมูลเกี่ยวกับจอแสดงผลหนึ่งๆ เช่น ขนาดจอแสดงผลหรือFlag ที่ระบุว่าจอแสดงผลปลอดภัยหรือไม่
อย่างไรก็ตาม อย่าคิดว่าขนาดการแสดงผลจะเหมือนกับพื้นที่แสดงผลที่จัดสรรให้กับแอปพลิเคชัน โปรดทราบว่าแอปพลิเคชันของคุณจะใช้พื้นที่บางส่วนของหน้าจอในโหมดหลายหน้าต่าง
วิธีตรวจสอบว่ากิจกรรมจะเปิดบนจอแสดงผลได้หรือไม่
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
จากนั้นเปิดกิจกรรมบนจอแสดงผลโดยทำดังนี้
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(targetDisplay.displayId); startActivity(intent, options.toBundle());
การรองรับหลายจอภาพ
Android รองรับแป้นพิมพ์ซอฟต์แวร์ วอลเปเปอร์ และตัวเปิดแอปแบบหลายจอภาพ
แป้นพิมพ์เสมือน
แป้นพิมพ์จะแสดงบนหน้าจอรองได้หากกำหนดค่าจอแสดงผลให้รองรับการตกแต่งระบบ ตัวแก้ไขวิธีการป้อนข้อมูลจะปรากฏขึ้นโดยอัตโนมัติหากช่องข้อความขอข้อมูลในการแสดงผลนั้น
วอลเปเปอร์
ใน Android 10 (API ระดับ 29) หน้าจอรองจะมีวอลเปเปอร์ได้ เฟรมเวิร์กจะสร้างอินสแตนซ์ WallpaperService.Engine
แยกกันสําหรับการแสดงผลแต่ละรายการ ตรวจสอบว่าพื้นผิวของเครื่องยนต์แต่ละเครื่องวาดแยกกัน นักพัฒนาซอฟต์แวร์จะโหลดชิ้นงานได้โดยใช้บริบทการแสดงผลใน WallpaperService.Engine#getDisplayContext()
และตรวจสอบว่าไฟล์ WallpaperInfo.xml
ของคุณตั้งค่าเป็น android:supportsMultipleDisplays="true"
Launcher
หมวดหมู่ตัวกรอง Intent ใหม่ SECONDARY_HOME
มีกิจกรรมเฉพาะสําหรับหน้าจอรอง ระบบจะใช้อินสแตนซ์ของกิจกรรมในจอแสดงผลทั้งหมดที่รองรับการตกแต่งระบบ โดยจะใช้ 1 อินสแตนซ์ต่อจอแสดงผล 1 เครื่อง
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
กิจกรรมต้องมีโหมดการเริ่มที่ไม่ป้องกันอินสแตนซ์หลายรายการ และสามารถปรับให้เข้ากับหน้าจอขนาดต่างๆ ได้ โหมดเปิดใช้งานต้องไม่ใช่ singleInstance
หรือ singleTask
ตัวอย่างเช่น การใช้งาน Launcher3
ใน AOSP รองรับกิจกรรม SECONDARY_HOME
เมตริกกรอบเวลา
Android 11 (API ระดับ 30) ได้เปิดตัวเมธอด WindowManager
ต่อไปนี้เพื่อระบุขอบเขตของแอปที่ทำงานในโหมดหลายหน้าต่าง
getCurrentWindowMetrics()
: แสดงผลออบเจ็กต์WindowMetrics
สำหรับสถานะการแบ่งหน้าจอปัจจุบันของระบบgetMaximumWindowMetrics()
: แสดงผลWindowMetrics
สำหรับสถานะการแบ่งเฟรมที่เป็นไปได้ที่ใหญ่ที่สุดของระบบ
เมธอดในไลบรารี WindowManager ของ Jetpack อย่าง computeCurrentWindowMetrics()
และ computeMaximumWindowMetrics()
มีฟังก์ชันการทำงานที่คล้ายกันตามลำดับ แต่มีความเข้ากันได้แบบย้อนหลังกับ API ระดับ 14
หากต้องการดูเมตริกของจอแสดงผลอื่นที่ไม่ใช่จอแสดงผลปัจจุบัน ให้ทําดังนี้ (ตามที่แสดงในข้อมูลโค้ด)
- สร้างบริบทของ Display
- สร้างบริบทของหน้าต่างสําหรับจอแสดงผล
- รับ
WindowManager
ของบริบทหน้าต่าง - รับ
WindowMetrics
ของพื้นที่แสดงผลสูงสุดที่แอปใช้ได้
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
วิธีการที่เลิกใช้งาน
เราได้เลิกใช้งานเมธอด getSize()
และ getMetrics()
ใน Display
API ระดับ 30 แล้วเพื่อใช้เมธอด WindowManager
ใหม่แทน
Android 12 (API ระดับ 31) เลิกใช้งานเมธอด Display
getRealSize()
และ getRealMetrics()
รวมถึงอัปเดตลักษณะการทํางานให้ตรงกับลักษณะการทํางานของ getMaximumWindowMetrics()
มากขึ้น
การกําหนดค่าโหมดหลายหน้าต่าง
หากแอปกำหนดเป้าหมายเป็น Android 7.0 (API ระดับ 24) ขึ้นไป คุณจะกำหนดค่าได้ว่าจะให้กิจกรรมของแอปรองรับโหมดหลายหน้าต่างหรือไม่และรองรับอย่างไร คุณสามารถตั้งค่าแอตทริบิวต์ในไฟล์ Manifest เพื่อควบคุมทั้งขนาดและเลย์เอาต์ การตั้งค่าแอตทริบิวต์ของกิจกรรมรูทจะมีผลกับกิจกรรมทั้งหมดในกองงาน ตัวอย่างเช่น หากกิจกรรมรูทมี android:resizeableActivity="true"
กิจกรรมทั้งหมดในกองงานจะปรับขนาดได้ ในอุปกรณ์ขนาดใหญ่บางรุ่น เช่น Chromebook แอปอาจทำงานในหน้าต่างที่ปรับขนาดได้แม้ว่าคุณจะระบุandroid:resizeableActivity="false"
ก็ตาม หากการอัปเดตทำให้แอปใช้งานไม่ได้ คุณสามารถใช้ตัวกรองใน Google Play เพื่อจำกัดความพร้อมให้บริการของแอปในอุปกรณ์ดังกล่าว
Android 12 (API ระดับ 31) จะเริ่มต้นเป็นโหมดหลายหน้าต่างโดยค่าเริ่มต้น ในหน้าจอขนาดใหญ่ (คลาสขนาดหน้าต่างกลางหรือขยาย) แอปทั้งหมดจะทำงานในโหมดหลายหน้าต่าง ไม่ว่าจะกำหนดค่าแอปอย่างไรก็ตาม ในหน้าจอขนาดเล็ก ระบบจะตรวจสอบการตั้งค่า minWidth
, minHeight
และ resizeableActivity
ของกิจกรรมเพื่อพิจารณาว่ากิจกรรมจะทํางานในโหมดหลายหน้าต่างได้หรือไม่
resizeableActivity
ตั้งค่าแอตทริบิวต์นี้ในองค์ประกอบ <activity>
หรือ <application>
ของไฟล์ Manifest เพื่อเปิดหรือปิดใช้โหมดหลายหน้าต่างสำหรับ API ระดับ 30 หรือต่ำกว่า
<application
android:name=".MyActivity"
android:resizeableActivity=["true" | "false"] />;
หากตั้งค่าแอตทริบิวต์นี้เป็น true
ระบบจะเปิดกิจกรรมในโหมดแยกหน้าจอและโหมดหน้าต่างเดสก์ท็อปได้ หากตั้งค่าแอตทริบิวต์เป็น false
กิจกรรมจะไม่รองรับโหมดหลายหน้าต่าง หากค่าเป็น False และผู้ใช้พยายามเปิดกิจกรรมในโหมดหลายหน้าต่าง กิจกรรมจะครอบครองหน้าจอเต็ม
หากแอปกำหนดเป้าหมายเป็น API ระดับ 24 ขึ้นไป แต่คุณไม่ได้ระบุค่าสำหรับแอตทริบิวต์นี้ ค่าเริ่มต้นของแอตทริบิวต์จะเป็น "จริง"
หากแอปกำหนดเป้าหมายเป็น API ระดับ 31 ขึ้นไป แอตทริบิวต์นี้จะทำงานแตกต่างกันในหน้าจอขนาดเล็กและขนาดใหญ่ ดังนี้
- หน้าจอขนาดใหญ่ (คลาสขนาดหน้าต่างกลางหรือขยาย): แอปทั้งหมดรองรับโหมดหลายหน้าต่าง แอตทริบิวต์จะระบุว่ากิจกรรมปรับขนาดได้หรือไม่ หากเป็น
resizeableActivity="false"
ระบบจะใส่แอปไว้ในโหมดความเข้ากันได้เมื่อจําเป็นเพื่อให้สอดคล้องกับขนาดการแสดงผล - หน้าจอขนาดเล็ก (คลาสขนาดหน้าต่างกะทัดรัด): หาก
resizeableActivity="true"
และขนาดหน้าต่างของกิจกรรมมีความกว้างและสูงขั้นต่ำอยู่ในข้อกำหนดของหลายหน้าต่าง กิจกรรมจะรองรับโหมดหลายหน้าต่าง หากเป็นresizeableActivity="false"
กิจกรรมจะไม่รองรับโหมดหลายหน้าต่าง ไม่ว่าจะมีความกว้างและความสูงขั้นต่ำเท่าใดก็ตาม
supportsPictureInPicture
ตั้งค่าแอตทริบิวต์นี้ในโหนด <activity>
ของไฟล์ Manifest เพื่อระบุว่ากิจกรรมรองรับโหมดภาพในภาพหรือไม่
<activity
android:name=".MyActivity"
android:supportsPictureInPicture=["true" | "false"] />
configChanges
หากต้องการจัดการการเปลี่ยนแปลงการกำหนดค่าหลายหน้าต่างด้วยตนเอง เช่น เมื่อผู้ใช้ปรับขนาดหน้าต่าง ให้เพิ่มแอตทริบิวต์ android:configChanges
ลงในโหนดไฟล์ Manifest <activity>
ของแอปโดยระบุค่าต่อไปนี้เป็นอย่างน้อย
<activity
android:name=".MyActivity"
android:configChanges="screenSize | smallestScreenSize
| screenLayout | orientation" />
หลังจากเพิ่ม android:configChanges
แล้ว กิจกรรมและข้อมูลโค้ดที่แยกส่วนจะได้รับการเรียกกลับไปยัง onConfigurationChanged()
แทนที่จะทำลายและสร้างใหม่ จากนั้นคุณสามารถอัปเดตมุมมอง โหลดทรัพยากรซ้ำ และดําเนินการอื่นๆ ด้วยตนเองได้ตามต้องการ
<layout>
ใน Android 7.0 (API ระดับ 24) ขึ้นไป องค์ประกอบไฟล์ Manifest <layout>
รองรับแอตทริบิวต์หลายรายการที่ส่งผลต่อลักษณะการทำงานของกิจกรรมในโหมดหลายหน้าต่าง ดังนี้
android:defaultHeight
,android:defaultWidth
: ความสูงและความกว้างเริ่มต้นของกิจกรรมเมื่อเปิดในโหมดหน้าต่างเดสก์ท็อปandroid:gravity
: ตําแหน่งเริ่มต้นของกิจกรรมเมื่อเปิดใช้งานในโหมดหน้าต่างเดสก์ท็อป ดูค่าที่เหมาะสมได้ในคลาสGravity
android:minHeight
,android:minWidth
: ความสูงและกว้างขั้นต่ำสำหรับกิจกรรมทั้งในโหมดแยกหน้าจอและโหมดหน้าต่างเดสก์ท็อป หากผู้ใช้เลื่อนเส้นแบ่งในโหมดแยกหน้าจอเพื่อทำให้กิจกรรมมีขนาดเล็กกว่าขนาดขั้นต่ำที่ระบุไว้ ระบบจะครอบตัดกิจกรรมให้มีขนาดตามที่ผู้ใช้ขอ
โค้ดต่อไปนี้แสดงวิธีระบุขนาดและตำแหน่งเริ่มต้นของกิจกรรม รวมถึงขนาดขั้นต่ำเมื่อกิจกรรมแสดงในโหมดหน้าต่างเดสก์ท็อป
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end|..."
android:minHeight="450dp"
android:minWidth="300dp" />
</activity>
โหมดหลายหน้าต่างที่รันไทม์
ตั้งแต่ Android 7.0 เป็นต้นไป ระบบจะมีฟังก์ชันการทำงานเพื่อรองรับแอปที่ทำงานในโหมดหลายหน้าต่างได้
ฟีเจอร์ที่ปิดใช้ในโหมดหลายหน้าต่าง
ในโหมดหลายหน้าต่าง Android อาจปิดใช้หรือละเว้นฟีเจอร์ที่ไม่เกี่ยวข้องกับกิจกรรมที่แชร์หน้าจออุปกรณ์กับกิจกรรมหรือแอปอื่นๆ
นอกจากนี้ ระบบจะปิดใช้ตัวเลือกการปรับแต่ง UI บางอย่างด้วย เช่น แอปจะซ่อนแถบสถานะไม่ได้หากทำงานในโหมดหลายหน้าต่าง (ดูควบคุมการแสดง UI ของระบบ)
ระบบจะไม่สนใจการเปลี่ยนแปลงแอตทริบิวต์ android:screenOrientation
การค้นหาและการเรียกกลับในโหมดหลายหน้าต่าง
คลาส Activity
มีวิธีการต่อไปนี้เพื่อรองรับโหมดหลายหน้าต่าง
isInMultiWindowMode()
: ระบุว่ากิจกรรมอยู่ในโหมดหลายหน้าต่างหรือไม่isInPictureInPictureMode()
: ระบุว่ากิจกรรมอยู่ในโหมดภาพซ้อนภาพหรือไม่onMultiWindowModeChanged()
: ระบบจะเรียกใช้เมธอดนี้ทุกครั้งที่กิจกรรมเข้าสู่หรือออกจากโหมดหลายหน้าต่าง ระบบจะส่งค่า "จริง" ไปยังเมธอดหากกิจกรรมกำลังเข้าสู่โหมดหลายหน้าต่าง หรือส่งค่า "เท็จ" หากกิจกรรมกำลังออกจากโหมดหลายหน้าต่างonPictureInPictureModeChanged()
: ระบบจะเรียกใช้เมธอดนี้ทุกครั้งที่กิจกรรมเข้าสู่หรือออกจากโหมดภาพซ้อนภาพ ระบบจะส่งค่า "จริง" ไปยังเมธอดนี้หากกิจกรรมเข้าสู่โหมดภาพซ้อนภาพ หรือส่งค่า "เท็จ" หากกิจกรรมออกจากโหมดภาพซ้อนภาพ
คลาส Fragment
จะแสดงเวอร์ชันของเมธอดเหล่านี้หลายเวอร์ชัน เช่น
Fragment.onMultiWindowModeChanged()
โหมดการแสดงภาพซ้อนภาพ
หากต้องการเปิดกิจกรรมในโหมดภาพซ้อนภาพ ให้เรียกใช้ enterPictureInPictureMode()
วิธีนี้จะไม่มีผลหากอุปกรณ์ไม่รองรับโหมดภาพซ้อนภาพ ดูข้อมูลเพิ่มเติมได้ที่เพิ่มวิดีโอโดยใช้ฟีเจอร์ภาพซ้อนภาพ (PIP)
กิจกรรมใหม่ในโหมดหลายหน้าต่าง
เมื่อเปิดใช้งานกิจกรรมใหม่ คุณสามารถระบุว่าควรแสดงกิจกรรมใหม่ข้างกิจกรรมปัจจุบันได้หากเป็นไปได้ ใช้ Flag Intent FLAG_ACTIVITY_LAUNCH_ADJACENT
ซึ่งจะบอกให้ระบบพยายามสร้างกิจกรรมใหม่ในหน้าต่างที่อยู่ติดกันเพื่อให้กิจกรรม 2 รายการใช้หน้าจอร่วมกัน ระบบจะพยายามดำเนินการนี้อย่างดีที่สุด แต่ไม่ได้รับประกันว่าจะดำเนินการได้
หากอุปกรณ์อยู่ในโหมดหน้าต่างเดสก์ท็อปและคุณกำลังเปิดใช้งานกิจกรรมใหม่ คุณสามารถระบุขนาดและตำแหน่งบนหน้าจอของกิจกรรมใหม่ได้โดยเรียกใช้ ActivityOptions.setLaunchBounds()
เมธอดนี้จะไม่มีผลหากอุปกรณ์ไม่ได้อยู่ในโหมดหลายหน้าต่าง
ใน API ระดับ 30 และต่ำกว่า หากคุณเปิดใช้งานกิจกรรมภายในกองงาน กิจกรรมนั้นจะแทนที่กิจกรรมบนหน้าจอ โดยรับค่าพร็อพเพอร์ตี้แบบหลายหน้าต่างทั้งหมดของกิจกรรมนั้น หากต้องการเปิดกิจกรรมใหม่เป็นหน้าต่างแยกต่างหากในโหมดหลายหน้าต่าง คุณต้องเปิดกิจกรรมนั้นในกองงานใหม่
Android 12 (API ระดับ 31) ช่วยให้แอปสามารถแยกหน้าต่างงานของแอปพลิเคชันออกเป็นหลายกิจกรรมได้ คุณกำหนดวิธีที่แอปจะแสดงกิจกรรมได้ ไม่ว่าจะเป็นแบบเต็มหน้าจอ แสดงคู่กัน หรือซ้อนกัน โดยการสร้างไฟล์การกําหนดค่า XML หรือเรียกใช้ Jetpack WindowManager API
ลากและวาง
ผู้ใช้สามารถลากและวางข้อมูลจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่งได้ขณะที่กิจกรรมทั้ง 2 รายการแชร์หน้าจอ (ก่อน Android 7.0 ผู้ใช้จะลากและวางข้อมูลได้ภายในกิจกรรมเดียวเท่านั้น) หากต้องการเพิ่มการรองรับการยอมรับเนื้อหาที่วางอย่างรวดเร็ว ให้ดู DropHelper
API ดูคำแนะนำแบบครอบคลุมเกี่ยวกับการลากและวางได้ที่เปิดใช้การลากและวาง
อินสแตนซ์หลายรายการ
กิจกรรมรูทแต่ละรายการจะมีงานของตัวเอง ซึ่งทำงานในกระบวนการแยกต่างหากและแสดงในหน้าต่างของตัวเอง หากต้องการเปิดอินสแตนซ์ใหม่ของแอปในหน้าต่างแยกต่างหาก ให้เริ่มกิจกรรมใหม่ด้วย Flag FLAG_ACTIVITY_NEW_TASK
คุณสามารถรวมแอตทริบิวต์นี้เข้ากับแอตทริบิวต์หลายหน้าต่างบางรายการเพื่อขอตำแหน่งที่เจาะจงสำหรับหน้าต่างใหม่ เช่น แอปช็อปปิ้งสามารถแสดงหน้าต่างหลายหน้าต่างเพื่อเปรียบเทียบผลิตภัณฑ์
Android 12 (API ระดับ 31) ให้คุณเปิดกิจกรรม 2 อินสแตนซ์ควบคู่กันในหน้าต่างงานเดียวกันได้
หากต้องการอนุญาตให้ผู้ใช้เริ่มอินสแตนซ์อื่นของแอปพลิเคชันจากตัวเปิดแอปพลิเคชันหรือแถบงาน ให้ตรวจสอบว่ากิจกรรมของตัวเปิดแอปตั้งค่าเป็น android:resizeableActivity="true"
และไม่ได้ใช้โหมดเปิดใช้งานที่ป้องกันไม่ให้มีอินสแตนซ์หลายรายการ ตัวอย่างเช่น กิจกรรม singleInstancePerTask
สามารถสร้างขึ้นหลายครั้งในงานต่างๆ ได้เมื่อตั้งค่า FLAG_ACTIVITY_MULTIPLE_TASK
หรือ FLAG_ACTIVITY_NEW_DOCUMENT
อย่าสับสนระหว่างอินสแตนซ์หลายรายการกับเลย์เอาต์หลายแผง เช่น การแสดงรายละเอียดรายการที่ใช้ SlidingPaneLayout
ซึ่งทำงานภายในหน้าต่างเดียว
โปรดทราบว่าเมื่ออินสแตนซ์หลายรายการทำงานในหน้าต่างแยกกันบนอุปกรณ์แบบพับได้ ระบบอาจส่งอินสแตนซ์อย่างน้อย 1 รายการไปยังเบื้องหลังหากลักษณะการใช้งานเปลี่ยนแปลงไป ตัวอย่างเช่น สมมติว่าอุปกรณ์กางออกและมีอินสแตนซ์แอป 2 รายการที่ทำงานในหน้าต่าง 2 บานด้านข้างของรอยพับ หากพับอุปกรณ์ อินสแตนซ์หนึ่งอาจสิ้นสุดลงแทนที่จะพยายามปรับขนาดหน้าต่างของทั้ง 2 อินสแตนซ์ให้พอดีกับหน้าจอขนาดเล็ก
การยืนยันโหมดหลายหน้าต่าง
ไม่ว่าแอปของคุณจะกำหนดเป้าหมายเป็น API ระดับ 24 ขึ้นไปหรือไม่ คุณควรตรวจสอบลักษณะการทํางานของแอปในโหมดหลายหน้าต่างในกรณีที่ผู้ใช้พยายามเปิดแอปในโหมดหลายหน้าต่างบนอุปกรณ์ที่ใช้ Android 7.0 ขึ้นไป
ทดสอบอุปกรณ์
อุปกรณ์ที่ใช้ Android 7.0 (API ระดับ 24) ขึ้นไปจะรองรับโหมดหลายหน้าต่าง
API ระดับ 23 หรือต่ำกว่า
เมื่อผู้ใช้พยายามใช้แอปในโหมดหลายหน้าต่าง ระบบจะบังคับปรับขนาดแอป เว้นแต่แอปจะประกาศการวางแนวแบบคงที่
หากแอปไม่ได้ประกาศการวางแนวแบบคงที่ คุณควรเปิดแอปในอุปกรณ์ที่ใช้ Android 7.0 ขึ้นไป แล้วพยายามเปิดแอปในโหมดแยกหน้าจอ ยืนยันว่าประสบการณ์ของผู้ใช้ยอมรับได้เมื่อแอปถูกปรับขนาดโดยบังคับ
หากแอปประกาศการวางแนวแบบคงที่ คุณควรลองเปิดแอปในโหมดหลายหน้าต่าง ตรวจสอบว่าเมื่อคุณดำเนินการดังกล่าว แอปจะยังคงอยู่ในโหมดเต็มหน้าจอ
API ระดับ 24 ถึง 30
หากแอปกำหนดเป้าหมายเป็น API ระดับ 24 ถึง 30 และไม่ปิดใช้การรองรับหลายหน้าต่าง ให้ตรวจสอบลักษณะการทำงานต่อไปนี้ทั้งในโหมดแยกหน้าจอและโหมดหน้าต่างเดสก์ท็อป
เปิดแอปแบบเต็มหน้าจอ แล้วเปลี่ยนไปใช้โหมดหลายหน้าต่างโดยกดปุ่มล่าสุดค้างไว้ ยืนยันว่าแอปสลับอย่างถูกต้อง
เปิดแอปในโหมดหลายหน้าต่างโดยตรง และตรวจสอบว่าแอปเปิดขึ้นอย่างถูกต้อง คุณสามารถเปิดแอปในโหมดหลายหน้าต่างได้โดยกดปุ่มล่าสุด จากนั้นกดแถบชื่อของแอปค้างไว้แล้วลากไปยังพื้นที่ที่ไฮไลต์บนหน้าจอ
ปรับขนาดแอปในโหมดแยกหน้าจอโดยลากตัวแบ่งหน้าจอ ตรวจสอบว่าแอปปรับขนาดโดยไม่ขัดข้องและองค์ประกอบ UI ที่จำเป็นแสดงอยู่
หากคุณระบุขนาดขั้นต่ำสำหรับแอป ให้ลองปรับขนาดแอปเพื่อให้ขนาดหน้าต่างเล็กกว่าขนาดเหล่านั้น ยืนยันว่าคุณไม่สามารถปรับขนาดแอปให้เล็กกว่าขนาดขั้นต่ำที่ระบุ
ยืนยันประสิทธิภาพของแอปว่ายอมรับได้ตลอดการทดสอบ เช่น ตรวจสอบว่า UI อัปเดตไม่ช้าเกินไปหลังจากปรับขนาดแอป
API ระดับ 31 ขึ้นไป
หากแอปกำหนดเป้าหมายเป็น API ระดับ 31 ขึ้นไปและขนาดความกว้างขั้นต่ำและความสูงขั้นต่ำของกิจกรรมหลักน้อยกว่าหรือเท่ากับขนาดพื้นที่แสดงผลที่พร้อมใช้งาน ให้ยืนยันลักษณะการทำงานทั้งหมดที่ระบุไว้สำหรับ API ระดับ 24 ถึง 30
เช็กลิสต์การทดสอบ
หากต้องการยืนยันประสิทธิภาพของแอปในโหมดหลายหน้าต่าง ให้ลองดำเนินการต่อไปนี้ คุณควรลองดำเนินการเหล่านี้ทั้งในโหมดแยกหน้าจอและโหมดหน้าต่างเดสก์ท็อป ยกเว้นในกรณีที่ระบุไว้เป็นอย่างอื่น
เข้าสู่และออกจากโหมดหลายหน้าต่าง
เปลี่ยนจากแอปของคุณไปใช้แอปอื่น และตรวจสอบว่าแอปทำงานอย่างถูกต้องขณะที่มองเห็นแต่ไม่ได้ใช้งาน เช่น หากแอปเล่นวิดีโอ ให้ยืนยันว่าวิดีโอเล่นต่อไปขณะที่ผู้ใช้โต้ตอบกับแอปอื่น
ในโหมดแยกหน้าจอ ให้ลองเลื่อนตัวแบ่งหน้าจอเพื่อทำให้แอปทั้งใหญ่ขึ้นและเล็กลง ลองดำเนินการเหล่านี้ทั้งแบบวางเคียงข้างกันและแบบวางซ้อนกัน ตรวจสอบว่าแอปไม่ขัดข้อง มองเห็นฟังก์ชันการทำงานที่สำคัญ และการดำเนินการปรับขนาดใช้เวลาไม่นานเกินไป
ดำเนินการปรับขนาดหลายรายการติดต่อกันอย่างรวดเร็ว ยืนยันว่าแอปไม่ขัดข้องหรือมีการรั่วไหลของหน่วยความจำ เครื่องมือวิเคราะห์หน่วยความจำของ Android Studio ให้ข้อมูลเกี่ยวกับการใช้งานหน่วยความจำของแอป (ดูตรวจสอบการใช้งานหน่วยความจำของแอปด้วยเครื่องมือวิเคราะห์หน่วยความจำ)
ใช้แอปตามปกติในการกําหนดค่าหน้าต่างแบบต่างๆ และตรวจสอบว่าแอปทํางานอย่างถูกต้อง ตรวจสอบว่าข้อความอ่านได้และองค์ประกอบ UI ไม่ได้เล็กจนเกินไปจนโต้ตอบไม่ได้
ปิดใช้การรองรับหลายหน้าต่าง
ใน API ระดับ 24 ถึง 30 หากคุณปิดใช้การรองรับหลายหน้าต่างโดยการตั้งค่า android:resizeableActivity="false"
คุณควรเปิดแอปในอุปกรณ์ที่ใช้ Android 7.0 ถึง 11 และพยายามเปิดแอปในโหมดแยกหน้าจอและโหมดหน้าต่างเดสก์ท็อป ตรวจสอบว่าเมื่อคุณดำเนินการดังกล่าวแล้ว แอปจะยังคงอยู่ในโหมดเต็มหน้าจอ
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการรองรับหลายหน้าต่างใน Android ได้ที่
- ตัวอย่าง MultiWindowPlayground ของ Android
แนะนําให้คุณใช้ * หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่ * โหมดความเข้ากันได้ของอุปกรณ์ * รองรับการปรับขนาดหน้าจอขนาดใหญ่ * จัดการการเปลี่ยนแปลงการกําหนดค่า