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

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

รูปที่ 2 โหมดหลายหน้าต่างในโหมดเดสก์ท็อป
กิจกรรมอาจอยู่ในสถานะ PAUSED เมื่อไม่สามารถโฟกัสได้หรือถูกบดบังบางส่วน เช่น
- ในโหมดแยกหน้าจอที่ย่อเล็กสุด (โดยมี Launcher อยู่ด้านข้าง) กิจกรรมที่อยู่ด้านบนจะไม่กลับมาทำงานต่อเนื่องจากโฟกัสไม่ได้
- ในโหมดการแสดงภาพซ้อนภาพ กิจกรรมจะไม่กลับมาทำงานต่อเนื่องจากโฟกัสไม่ได้
- เมื่อกิจกรรมถูกกิจกรรมโปร่งใสอื่นๆ ในสแต็กเดียวกันครอบคลุม
แนวทางนี้จะระบุให้แอปทราบว่ากิจกรรมจะรับอินพุตจากผู้ใช้ได้เฉพาะในสถานะ RESUMED ก่อน Android 10 กิจกรรมยังรับอินพุตในสถานะ PAUSED ได้ด้วย (เช่น ลองแตะกิจกรรมทั้ง 2 รายการในโหมดแยกหน้าจอพร้อมกันในอุปกรณ์ที่ใช้ Android 9)
Android 10 มีการเรียกกลับใหม่เพื่อรักษาการส่งสัญญาณ กลับมาทำงานต่อ จาก Android เวอร์ชันก่อนหน้า (และเพื่อแจ้งให้ทราบเมื่อแอปควรได้รับสิทธิ์เข้าถึงทรัพยากรที่มีสิทธิ์เข้าถึงแบบพิเศษหรือทรัพยากร Singleton)
Activity#onTopResumedActivityChanged(boolean onTop)
เมื่อเรียกใช้ การเรียกกลับนี้จะเกิดขึ้นระหว่าง Activity#onResume() กับ Activity#onPause() การเรียกกลับนี้ไม่บังคับและข้ามได้ ดังนั้นกิจกรรมจึงเปลี่ยนจากสถานะ RESUMED เป็นสถานะ PAUSED ได้โดยไม่ต้องเป็นกิจกรรมที่อยู่ด้านบนสุดในระบบ เช่น ในโหมดหลายหน้าต่าง
เนื่องจากการเรียกกลับนี้ไม่บังคับ จึงไม่ได้เป็นส่วนหนึ่งของ วงจรกิจกรรม และไม่ควรใช้บ่อยนัก
กิจกรรมที่กลับมาทำงานต่อและอยู่ด้านบนก่อนหน้านี้จะได้รับการเรียกใช้และดำเนินการ 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() หรือไม่ ซึ่งจะช่วยให้การสื่อสารสถานะวงจรและสถานะที่กลับมาทำงานต่อและอยู่ด้านบนระหว่างฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์แยกออกจากกันได้