هر نمونه Fragment
چرخه حیات خاص خود را دارد. هنگامی که کاربر به برنامه شما پیمایش می کند و با آن تعامل می کند، قطعات شما در حالت های مختلف در چرخه عمر خود به هنگام افزودن، حذف و ورود یا خروج از صفحه نمایش منتقل می شوند.
برای مدیریت چرخه حیات، Fragment
LifecycleOwner
پیادهسازی میکند و یک شی Lifecycle
را که میتوانید از طریق متد getLifecycle()
به آن دسترسی داشته باشید، در معرض دید قرار میدهد.
هر حالت Lifecycle
ممکن در فهرست Lifecycle.State
نشان داده شده است.
با ساختن Fragment
در بالای Lifecycle
، می توانید از تکنیک ها و کلاس های موجود برای Handling Lifecycles with Lifecycle-Aware Components استفاده کنید. برای مثال، ممکن است مکان دستگاه را با استفاده از یک مؤلفه مربوط به چرخه حیات، روی صفحه نمایش دهید. این مؤلفه میتواند بهطور خودکار وقتی قطعه فعال میشود شروع به گوش دادن کند و وقتی قطعه به حالت غیرفعال میرود متوقف شود.
به عنوان جایگزینی برای استفاده از LifecycleObserver
، کلاس Fragment
شامل متدهای برگشتی است که با هر یک از تغییرات در چرخه حیات یک قطعه مطابقت دارد. اینها شامل onCreate()
، onStart()
، onResume()
، onPause()
، onStop()
و onDestroy()
می باشد.
نمای یک قطعه دارای یک Lifecycle
جداگانه است که مستقل از Lifecycle
قطعه مدیریت می شود. Fragment ها یک LifecycleOwner
برای نمای خود نگه می دارند که با استفاده از getViewLifecycleOwner()
یا getViewLifecycleOwnerLiveData()
قابل دسترسی است. دسترسی به Lifecycle
حیات نما برای شرایطی مفید است که یک مؤلفه آگاه از چرخه حیات فقط باید در زمانی که نمای قطعه وجود دارد کار کند، مانند مشاهده LiveData
که فقط برای نمایش روی صفحه نمایش داده می شود.
این مبحث چرخه حیات Fragment
را به تفصیل مورد بحث قرار میدهد و برخی از قوانینی را که وضعیت چرخه حیات یک قطعه را تعیین میکنند توضیح میدهد و رابطه بین حالتهای Lifecycle
و برگشتهای چرخه حیات قطعه را نشان میدهد.
قطعات و مدیر قطعه
هنگامی که یک قطعه نمونه سازی می شود، در حالت INITIALIZED
شروع می شود. برای اینکه یک قطعه از بقیه چرخه عمر خود عبور کند، باید به یک FragmentManager
اضافه شود. FragmentManager
مسئول تعیین حالتی است که قطعه آن باید در چه وضعیتی باشد و سپس آنها را به آن حالت منتقل می کند.
فراتر از چرخه حیات قطعه، FragmentManager
همچنین مسئول اتصال قطعات به فعالیت میزبان خود و جدا کردن آنها در زمانی که قطعه دیگر در حال استفاده نیست، است. کلاس Fragment
دارای دو متد callback onAttach()
و onDetach()
است که میتوانید هنگام وقوع هر یک از این رویدادها، کار را لغو کنید.
فراخوانی onAttach()
زمانی فراخوانی می شود که قطعه به یک FragmentManager
اضافه شود و به فعالیت میزبان آن متصل شود. در این مرحله، قطعه فعال است و FragmentManager
در حال مدیریت وضعیت چرخه حیات آن است. در این مرحله، متدهای FragmentManager
مانند findFragmentById()
این قطعه را برمی گرداند.
onAttach()
همیشه قبل از تغییر وضعیت چرخه حیات فراخوانی می شود.
فراخوانی onDetach()
زمانی فراخوانی می شود که قطعه از یک FragmentManager
حذف شده و از فعالیت میزبان خود جدا شود. قطعه دیگر فعال نیست و دیگر نمی توان با استفاده از findFragmentById()
بازیابی کرد.
onDetach()
همیشه پس از هر تغییر حالت چرخه زندگی فراخوانی می شود.
توجه داشته باشید که این فراخوانها با روشهای FragmentTransaction
attach()
و detach()
ارتباطی ندارند. برای اطلاعات بیشتر در مورد این روشها، تراکنشهای بخش را ببینید.
حالتهای چرخه حیات قطعه و تماسها
هنگام تعیین وضعیت چرخه حیات یک قطعه، FragmentManager
موارد زیر را در نظر می گیرد:
- حداکثر حالت یک قطعه توسط
FragmentManager
آن تعیین می شود. یک قطعه نمی تواند فراتر از وضعیتFragmentManager
خود پیشرفت کند. - به عنوان بخشی از یک
FragmentTransaction
، می توانید با استفاده ازsetMaxLifecycle()
حداکثر حالت چرخه حیات را روی یک قطعه تنظیم کنید. - وضعیت چرخه حیات یک قطعه هرگز نمی تواند بزرگتر از والد آن باشد. برای مثال، یک قطعه والد یا یک فعالیت باید قبل از تکه تکه شدن فرزند آن شروع شود. به همین ترتیب، قطعات فرزند باید قبل از قطعه یا فعالیت والد آنها متوقف شوند.
شکل 1 هر یک از حالتهای Lifecycle
قطعه و نحوه ارتباط آنها با چرخه حیات قطعه و Lifecycle
نمای قطعه را نشان میدهد.
همانطور که یک قطعه در چرخه زندگی خود پیشرفت می کند، در حالت های خود به سمت بالا و پایین حرکت می کند. برای مثال، قطعهای که به بالای پشته پشتی اضافه میشود، از CREATED
به STARTED
تا RESUMED
به سمت بالا حرکت میکند. برعکس، وقتی یک قطعه از پشته پشته بیرون میآید، در آن حالتها به سمت پایین حرکت میکند و از RESUMED
به STARTED
به CREATED
و در نهایت DESTROYED
میرود.
انتقال حالت رو به بالا
وقتی یک قطعه در حالات چرخه حیات خود به سمت بالا حرکت می کند، ابتدا یک فراخوان چرخه حیات مرتبط را برای حالت جدید خود فراخوانی می کند. پس از اتمام این فراخوانی، Lifecycle.Event
مربوطه توسط Lifecycle
قطعه به ناظران ارسال میشود و به دنبال آن Lifecycle
قطعه، در صورتی که نمونهسازی شده باشد، نمایش داده میشود.
قطعه ایجاد شد
وقتی قطعه شما به حالت CREATED
رسید، به یک FragmentManager
اضافه شد و متد onAttach()
قبلا فراخوانی شده است.
این مکان مناسب برای بازیابی هر حالت ذخیره شده مرتبط با خود قطعه از طریق SavedStateRegistry
قطعه است. توجه داشته باشید که نمای قطعه در حال حاضر ایجاد نشده است و هر حالت مرتبط با نمای قطعه باید تنها پس از ایجاد نمای بازیابی شود.
این انتقال فراخوانی onCreate()
را فراخوانی می کند. همچنین callback یک آرگومان savedInstanceState
Bundle
را دریافت میکند که شامل هر حالتی است که قبلاً توسط onSaveInstanceState()
ذخیره شده است. توجه داشته باشید که savedInstanceState
در اولین باری که قطعه ایجاد میشود یک مقدار null
دارد، اما برای کارهای بعدی همیشه غیر تهی است، حتی اگر onSaveInstanceState()
لغو نکنید. برای جزئیات بیشتر به ذخیره وضعیت با قطعات مراجعه کنید.
قطعه ایجاد شد و مشاهده اولیه شد
Lifecycle
نمای قطعه تنها زمانی ایجاد می شود که Fragment
شما یک نمونه View
معتبر ارائه دهد. در بیشتر موارد، میتوانید از سازندههای قطعه استفاده کنید که یک @LayoutId
را میگیرند، که به طور خودکار نمای را در زمان مناسب افزایش میدهد. همچنین می توانید onCreateView()
لغو کنید تا نمای قطعه خود را به صورت برنامه نویسی افزایش دهید یا ایجاد کنید.
اگر و فقط اگر نمای قطعه شما با یک View
غیر تهی نمونه باشد، آن View
روی قطعه تنظیم می شود و می توان با استفاده از getView()
بازیابی کرد. سپس getViewLifecycleOwnerLiveData()
با LifecycleOwner
جدید INITIALIZED
مطابق با نمای قطعه به روز می شود. پاسخ تماس چرخه حیات onViewCreated()
نیز در این زمان فراخوانی می شود.
این مکان مناسبی برای تنظیم وضعیت اولیه نمای شما، برای شروع مشاهده نمونه های LiveData
است که تماس های آن ها نمای قطعه را به روز می کند، و برای تنظیم آداپتورها در هر نمونه RecyclerView
یا ViewPager2
در نمای قطعه شما.
قطعه و مشاهده ایجاد شد
پس از ایجاد نمای قطعه، وضعیت نمای قبلی، در صورت وجود، بازیابی میشود و Lifecycle
ویو سپس به حالت CREATED
منتقل میشود. مالک چرخه حیات view نیز رویداد ON_CREATE
را برای ناظران خود منتشر می کند. در اینجا باید هر حالت اضافی مرتبط با نمای قطعه را بازیابی کنید.
این انتقال همچنین فراخوانی onViewStateRestored()
را فراخوانی می کند.
قطعه و مشاهده شروع شد
اکیداً توصیه می شود که اجزای Lifecycle-aware را به حالت STARTED
یک قطعه گره بزنید، زیرا این حالت تضمین می کند که نمای قطعه در صورت ایجاد آن در دسترس است و انجام یک FragmentTransaction
بر روی FragmentManager
فرزند قطعه بی خطر است. . اگر نمای قطعه غیر تهی باشد، Lifecycle
نمای قطعه بلافاصله پس از انتقال Lifecycle
قطعه به STARTED
به STARTED
منتقل می شود.
هنگامی که قطعه STARTED
می شود، فراخوانی onStart()
فراخوانی می شود.
قطعه و مشاهده از سر گرفته شد
هنگامی که قطعه قابل مشاهده است، تمام افکت های Animator
و Transition
تمام شده اند و قطعه برای تعامل با کاربر آماده است. Lifecycle
قطعه به حالت RESUMED
حرکت میکند و فراخوانی onResume()
فراخوانی میشود.
انتقال به RESUMED
سیگنال مناسبی است که نشان می دهد کاربر اکنون می تواند با قطعه شما تعامل داشته باشد. قطعاتی که RESUMED
نیستند نباید به صورت دستی تمرکز را روی نماهای خود تنظیم کنند یا سعی کنند قابلیت مشاهده روش ورودی را مدیریت کنند .
انتقال حالت رو به پایین
هنگامی که یک قطعه به سمت پایین به حالت چرخه حیات پایینتر حرکت میکند، Lifecycle.Event
مربوطه.رویداد توسط Lifecycle
قطعه، در صورت نمونهسازی، و به دنبال آن Lifecycle
قطعه به ناظران گسیل میشود. پس از اینکه رویداد چرخه حیات یک قطعه منتشر شد، قطعه، چرخه حیات مرتبط را فراخوانی میکند.
قطعه و مشاهده شروع شد
هنگامی که کاربر شروع به ترک قطعه می کند، و در حالی که قطعه هنوز قابل مشاهده است، چرخه Lifecycle
برای قطعه و برای نمای آن به حالت STARTED
منتقل می شود و رویداد ON_PAUSE
را برای ناظران خود منتشر می کند. سپس قطعه فراخوانی onPause()
خود را فراخوانی می کند.
قطعه و مشاهده ایجاد شد
هنگامی که قطعه دیگر قابل مشاهده نیست، چرخه Lifecycle
برای قطعه و نمای آن به حالت CREATED
منتقل می شود و رویداد ON_STOP
را برای ناظران خود منتشر می کند. این انتقال حالت نه تنها با متوقف شدن فعالیت یا قطعه والد، بلکه با ذخیره حالت توسط فعالیت یا قطعه والد ایجاد می شود. این رفتار تضمین می کند که رویداد ON_STOP
قبل از ذخیره شدن وضعیت قطعه فراخوانی می شود. این باعث میشود رویداد ON_STOP
آخرین نقطهای باشد که در آن انجام FragmentTransaction
روی FragmentManager
فرزند امن است.
همانطور که در شکل 2 نشان داده شده است، ترتیب بازگشت به onStop()
و ذخیره وضعیت با onSaveInstanceState()
بر اساس سطح API متفاوت است. برای تمام سطوح API قبل از API 28، onSaveInstanceState()
قبل از onStop()
فراخوانی می شود. برای سطوح API 28 و بالاتر، ترتیب تماس معکوس می شود.
قطعه ایجاد شد و مشاهده نابود شد
پس از اینکه تمام انیمیشنهای خروجی و انتقالها کامل شد و نمای قطعه از پنجره جدا شد، Lifecycle
نمای قطعه به حالت DESTROYED
منتقل میشود و رویداد ON_DESTROY
را برای ناظران خود منتشر میکند. سپس قطعه فراخوانی onDestroyView()
خود را فراخوانی می کند. در این مرحله، نمای قطعه به پایان چرخه عمر خود رسیده است و getViewLifecycleOwnerLiveData()
یک مقدار null
برمی گرداند.
در این مرحله، تمام ارجاعات به نمای قطعه باید حذف شود و اجازه می دهد نمای قطعه زباله جمع آوری شود.
قطعه تخریب شد
اگر قطعه حذف شود، یا اگر FragmentManager
از بین برود، Lifecycle
قطعه به حالت DESTROYED
منتقل میشود و رویداد ON_DESTROY
را برای ناظرانش ارسال میکند. سپس قطعه فراخوانی onDestroy()
خود را فراخوانی می کند. در این مرحله، قطعه به پایان چرخه حیات خود رسیده است.
منابع اضافی
برای اطلاعات بیشتر در مورد چرخه حیات قطعه، منابع اضافی زیر را ببینید.