支持多窗口模式

โหมดหลายหน้าต่างช่วยให้แอปหลายแอปใช้หน้าจอเดียวกันได้พร้อมกัน แอปอาจแสดงอยู่ข้างกันหรือซ้อนทับกัน (โหมดแยกหน้าจอ) แอปเดียวในหน้าต่างขนาดเล็กที่วางซ้อนกับแอปอื่นๆ (โหมดภาพซ้อนภาพ) หรือแอปแต่ละแอปในหน้าต่างแยกต่างหากที่ย้ายและปรับขนาดได้ (โหมดหน้าต่างเดสก์ท็อป)

รูปที่ 1 แสดงแอป 2 แอปพร้อมกันในโหมดแยกหน้าจอ

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

โหมดแยกหน้าจอ

ผู้ใช้เปิดใช้งานโหมดแยกหน้าจอได้โดยทำดังนี้

  1. เปิดหน้าจอล่าสุด
  2. ปัดแอปให้แสดง
  3. กดไอคอนแอปในแถบชื่อแอป
  4. เลือกตัวเลือกเมนูการแยกหน้าจอ
  5. เลือกแอปอื่นจากหน้าจอล่าสุด หรือปิดหน้าจอล่าสุดแล้วเรียกใช้แอปอื่น

ผู้ใช้จะออกจากโหมดแยกหน้าจอได้โดยลากตัวแบ่งหน้าต่างไปยังขอบของหน้าจอ ไม่ว่าจะขึ้นหรือลง ซ้ายหรือขวา

เปิดแอปที่อยู่ติดกัน

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

รูปที่ 2 กล้องในโหมดหลายหน้าต่าง

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

หลังจากที่แอปได้รับ CameraDevice.StateCallback#onDisconnected() callbacks แล้ว การเรียกใช้อุปกรณ์กล้องในภายหลังจะแสดง CameraAccessException

การแสดงผลหลายจอ

Android 10 (API ระดับ 29) รองรับกิจกรรมในจอแสดงผลรอง หากมีกิจกรรมที่ทำงานอยู่ในอุปกรณ์ที่มีจอแสดงผลหลายจอ ผู้ใช้จะย้ายกิจกรรมจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่งได้ การกลับมาทำงานหลายรายการพร้อมกันใช้ได้กับสถานการณ์หลายหน้าจอด้วย โดยกิจกรรมหลายรายการสามารถรับอินพุตจากผู้ใช้พร้อมกันได้

แอปสามารถระบุจอแสดงผลที่ควรทำงานเมื่อเปิดหรือสร้างกิจกรรมอื่น ลักษณะการทํางานนี้ขึ้นอยู่กับโหมดการเริ่มกิจกรรมที่กําหนดไว้ในไฟล์ Manifest และ Flag ของ Intent และตัวเลือกที่ตั้งค่าโดยเอนทิตีที่เริ่มกิจกรรม ดูรายละเอียดเพิ่มเติมได้ที่คลาส ActivityOptions

เมื่อกิจกรรมย้ายไปยังจอแสดงผลรอง กิจกรรมอาจได้รับการอัปเดตบริบท การปรับขนาดหน้าต่าง รวมถึงการเปลี่ยนแปลงการกำหนดค่าและทรัพยากร หากกิจกรรมจัดการการเปลี่ยนแปลงการกําหนดค่าได้ ระบบจะแจ้งให้ทราบใน onConfigurationChanged() ไม่เช่นนั้น ระบบจะเปิดกิจกรรมอีกครั้ง

กิจกรรมควรตรวจสอบการแสดงผลปัจจุบันใน onCreate() และ onConfigurationChanged() หากจัดการการเปลี่ยนแปลงการกําหนดค่า อย่าลืมอัปเดตทรัพยากรและเลย์เอาต์เมื่อการแสดงผลมีการเปลี่ยนแปลง

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

รูปที่ 3. กิจกรรมหลายอินสแตนซ์ในหลายจอแสดงผล

นอกจากนี้ คุณยังอาจต้องอ่านเกี่ยวกับ 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 รองรับแป้นพิมพ์ซอฟต์แวร์ วอลเปเปอร์ และตัวเปิดแอปแบบหลายจอภาพ

แป้นพิมพ์เสมือน

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

รูปที่ 4 แป้นพิมพ์บนจอแสดงผลรอง

วอลเปเปอร์

ใน Android 10 (API ระดับ 29) หน้าจอรองจะมีวอลเปเปอร์ได้ เฟรมเวิร์กจะสร้างอินสแตนซ์ WallpaperService.Engine แยกกันสําหรับการแสดงผลแต่ละรายการ ตรวจสอบว่าพื้นผิวของเครื่องยนต์แต่ละเครื่องวาดแยกกัน นักพัฒนาซอฟต์แวร์จะโหลดชิ้นงานได้โดยใช้บริบทการแสดงผลใน WallpaperService.Engine#getDisplayContext() และตรวจสอบว่าไฟล์ WallpaperInfo.xml ของคุณตั้งค่าเป็น android:supportsMultipleDisplays="true"

รูปที่ 5 วอลเปเปอร์ในโทรศัพท์และจอแสดงผลรอง

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

รูปที่ 6 Launcher ดีไซน์ Material ในโทรศัพท์
รูปที่ 7 Launcher แบบ Material Design ในจอแสดงผลรอง

เมตริกกรอบเวลา

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 ได้ที่

แนะนําให้คุณใช้ * หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่ * โหมดความเข้ากันได้ของอุปกรณ์ * รองรับการปรับขนาดหน้าจอขนาดใหญ่ * จัดการการเปลี่ยนแปลงการกําหนดค่า