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

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

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

การเปลี่ยนแปลงการกําหนดค่าเกิดขึ้น

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

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

  1. onPause()
  2. onStop()
  3. onDestroy()

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

  1. onCreate()
  2. onStart()
  3. onResume()

ใช้อินสแตนซ์ ViewModel, เมธอด onSaveInstanceState() หรือพื้นที่เก็บข้อมูลในเครื่องแบบถาวรร่วมกันเพื่อรักษาสถานะ UI ของกิจกรรมไว้ท่ามกลางการเปลี่ยนแปลงการกําหนดค่า การเลือกวิธีรวมตัวเลือกเหล่านี้ขึ้นอยู่กับความซับซ้อนของข้อมูล UI, กรณีการใช้งานสําหรับแอป และการพิจารณาความเร็วในการดึงข้อมูลเทียบกับการใช้หน่วยความจํา ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกสถานะ UI ของกิจกรรมได้ที่หัวข้อบันทึกสถานะ UI

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

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

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

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

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

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

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

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

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

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

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

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

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

หากกิจกรรมอยู่เบื้องหน้าและผู้ใช้แตะหรือใช้ท่าทางสัมผัส "กลับ" กิจกรรมจะเปลี่ยนผ่านonPause(), onStop() และonDestroy() callbacks ระบบจะทำลายและนำกิจกรรมออกจากกองซ้อนด้านหลัง

โดยค่าเริ่มต้น ในกรณีนี้ ฟังก์ชันการเรียกกลับ onSaveInstanceState() จะไม่ทํางาน ลักษณะการทํางานนี้ถือว่าผู้ใช้แตะ "กลับ" โดยไม่ได้คาดหวังว่าจะกลับไปที่อินสแตนซ์เดิมของกิจกรรม

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

หากคุณลบล้างเมธอด onBackPressed() เราขอแนะนําอย่างยิ่งให้คุณยังคงเรียกใช้ super.onBackPressed() จากเมธอดที่ลบล้าง ไม่เช่นนั้น ลักษณะการกดกลับของระบบอาจทำให้ผู้ใช้สับสน

ระบบหยุดกระบวนการของแอป

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

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

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