การเปลี่ยนแปลงสถานะกิจกรรม

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับสถานะกิจกรรมได้ที่ วงจรกิจกรรม ดูข้อมูลเกี่ยวกับวิธีที่คลาส ViewModel ช่วยคุณจัดการวงจรการทำงานของกิจกรรมได้ที่ ภาพรวมของ ViewModel

สำหรับการเปลี่ยนแปลงกิจกรรมส่วนใหญ่ คุณไม่จำเป็นต้องตอบกลับโดยตรงไปยัง Callback ในวงจรกิจกรรม เนื่องจาก Compose สร้าง UI ใหม่จากสถานะ คุณจึงใช้ ประโยชน์จากการสร้างใหม่โดยอัตโนมัติได้ด้วยการจัดเก็บสถานะไว้ใน ตำแหน่งที่เหมาะสม เช่น rememberSaveable หรือ ViewModel

เกิดการเปลี่ยนแปลงการกำหนดค่า

มีเหตุการณ์หลายอย่างที่สามารถเรียกให้เกิดการเปลี่ยนแปลงการกำหนดค่า ตัวอย่างที่เห็นได้ชัดที่สุดคือการเปลี่ยนแปลงระหว่างการวางแนวตั้งและการวางแนวนอน กรณีอื่นๆ ที่อาจทำให้เกิดการเปลี่ยนแปลงการกำหนดค่า ได้แก่ การเปลี่ยนแปลงการตั้งค่าภาษาหรืออุปกรณ์ป้อนข้อมูล

เมื่อเกิดการเปลี่ยนแปลงการกำหนดค่า ระบบจะทำลายและสร้างกิจกรรมขึ้นใหม่ ซึ่งจะเรียกการเรียกกลับต่อไปนี้ในอินสแตนซ์กิจกรรมเดิม

  1. onPause
  2. onStop
  3. onDestroy

ระบบจะสร้างอินสแตนซ์กิจกรรมใหม่และเรียกการเรียกกลับต่อไปนี้

  1. onCreate
  2. onStart
  3. onResume

ใน Compose คุณไม่จำเป็นต้องโต้ตอบกับการเรียกกลับเหล่านี้โดยตรง แต่ให้ใช้ Lifecycle API เพื่อสังเกตการเปลี่ยนแปลงสถานะแทน ใน Compose คุณสามารถใช้ LocalLifecycleOwner.current เพื่อรับวงจรปัจจุบันและเพิ่ม Observer ซึ่งจะช่วยให้คุณตอบสนองต่อเหตุการณ์ต่างๆ ได้

ใช้การผสมผสานระหว่างอินสแตนซ์ ViewModel, rememberSaveable หรือที่เก็บข้อมูลในเครื่องแบบถาวรเพื่อรักษาสถานะ UI ของกิจกรรมไว้เมื่อมีการเปลี่ยนแปลงการกำหนดค่า การตัดสินใจว่าจะรวมตัวเลือกเหล่านี้เข้าด้วยกันอย่างไรจะขึ้นอยู่กับความซับซ้อนของข้อมูล UI, Use Case สำหรับแอป และการพิจารณาความเร็วในการดึงข้อมูลเทียบกับการใช้งานหน่วยความจำ สำหรับกรณีการใช้งานส่วนใหญ่ คุณควรย้ายสถานะไปไว้ใน ViewModel และใช้ rememberSaveable เพื่อให้แน่ใจว่าสถานะจะยังคงอยู่เมื่อมีการเปลี่ยนแปลงการกำหนดค่าและการสิ้นสุดการประมวลผลที่ระบบเป็นผู้เริ่ม ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึก สถานะ UI ของกิจกรรมได้ที่หัวข้อ บันทึกสถานะ UI

เมื่อมีการสร้างกิจกรรมขึ้นใหม่เนื่องจากการเปลี่ยนแปลงการกำหนดค่า ระบบจะล้างการคอมโพสครั้งแรก การใช้ ViewModel หรือ rememberSaveable จะช่วยให้มั่นใจได้ว่าระบบจะกู้คืนสถานะ UI ในการคอมโพสใหม่

ดูข้อมูลเพิ่มเติมได้ที่หัวข้อวงจรการทำงานใน Jetpack Compose และสถานะและ Jetpack Compose

จัดการกรณีที่ใช้หลายหน้าต่าง

เมื่อแอปเข้าสู่โหมดหลายหน้าต่าง ซึ่งมีให้บริการใน Android 7.0 (ระดับ API 24) ขึ้นไป ระบบจะแจ้งให้กิจกรรมที่กำลังทำงานทราบถึงการเปลี่ยนแปลงการกำหนดค่า ซึ่งจะทำให้กิจกรรมผ่านการเปลี่ยนสถานะวงจรการทำงานตามที่อธิบายไว้ก่อนหน้านี้

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรการทำงานของโหมดหลายหน้าต่างได้ที่คำอธิบายของ วงจรการทำงานของโหมดหลายหน้าต่างในหัวข้อรองรับโหมดหลายหน้าต่าง

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

เมื่อผู้ใช้เปลี่ยนจากแอป A ไปเป็นแอป B ระบบจะเรียก onPause ในแอป A และ onResume ในแอป B ระบบจะสลับระหว่าง 2 วิธีนี้ทุกครั้งที่ผู้ใช้สลับไปมาระหว่างแอป

ดูรายละเอียดเพิ่มเติมเกี่ยวกับโหมดหลายหน้าต่างได้ที่ หัวข้อรองรับโหมดหลายหน้าต่าง

กิจกรรมหรือกล่องโต้ตอบปรากฏขึ้นเบื้องหน้า

หากกิจกรรมหรือกล่องโต้ตอบใหม่ปรากฏขึ้นเบื้องหน้า โดยรับโฟกัสและบังกิจกรรมที่กำลังดำเนินการอยู่บางส่วน กิจกรรมที่ถูกบังจะสูญเสียโฟกัสและเข้าสู่สถานะหยุดชั่วคราว จากนั้นระบบจะเรียก onPause ในกิจกรรมดังกล่าว

เมื่อกิจกรรมที่ถูกบังกลับมาอยู่เบื้องหน้าและได้รับโฟกัสอีกครั้ง ระบบจะเรียก onResume

หากกิจกรรมหรือกล่องโต้ตอบใหม่ปรากฏขึ้นเบื้องหน้า โดยรับโฟกัสและบังกิจกรรมที่กำลังดำเนินการอยู่ทั้งหมด กิจกรรมที่ถูกบังจะสูญเสียโฟกัสและเข้าสู่สถานะหยุด จากนั้นระบบจะเรียก onPause และ onStop อย่างรวดเร็ว

เมื่ออินสแตนซ์เดียวกันของกิจกรรมที่ถูกบังกลับมาอยู่เบื้องหน้า ระบบจะเรียก onRestart, onStart และ onResume ในกิจกรรม หากเป็นอินสแตนซ์ใหม่ของกิจกรรมที่ถูกบังที่มาอยู่เบื้องหลัง ระบบจะไม่เรียก onRestart แต่จะเรียกเฉพาะ onStart และ onResume

การสร้างใหม่จะไม่ได้รับผลกระทบจากกล่องโต้ตอบที่ปรากฏขึ้นเบื้องหน้า อย่างไรก็ตาม เอฟเฟกต์ข้างเคียงที่เชื่อมโยงกับวงจรการทำงาน เช่น Flow และภาพเคลื่อนไหว ควรใช้ API ที่รับรู้ถึงวงจรการทำงาน (เช่น collectAsStateWithLifecycle) เพื่อ หยุดชั่วคราวและกลับมาทำงานต่อโดยอัตโนมัติตามความจำเป็น ดูข้อมูลเพิ่มเติมได้ที่หัวข้อสถานะ และ Jetpack Compose

ผู้ใช้แตะหรือใช้ท่าทางสัมผัสเพื่อย้อนกลับ

หากกิจกรรมอยู่เบื้องหน้าและผู้ใช้แตะหรือใช้ท่าทางสัมผัสเพื่อย้อนกลับ กิจกรรมจะเปลี่ยนสถานะผ่านการเรียกกลับ onPause, onStop และ onDestroy ระบบจะทำลายกิจกรรมและนำออกจาก Back Stack

ในแอปที่มีกิจกรรมเดียว เช่น แอป Compose ส่วนใหญ่ rememberSaveable จะไม่รักษาสถานะไว้หากมีการนำ Composable ออกจาก Back Stack ของการนำทาง เนื่องจากเมื่อผู้ใช้แตะย้อนกลับ ผู้ใช้ไม่ได้คาดหวังว่าจะกลับไปที่อินสแตนซ์เดิม ดังนั้นระบบจึงล้างสถานะทั้งหมด

หากต้องการใช้ลักษณะการทำงานย้อนกลับที่กำหนดเอง เช่น การแสดงกล่องโต้ตอบที่ขอให้ผู้ใช้ยืนยันว่าต้องการออกจากแอป ให้ใช้ NavigationEventHandler API

ระบบสิ้นสุดกระบวนการของแอป

หากแอปอยู่ในเบื้องหลังและระบบต้องการเพิ่มหน่วยความจำให้กับแอปที่ทำงานอยู่เบื้องหน้า ระบบจะสิ้นสุดแอปเบื้องหลังได้ เมื่อระบบสิ้นสุดแอป จะไม่มีการรับประกันว่าจะมีการเรียก onDestroy ในแอป

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

ดูวิธีบันทึกสถานะ UI ของกิจกรรมเมื่อระบบสิ้นสุดกระบวนการของแอป ได้ที่หัวข้อการบันทึกและการกู้คืนสถานะ UI ชั่วคราว