อินสแตนซ์ Fragment
แต่ละรายการมีวงจรการใช้งานของตัวเอง เมื่อผู้ใช้ไปยังส่วนต่างๆ และโต้ตอบกับแอปของคุณ ข้อมูลโค้ดจะเปลี่ยนผ่านสถานะต่างๆ ในวงจรของข้อมูลโค้ดเมื่อมีการเพิ่ม นําออก และเข้าสู่หรือออกจากหน้าจอ
Fragment
ใช้ LifecycleOwner
เพื่อจัดการวงจร โดยแสดงออบเจ็กต์ Lifecycle
ที่คุณเข้าถึงได้ผ่านเมธอด getLifecycle()
สถานะ Lifecycle
ที่เป็นไปได้แต่ละสถานะจะแสดงใน Enum Lifecycle.State
การสร้าง Fragment
บน Lifecycle
จะช่วยให้คุณใช้เทคนิคและคลาสที่มีให้สำหรับการจัดการวงจรด้วยคอมโพเนนต์ที่รับรู้วงจรได้
เช่น คุณอาจแสดงตำแหน่งของอุปกรณ์บนหน้าจอโดยใช้คอมโพเนนต์ที่รับรู้วงจร คอมโพเนนต์นี้อาจเริ่มฟังโดยอัตโนมัติเมื่อมีการเรียกใช้ข้อมูลโค้ดและหยุดเมื่อข้อมูลโค้ดเปลี่ยนเป็นสถานะไม่ทำงาน
คลาส Fragment
มีเมธอดการเรียกกลับซึ่งสอดคล้องกับการเปลี่ยนแปลงแต่ละรายการในวงจรชีวิตของข้อมูลโค้ดLifecycleObserver
ซึ่งได้แก่
onCreate()
,
onStart()
,
onResume()
,
onPause()
,
onStop()
และ
onDestroy()
มุมมองของข้อมูลพร็อพเพอร์ตี้จะมี Lifecycle
แยกต่างหากซึ่งจัดการโดยอิสระจาก Lifecycle
ของข้อมูลพร็อพเพอร์ตี้ ข้อมูลโค้ดจะเก็บLifecycleOwner
ไว้สำหรับมุมมอง ซึ่งเข้าถึงได้โดยใช้ getViewLifecycleOwner()
หรือ getViewLifecycleOwnerLiveData()
การเข้าถึง Lifecycle
ของมุมมองจะมีประโยชน์ในสถานการณ์ที่คอมโพเนนต์ที่รับรู้วงจรของชีวิตควรทํางานเฉพาะในขณะที่มุมมองของข้อมูลโค้ดมีอยู่ เช่น การสังเกต LiveData
ที่มีไว้เพื่อแสดงบนหน้าจอเท่านั้น
หัวข้อนี้จะอธิบายวงจรชีวิตของ Fragment
โดยละเอียด โดยอธิบายกฎบางอย่างที่กําหนดสถานะวงจรชีวิตของข้อมูลโค้ด และแสดงความสัมพันธ์ระหว่างสถานะ Lifecycle
กับ Callback วงจรชีวิตของข้อมูลโค้ด
ฟragment และตัวจัดการฟragment
เมื่อสร้างอินสแตนซ์ของข้อมูลโค้ด ข้อมูลโค้ดจะเริ่มอยู่ในสถานะ INITIALIZED
หากต้องการให้เศษเปลี่ยนผ่านวงจรที่เหลือ จะต้องเพิ่มเศษนั้นลงใน FragmentManager
FragmentManager
มีหน้าที่รับผิดชอบในการพิจารณาสถานะที่ควรเป็นของข้อมูลโค้ด จากนั้นจึงย้ายข้อมูลโค้ดไปยังสถานะนั้น
นอกจากวงจรของ Fragment แล้ว FragmentManager
ยังมีหน้าที่รับผิดชอบในการแนบ Fragment กับกิจกรรมของโฮสต์และถอดออกเมื่อไม่มีการใช้ Fragment นั้นอีกต่อไป คลาส Fragment
มีเมธอดการเรียกคืน 2 เมธอด ได้แก่ onAttach()
และ onDetach()
ซึ่งคุณสามารถลบล้างเพื่อดําเนินการเมื่อเกิดเหตุการณ์ใดเหตุการณ์หนึ่งเหล่านี้
ระบบจะเรียกใช้การเรียกกลับ onAttach()
เมื่อเพิ่มข้อมูลโค้ดลงใน FragmentManager
และแนบไว้กับกิจกรรมโฮสต์ ณ จุดนี้ ข้อมูลโค้ดจะทำงานอยู่ และ FragmentManager
จะจัดการสถานะวงจรชีวิตของข้อมูลโค้ด เมื่อถึงจุดนี้ วิธีการ FragmentManager
เช่น
findFragmentById()
จะแสดงผลข้อมูลโค้ดนี้
onAttach()
จะเรียกใช้ก่อนการเปลี่ยนแปลงสถานะวงจรเสมอ
ระบบจะเรียกใช้การเรียกกลับ onDetach()
เมื่อนําข้อมูลโค้ดออกจาก FragmentManager
และแยกออกจากกิจกรรมของโฮสต์ ข้อมูลดังกล่าวไม่มีการใช้งานแล้วและไม่สามารถเรียกดูได้โดยใช้ findFragmentById()
ระบบจะเรียกใช้ onDetach()
เสมอหลังจากการเปลี่ยนแปลงสถานะวงจร
โปรดทราบว่าการเรียกกลับเหล่านี้ไม่เกี่ยวข้องกับวิธี FragmentTransaction
attach()
และ detach()
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเหล่านี้ได้ที่แยกธุรกรรม
สถานะและ Callback ของวงจรของ Fragment
เมื่อพิจารณาสถานะวงจรชีวิตของข้อมูลโค้ด FragmentManager
จะพิจารณาสิ่งต่อไปนี้
- สถานะสูงสุดของข้อมูลโค้ดจะกำหนดโดย
FragmentManager
ของข้อมูลโค้ดนั้น เศษจะไม่เปลี่ยนแปลงสถานะจากFragmentManager
- คุณสามารถตั้งค่าสถานะวงจรสูงสุดในข้อมูลโค้ดโดยใช้
setMaxLifecycle()
เป็นส่วนหนึ่งของFragmentTransaction
- สถานะวงจรชีวิตของข้อมูลโค้ดจะสูงกว่าของรายการหลักไม่ได้ เช่น จะต้องเริ่มใช้งานข้อมูลโค้ดหรือกิจกรรมหลักก่อนข้อมูลโค้ดย่อย ในทํานองเดียวกัน คุณต้องหยุดใช้งาน FRG ย่อยก่อน FRG หรือกิจกรรมหลัก
![สถานะวงจรชีวิตของ Fragment และความสัมพันธ์ของสถานะเหล่านั้นกับทั้ง Callback วงจรชีวิตของ Fragment และวงจรชีวิตของมุมมอง Fragment](https://developer.android.google.cn/static/images/guide/fragments/fragment-view-lifecycle.png?authuser=6&hl=th)
Lifecycle
ของ Fragment และความสัมพันธ์กับทั้งการเรียกกลับวงจรชีวิตของ Fragment และมุมมอง Lifecycle
ของ Fragmentรูปที่ 1 แสดงสถานะ Lifecycle
ของข้อบังคับแต่ละรายการและความสัมพันธ์กับทั้งการเรียกกลับวงจรชีวิตของข้อบังคับและมุมมอง Lifecycle
ของข้อบังคับ
เมื่อผ่านวงจร ข้อมูลโค้ดจะเลื่อนขึ้นและลงตามสถานะต่างๆ เช่น ข้อมูลโค้ดที่เพิ่มไว้ที่ด้านบนของกองซ้อนที่ซ้อนกันจะเลื่อนขึ้นจาก CREATED
เป็น STARTED
เป็น RESUMED
ในทางกลับกัน เมื่อระบบนำรายการที่ฝังอยู่ออกจากกองซ้อนด้านหลัง รายการดังกล่าวจะย้ายลงผ่านสถานะต่างๆ จากRESUMED
ไปSTARTED
ไปCREATED
และสุดท้ายคือDESTROYED
การเปลี่ยนสถานะจากล่างขึ้นบน
เมื่อเลื่อนขึ้นผ่านสถานะต่างๆ ของวงจร ฟรแกรมจะเรียกใช้การเรียกกลับของวงจรที่เกี่ยวข้องสำหรับสถานะใหม่ก่อน เมื่อการเรียกกลับนี้เสร็จสิ้นแล้ว Lifecycle.Event
ที่เกี่ยวข้องจะส่งไปยังผู้สังเกตการณ์โดย Lifecycle
ของข้อมูลโค้ด จากนั้นตามด้วยมุมมอง Lifecycle
ของข้อมูลโค้ด หากมีการสร้างอินสแตนซ์แล้ว
สร้าง Fragment แล้ว
เมื่อ Fragment อยู่ในสถานะ CREATED
แสดงว่าระบบได้เพิ่ม Fragment นั้นลงใน FragmentManager
และเรียกใช้เมธอด onAttach()
แล้ว
การดำเนินการนี้เหมาะสําหรับการกู้คืนสถานะที่บันทึกไว้ซึ่งเชื่อมโยงกับข้อมูลโค้ดผ่านSavedStateRegistry
ของข้อมูลโค้ด
โปรดทราบว่าระบบยังไม่ได้สร้างมุมมองของข้อมูลโค้ดในตอนนี้ และควรกู้คืนสถานะใดๆ ที่เชื่อมโยงกับมุมมองของข้อมูลโค้ดหลังจากสร้างมุมมองแล้วเท่านั้น
การเปลี่ยนสถานะนี้จะเรียกใช้การเรียกกลับ onCreate()
นอกจากนี้ ฟังก์ชัน Callback ยังได้รับอาร์กิวเมนต์ savedInstanceState
Bundle
ที่มีสถานะใดๆ ที่บันทึกไว้ก่อนหน้านี้โดย onSaveInstanceState()
ด้วย
โปรดทราบว่า savedInstanceState
จะมีค่า null
เมื่อสร้างข้อมูลโค้ดครั้งแรก แต่จะไม่เท่ากับ Null เสมอสำหรับการสร้างใหม่ในภายหลัง แม้ว่าคุณจะไม่ได้ลบล้าง onSaveInstanceState()
ก็ตาม ดูรายละเอียดเพิ่มเติมได้ที่การบันทึกสถานะด้วยข้อมูลโค้ดที่แยกส่วน
สร้าง FRGMENT และ เริ่มต้นใช้งานมุมมอง
ระบบจะสร้างมุมมอง Lifecycle
ของข้อมูลโค้ดเมื่อ Fragment
ของคุณระบุอินสแตนซ์ View
ที่ถูกต้องเท่านั้น ในกรณีส่วนใหญ่ คุณสามารถใช้ตัวสร้างข้อมูลโค้ดแบบเป็นกลุ่มที่ใช้ @LayoutId
ซึ่งจะสร้างมุมมองโดยอัตโนมัติในเวลาที่เหมาะสม นอกจากนี้ คุณยังลบล้าง
onCreateView()
เพื่อสร้างหรือขยายมุมมองของข้อมูลโค้ดที่ฝังอยู่แบบเป็นโปรแกรมได้ด้วย
เฉพาะในกรณีที่มีการสร้างอินสแตนซ์มุมมองของข้อมูลโค้ดที่ไม่ใช่ค่า Null View
ระบบจะตั้งค่า View
นั้นในข้อมูลโค้ดและสามารถดึงข้อมูลได้โดยใช้ getView()
จากนั้น ระบบจะอัปเดต getViewLifecycleOwnerLiveData()
ด้วย INITIALIZED
ใหม่ LifecycleOwner
ซึ่งสอดคล้องกับมุมมองของข้อมูลโค้ด ระบบจะเรียกใช้ Lifecycle Callback ของ onViewCreated()
ในเวลานี้ด้วย
นี่เป็นตําแหน่งที่เหมาะสมในการตั้งค่าสถานะเริ่มต้นของมุมมอง เพื่อเริ่มสังเกตการณ์อินสแตนซ์ LiveData
ของ Callback ที่อัปเดตมุมมองของแฟรกเมนต์ และเพื่อตั้งค่าอะแดปเตอร์ในอินสแตนซ์ RecyclerView
หรือ ViewPager2
ในมุมมองของแฟรกเมนต์
สร้างข้อมูลโค้ดและมุมมองแล้ว
หลังจากสร้างมุมมองของข้อมูลโค้ดแล้ว ระบบจะกู้คืนสถานะมุมมองก่อนหน้า (หากมี) จากนั้นจะย้าย Lifecycle
ของมุมมองไปยังสถานะ CREATED
เจ้าของวงจรชีวิตของมุมมองจะส่งเหตุการณ์ ON_CREATE
ไปยังผู้สังเกตการณ์ด้วย คุณควรกู้คืนสถานะเพิ่มเติมที่เชื่อมโยงกับมุมมองของข้อมูลโค้ดที่นี่
การเปลี่ยนผ่านนี้จะเรียกใช้การเรียกคืนonViewStateRestored()
ด้วย
เริ่มต้นใช้งาน FRG และ View
ขอแนะนำเป็นอย่างยิ่งให้เชื่อมโยงคอมโพเนนต์ที่รับรู้ถึงวงจรกับสถานะ STARTED
ของส่วนย่อย เนื่องจากสถานะนี้รับประกันว่าจะมีมุมมองของส่วนย่อยอยู่ หากมีการสร้างมุมมองขึ้นมา และดำเนินการ FragmentTransaction
ในส่วนย่อย FragmentManager
ของส่วนย่อยได้อย่างปลอดภัย หากมุมมองของข้อมูลโค้ดไม่เท่ากับ Null ระบบจะย้ายLifecycle
ของข้อมูลโค้ดไปยัง STARTED
ทันทีหลังจากที่ย้ายLifecycle
ของข้อมูลโค้ดไปยัง STARTED
เมื่อข้อมูลโค้ดกลายเป็น STARTED
ระบบจะเรียกใช้การเรียกกลับ onStart()
แสดงตัวอย่างและดูต่อ
เมื่อข้อมูลโค้ดแสดงอยู่ แสดงว่าเอฟเฟกต์ Animator
และ Transition
ทั้งหมดเสร็จสมบูรณ์แล้ว และข้อมูลโค้ดพร้อมให้ผู้ใช้โต้ตอบ Lifecycle
ของข้อมูลโค้ดจะเปลี่ยนเป็นสถานะ RESUMED
และระบบจะเรียกใช้การเรียกกลับ onResume()
การเปลี่ยนเป็น RESUMED
เป็นสัญญาณที่เหมาะสมเพื่อบ่งบอกว่าตอนนี้ผู้ใช้โต้ตอบกับข้อมูลโค้ดของคุณได้แล้ว ไม่ควรตั้งค่าโฟกัสในมุมมองของข้อมูลโค้ดที่ไม่ใช่ RESUMED
ด้วยตนเองหรือพยายามจัดการการแสดงวิธีการป้อนข้อมูล
การเปลี่ยนสถานะลง
เมื่อมีการย้ายข้อมูลไปยังสถานะวงจรชีวิตของรายการย่อยที่ต่ำลง Lifecycle
ที่เกี่ยวข้องจะส่งไปยังผู้สังเกตการณ์โดยมุมมอง Lifecycle
ของรายการย่อย หากมีการสร้างอินสแตนซ์แล้ว ตามด้วย Lifecycle
ของรายการย่อยLifecycle.Event
หลังจากมีการส่งเหตุการณ์วงจรของ Fragment แล้ว Fragment จะเรียกใช้การเรียกกลับวงจรที่เกี่ยวข้อง
เริ่มต้นใช้งาน FRG และ View
เมื่อผู้ใช้เริ่มออกจากข้อมูลโค้ด และในขณะที่ข้อมูลโค้ดนั้นยังมองเห็นได้ ระบบจะย้าย Lifecycle
ของข้อมูลโค้ดและมุมมองของข้อมูลโค้ดกลับไปยังสถานะ STARTED
และส่งเหตุการณ์ ON_PAUSE
ไปยังผู้สังเกตการณ์ จากนั้น ข้อมูลโค้ดจะเรียกใช้การเรียกกลับ onPause()
สร้างข้อมูลโค้ดและมุมมองแล้ว
เมื่อไม่เห็นข้อมูลโค้ดอีกต่อไป ระบบจะย้าย Lifecycle
ของข้อมูลโค้ดและมุมมองข้อมูลโค้ดไปยังสถานะ CREATED
และส่งเหตุการณ์ ON_STOP
ไปยังผู้สังเกตการณ์ การเปลี่ยนสถานะนี้ไม่เพียงทริกเกอร์โดยการหยุดกิจกรรมหรือแฟรกเมนต์หลักเท่านั้น แต่ยังทริกเกอร์โดยการบันทึกสถานะของกิจกรรมหรือแฟรกเมนต์หลักด้วย ลักษณะการทํางานนี้รับประกันว่าระบบจะเรียกเหตุการณ์ ON_STOP
ก่อนที่จะบันทึกสถานะของข้อมูลโค้ด ซึ่งทำให้เหตุการณ์ ON_STOP
เป็นจุดสุดท้ายที่ปลอดภัยในการดําเนินการ FragmentTransaction
กับเด็ก FragmentManager
ดังที่แสดงในรูปที่ 2 ลําดับของ onStop()
callback และการบันทึกสถานะด้วย onSaveInstanceState()
จะแตกต่างกันไปตามระดับ API สําหรับ API ทุกระดับก่อน API ระดับ 28 ระบบจะเรียกใช้ onSaveInstanceState()
ก่อน onStop()
สำหรับ API ระดับ 28 ขึ้นไป ลำดับการเรียกจะกลับกัน
![ความแตกต่างของลําดับการเรียกใช้สำหรับ onStop() และ onSaveInstanceState()](https://developer.android.google.cn/static/images/guide/fragments/stop-save-order.png?authuser=6&hl=th)
onStop()
และ onSaveInstanceState()
สร้างข้อมูลโค้ดแล้วและมุมมองถูกทำลาย
หลังจากที่ภาพเคลื่อนไหวและการเปลี่ยนเฟรมทั้งหมดสิ้นสุดลง และมุมมองของข้อมูลโค้ดโค้ดที่แยกออกจากหน้าต่างแล้ว ระบบจะย้ายมุมมอง Lifecycle
ของข้อมูลโค้ดโค้ดไปยังสถานะ DESTROYED
และส่งเหตุการณ์ ON_DESTROY
ไปยังผู้สังเกตการณ์ จากนั้น ข้อมูลโค้ดจะเรียกใช้การเรียกคืน onDestroyView()
เมื่อถึงจุดนี้ มุมมองของข้อมูลโค้ดจะสิ้นสุดวงจร และ getViewLifecycleOwnerLiveData()
จะแสดงผลเป็นค่า null
เมื่อถึงจุดนี้ คุณควรนําการอ้างอิงทั้งหมดไปยังมุมมองของข้อมูลโค้ดที่แยกส่วนออก เพื่อให้ระบบรวบรวมขยะในมุมมองของข้อมูลโค้ดที่แยกส่วน
ทำลาย Fragment แล้ว
หากนําเศษข้อมูลออก หรือหาก FragmentManager
ถูกทำลาย ระบบจะย้าย Lifecycle
ของเศษข้อมูลไปยังสถานะ DESTROYED
และส่งเหตุการณ์ ON_DESTROY
ไปยังผู้สังเกตการณ์ จากนั้น ข้อมูลโค้ดจะเรียกใช้การเรียกคืน onDestroy()
เมื่อถึงจุดนี้ ข้อมูลโค้ดจะสิ้นสุดวงจร
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรชีวิตของข้อมูลโค้ดได้จากแหล่งข้อมูลเพิ่มเติมต่อไปนี้