ใน Android 9 (และเวอร์ชันต่ำกว่า) แอปจะเข้าสู่สถานะ PAUSED
ในกรณีต่อไปนี้
- กิจกรรมใหม่แบบโปร่งแสงเปิดตัวที่ด้านบนของแอปขณะที่แอปยังคงมองเห็นได้อยู่ (ดังนั้นเราจึงไม่ได้หยุดทำงาน)
- กิจกรรมเสียโฟกัส แต่ผู้ใช้สามารถโต้ตอบกับกิจกรรมดังกล่าวได้ เช่น ในโหมดหลายหน้าต่าง ผู้ใช้จะเห็นกิจกรรมหลายรายการและรับการป้อนข้อมูลด้วยการสัมผัสได้พร้อมกัน
สถานการณ์เหล่านี้แตกต่างกันไปตามจํานวนการหยุดชั่วคราวที่แอปต้องทํา แต่ไม่สามารถแยกความแตกต่างได้ที่ระดับแอป
ใน Android 10 กิจกรรมที่โฟกัสได้ที่ด้านบนทั้งหมดในกองที่มองเห็นได้จะอยู่ในรูปแบบRESUMED
ซึ่งปรับปรุงความเข้ากันได้กับโหมดหลายหน้าต่างและโหมด MD สำหรับแอปที่ใช้ onPause()
แทน onStop()
เพื่อหยุดรีเฟรช UI และโต้ตอบกับผู้ใช้ ซึ่งหมายความว่า
- กิจกรรมทั้ง 2 รายการในโหมดแยกหน้าจอจะกลับมาทำงานอีกครั้ง
- กิจกรรมที่มองเห็นได้บนสุดทั้งหมดในโหมดกรอบเวลารูปแบบอิสระจะกลับมาทำงานอีกครั้ง
- คุณสามารถกลับมาดำเนินการกิจกรรมบนหน้าจอหลายหน้าจอพร้อมกันได้
รูปที่ 1 กลับมาใช้งานต่อได้บนอุปกรณ์แบบพับได้
รูปที่ 2 ดำเนินการต่อหลายรายการในโหมดเดสก์ท็อป
กิจกรรมอาจอยู่ในสถานะ PAUSED
เมื่อโฟกัสไม่ได้หรือถูกบดบังบางส่วน เช่น
- ในโหมดแยกหน้าจอที่ย่ออยู่ (โดยมีตัวเปิดแอปอยู่ด้านข้าง) กิจกรรมด้านบนจะไม่กลับมาทำงานต่อเนื่องจากไม่สามารถโฟกัสได้
- ในโหมดภาพซ้อนภาพ กิจกรรมจะไม่กลับมาทำงานต่อเนื่องจากโหมดนี้ไม่สามารถโฟกัสได้
- เมื่อกิจกรรมอยู่ภายใต้กิจกรรมที่โปร่งใสอื่นๆ ในกองเดียวกัน
วิธีนี้บ่งบอกให้แอปทราบว่ากิจกรรมจะรับอินพุตจากผู้ใช้ได้ในสถานะ RESUMED
เท่านั้น ก่อน Android 10 กิจกรรมยังรับอินพุตในสถานะ PAUSED
ได้ด้วย (เช่น ลองแตะทั้ง 2 กิจกรรมในโหมดแยกหน้าจอพร้อมกันในอุปกรณ์ที่ใช้ Android 9)
Android 10 มีคอลแบ็กใหม่เพื่อรักษาสัญญาณกลับมาทำงานต่อจาก Android เวอร์ชันก่อนหน้า (และเพื่อสื่อสารเมื่อแอปควรได้รับสิทธิ์เข้าถึงทรัพยากรที่มีสิทธิ์เข้าถึงเฉพาะตัวหรือทรัพยากรแบบ Singleton) ดังนี้
Activity#onTopResumedActivityChanged(boolean onTop)
เมื่อเรียกใช้ ระบบจะเรียก Callback นี้ระหว่าง Activity#onResume()
ถึง Activity#onPause()
คุณจะเรียกใช้การเรียกกลับนี้หรือไม่ก็ได้และข้ามได้เพื่อให้กิจกรรมเปลี่ยนจากสถานะ RESUMED
เป็น PAUSED
ได้โดยไม่ต้องเป็นกิจกรรมบนสุดในระบบ เช่น ในโหมดหลายหน้าต่าง
เนื่องจาก Callback นี้เป็นตัวเลือกที่ไม่บังคับ จึงไม่ได้เป็นส่วนหนึ่งของวงจรกิจกรรมและควรไม่ค่อยได้ใช้
กิจกรรมที่กลับมาทำงานต่อจากด้านบนรายการก่อนหน้าจะรับและดำเนินการ onTopResumedActivity(false)
จนเสร็จสิ้นก่อนที่กิจกรรมที่กลับมาทำงานต่อจากด้านบนรายการถัดไปจะรับ onTopResumedActivity(true)
เว้นแต่ว่ากิจกรรมก่อนหน้าจะใช้เวลานานเกินไปในการจัดการการเรียกเมธอดและหมดเวลา 500 มิลลิวินาที
ความเข้ากันได้
หากต้องการรักษาความเข้ากันได้เมื่อใช้ Resume หลายรายการ ให้พิจารณาใช้โซลูชันต่อไปนี้
กิจกรรมที่กลับมาทำงานต่อหลายรายการในกระบวนการของแอปเดียว
- ปัญหา ใน 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
Callback กิจกรรมที่กลับมาได้รับความนิยมอีกครั้ง
หลังจากการดําเนินการที่อาจทําให้กิจกรรมบนสุดมีการเปลี่ยนแปลง (เช่น การเริ่มกิจกรรม การกลับมาทํางานต่อ หรือการเปลี่ยนแปลงลําดับชั้น Z) ระบบจะเรียกใช้ ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
วิธีนี้จะตรวจสอบว่ากิจกรรมที่กลับมาทำงานอีกครั้งซึ่งอยู่ด้านบนสุดมีการเปลี่ยนแปลงหรือไม่ และจะทำการอัปเดตหากจําเป็น หากกิจกรรมที่กลับมาทำงานต่อสูงสุดก่อนหน้านี้ยังไม่ได้ปล่อยสถานะที่กลับมาทำงานต่อสูงสุด ระบบจะส่งข้อความการสูญเสียสถานะที่กลับมาทำงานต่อสูงสุดไปยังกิจกรรมดังกล่าวและกำหนดเวลาหมดเวลาฝั่งเซิร์ฟเวอร์ (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
) ระบบจะส่งรายงานสถานะที่กลับมาทำงานต่อสูงสุดไปยังกิจกรรมถัดไปหลังจากที่กิจกรรมก่อนหน้าปล่อยสถานะดังกล่าว หรือเมื่อหมดเวลา (ดูการใช้งานของ
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
เพิ่มรายการธุรกรรม TopResumedActivityChangeItem
รายการใหม่เพื่อรายงานการเปลี่ยนแปลงสถานะ "กลับมาทำงานต่อจากด้านบน" ไปยังไคลเอ็นต์ และใช้ประโยชน์จากสถาปัตยกรรม ActivityLifecycler
จาก Android 9
ระบบจะจัดเก็บสถานะ "กลับมาทำงานต่อจากด้านบน" ไว้ฝั่งไคลเอ็นต์ และทุกครั้งที่กิจกรรมเปลี่ยนเป็น RESUMED
หรือ PAUSED
ระบบจะตรวจสอบด้วยว่าควรเรียกใช้การเรียกกลับ onTopResumedActivityChanged()
หรือไม่ ซึ่งช่วยให้สามารถแยกการโค้ดบางส่วนในการสื่อสารสถานะวงจรชีวิตของเซิร์ฟเวอร์และสถานะที่กลับมาทำงานต่อด้านบนระหว่างฝั่งเซิร์ฟเวอร์และไคลเอ็นต์