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