หลายไฟล์

ใน Android 9 (และต่ำกว่า) ระบบจะป้อนแอปไปยังสถานะ PAUSED เมื่อ

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

สถานการณ์เหล่านี้แตกต่างกันในจำนวนครั้งที่แอปต้องหยุดชั่วคราว แต่ไม่สามารถแยกความแตกต่างได้ที่ระดับแอป

ใน Android 10 กิจกรรมที่เน้นได้ทั้งหมดในสแต็กที่มองเห็นได้จะอยู่ในสถานะ RESUMED ซึ่งจะช่วยปรับปรุงความเข้ากันได้กับโหมดหลายหน้าต่างและโหมด MD สำหรับแอปที่ใช้ onPause() แทน onStop() เพื่อหยุดการรีเฟรช UI และการโต้ตอบกับผู้ใช้ ซึ่งหมายความว่า

  • ระบบจะกลับมาทำงานต่อทั้ง 2 กิจกรรมในโหมดแยกหน้าจอ
  • ระบบจะกลับมาทำงานต่อในกิจกรรมที่มองเห็นได้ทั้งหมดในโหมดการแสดงหน้าต่างแบบอิสระ
  • คุณสามารถทำกิจกรรมบนหลายหน้าจอต่อได้พร้อมกัน

รูปที่ 1 การทำงานหลายอย่างพร้อมกันบนอุปกรณ์แบบพับได้

รูปที่ 2 การดาวน์โหลดต่อหลายรายการในโหมดเดสก์ท็อป

กิจกรรมอาจอยู่ในสถานะ PAUSED เมื่อไม่สามารถโฟกัสหรือถูกบดบังบางส่วน เช่น

  • ในหน้าจอแยกที่ย่อขนาด (โดยมี Launcher อยู่ด้านข้าง) ระบบจะไม่กลับมาทำงานต่อในกิจกรรมที่ด้านบนเนื่องจาก ไม่สามารถโฟกัสได้
  • ในโหมดการแสดงภาพซ้อนภาพ ระบบจะไม่กลับมาทำกิจกรรมต่อเนื่องจากไม่สามารถโฟกัสได้
  • เมื่อกิจกรรมได้รับการครอบคลุมโดยกิจกรรมอื่นๆ ที่โปร่งใสในสแต็กเดียวกัน

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

Android 10 มีการเรียกกลับใหม่เพื่อรักษา สัญญาณ resumed จาก Android รุ่นก่อนหน้า (และเพื่อสื่อสารเมื่อแอปควรได้รับสิทธิ์เข้าถึงทรัพยากรที่มีสิทธิ์เข้าถึงแบบพิเศษหรือทรัพยากรแบบ Singleton)

Activity#onTopResumedActivityChanged(boolean onTop)

เมื่อเรียกใช้ ระบบจะเรียกใช้การเรียกกลับนี้ระหว่าง Activity#onResume() และ Activity#onPause() การเรียกกลับนี้ไม่บังคับและสามารถข้ามได้ เพื่อให้กิจกรรมเปลี่ยนจากสถานะ RESUMED เป็น PAUSED โดยไม่ต้องเป็นกิจกรรมที่อยู่ด้านบนสุดในระบบ เช่น ในโหมดหลายหน้าต่าง เนื่องจาก Callback นี้ไม่บังคับ จึงไม่ได้เป็นส่วนหนึ่งของวงจร กิจกรรมและไม่ควรใช้บ่อย

กิจกรรมที่กลับมาทำงานต่อเป็นอันดับแรกก่อนหน้านี้จะรับและดำเนินการ onTopResumedActivity(false) ให้เสร็จสิ้นก่อนที่กิจกรรมที่กลับมาทำงานต่อเป็นอันดับแรกถัดไปจะรับ onTopResumedActivity(true) เว้นแต่กิจกรรมก่อนหน้าจะใช้เวลานานเกินไปในการจัดการการเรียกเมธอดและหมดเวลาที่ 500 มิลลิวินาที

ความเข้ากันได้

หากต้องการรักษาความเข้ากันได้เมื่อติดตั้งใช้งานฟีเจอร์เล่นต่อหลายรายการ ให้พิจารณาโซลูชันต่อไปนี้

กิจกรรมที่กลับมาทำงานต่อหลายรายการในกระบวนการของแอปเดียว

  • ปัญหา ใน Android 9 และเวอร์ชันต่ำกว่า จะมีเพียงกิจกรรมเดียวในระบบที่ กลับมาทำงานต่อได้ในแต่ละครั้ง การเปลี่ยนจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่งทั้งหมดเกี่ยวข้องกับการหยุดกิจกรรมชั่วคราวก่อนที่จะกลับมาทำกิจกรรมอื่นต่อ แอปและเฟรมเวิร์กบางอย่าง (เช่น Flutter หรือ LocalActivityManager ของ Android) ใช้ข้อเท็จจริงนี้และจัดเก็บสถานะเกี่ยวกับกิจกรรมที่กลับมาทำงานต่อใน Singleton
  • วิธีแก้ปัญหา ใน Android 9 และเวอร์ชันที่ต่ำกว่า หากกิจกรรม 2 รายการจากกระบวนการเดียวกัน กลับมาทำงานต่อทั้งคู่ ระบบจะกลับมาทำงานต่อเฉพาะกิจกรรมที่มีลำดับ Z สูงกว่า แอปที่กำหนดเป้าหมายเป็น Android 10 สามารถรองรับกิจกรรมหลายอย่าง ที่กลับมาทำงานต่อได้พร้อมกัน

การเข้าถึงกล้องพร้อมกัน

  • ปัญหา ปัญหานี้ยังพบใน Android 9 และเวอร์ชันที่ต่ำกว่าด้วย ตัวอย่างเช่น กิจกรรมที่เต็มหน้าจอและกิจกรรมที่กลับมาทำงานต่ออาจสูญเสียโฟกัสของกล้องไปให้กับกิจกรรมที่หยุดชั่วคราวซึ่งอยู่ด้านบนในโหมดการแสดงภาพซ้อนภาพ แต่จะมีการเปิดเผยมากขึ้นเมื่อมีการนำโหมดหลายหน้าต่างและโหมดหลายจอมาใช้ในวงกว้าง
    • เนื่องจากการเปลี่ยนแปลงที่เกิดขึ้นกับRESUMEสถานะ แอปอาจถูก ยกเลิกการเชื่อมต่อจากกล้องแม้ว่าจะกลับมาทำงานต่อแล้วก็ตาม เพื่อแก้ไขปัญหานี้ แอป ต้องจัดการการตัดการเชื่อมต่อกล้องโดยไม่ขัดข้อง เมื่อยกเลิกการเชื่อมต่อ แอปจะได้รับการเรียกกลับที่ ยกเลิกการเชื่อมต่อ และการเรียกทั้งหมดไปยัง API จะเริ่มแสดง CameraAccessException
    • resizeableActivity=false ไม่ใช่การรับประกันการเข้าถึงกล้องแบบพิเศษ เนื่องจากแอปอื่นๆ ที่ใช้กล้องสามารถเปิดได้ในจอแสดงผลอื่นๆ
  • วิธีแก้ไขปัญหา นักพัฒนาแอปควรใส่ตรรกะสำหรับกรณีที่แอป ถูกยกเลิกการเชื่อมต่อจากกล้อง หากแอปยกเลิกการเชื่อมต่อจากกล้อง แอป ควรดูการเรียกกลับความพร้อมใช้งานของกล้องเพื่อลองเชื่อมต่อใหม่และใช้กล้องต่อไป นอกเหนือจากCameraManager#AvailabilityCallback#onCameraAvailable()การเรียกกลับ ที่มีอยู่แล้ว Android 10 ยังได้เพิ่มCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() ซึ่งครอบคลุมกรณีที่โฟกัส (และลำดับความสำคัญของกล้อง) สลับไปมาระหว่างกิจกรรมที่กลับมาทำงานต่อหลายรายการ นักพัฒนาแอปควรใช้ทั้ง 2 การเรียกกลับนี้เพื่อ พิจารณาเวลาที่เหมาะสมในการพยายามขอสิทธิ์เข้าถึงกล้อง

การกลับไปที่ต้นประโยค

ใน Android 10 สถานะวงจรของกิจกรรมจะกำหนดโดยระดับการมองเห็นและ ลำดับ Z หากต้องการตรวจสอบว่าสถานะถูกต้องหลังจากอัปเดตระดับการมองเห็นในกิจกรรมและประเมินว่าสถานะวงจรใดที่เกี่ยวข้อง ให้เรียกใช้เมธอด ActivityRecord#makeActiveIfNeeded() จากตำแหน่งต่างๆ ใน Android 10 คำว่า "ใช้งานอยู่" หมายถึง RESUMED หรือ PAUSED และใช้ได้ใน 2 กรณีนี้เท่านั้น

ใน Android 10 การติดตามการกลับมาทำงานต่อของกิจกรรมจะแยกกันในแต่ละสแต็ก แทนที่จะอยู่ในตำแหน่งเดียวในระบบ เนื่องจากสามารถเปลี่ยนกิจกรรมหลายอย่างพร้อมกันในโหมดหลายหน้าต่างได้ ดูรายละเอียดได้ที่ ActivityStack#mInResumeTopActivity

การเรียกกลับของกิจกรรมที่กลับมาทำงานต่อ

หลังจากดำเนินการที่อาจส่งผลให้เกิดการเปลี่ยนแปลงกิจกรรมสูงสุด (เช่น การเปิดใช้งานกิจกรรม การกลับมาทำงานต่อ หรือการเปลี่ยนแปลงลำดับ Z) ActivityStackSupervisor#updateTopResumedActivityIfNeeded() จะได้รับการเรียกใช้ เมธอดนี้จะตรวจสอบว่ากิจกรรมที่กลับมาทำงานต่อที่อยู่ด้านบนสุดมีการเปลี่ยนแปลงหรือไม่ และจะอัปเดตหากจำเป็น หากกิจกรรมที่กลับมาทำงานต่อเป็นอันดับแรกก่อนหน้านี้ยังไม่ได้ปล่อยสถานะที่กลับมาทำงานต่อเป็นอันดับแรก ระบบจะส่งข้อความการสูญเสียสถานะที่กลับมาทำงานต่อเป็นอันดับแรกไปยังกิจกรรมดังกล่าวและกำหนดเวลาหมดทางฝั่งเซิร์ฟเวอร์ (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()) ระบบจะส่งรายงานสถานะที่กลับมาทำงานต่อเป็นอันดับแรกไปยังกิจกรรมถัดไปหลังจากที่กิจกรรมก่อนหน้าปล่อยสถานะ หรือเมื่อถึงเวลาหมด (ดูการใช้งานของ:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

เพิ่มTopResumedActivityChangeItemรายการธุรกรรมใหม่ เพื่อรายงานการเปลี่ยนแปลงสถานะที่กลับมาทำงานต่อสูงสุดไปยังไคลเอ็นต์ และใช้ประโยชน์จากสถาปัตยกรรม ActivityLifecycler จาก Android 9

ระบบจะจัดเก็บสถานะที่กลับมาทำงานต่อที่ด้านบนในฝั่งไคลเอ็นต์ และทุกครั้งที่กิจกรรมเปลี่ยนไปเป็น RESUMED หรือ PAUSED ระบบจะตรวจสอบด้วยว่าควรเรียกใช้แฮนเดิลเลอร์ onTopResumedActivityChanged() หรือไม่ ซึ่งจะช่วยให้การสื่อสารสถานะวงจรของแอป และสถานะที่กลับมาทำงานต่อที่ด้านบนระหว่างฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์มีความยืดหยุ่นมากขึ้น