چرخه حیات قطعه

هر نمونه 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 نمای قطعه.

شکل 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 و بالاتر، ترتیب تماس معکوس می شود.

تفاوت سفارش فراخوانی برای onStop() و onSaveInstanceState()
شکل 2. تفاوت ترتیب فراخوانی برای onStop() و onSaveInstanceState() .

قطعه ایجاد شد و مشاهده نابود شد

پس از اینکه تمام انیمیشن‌های خروجی و انتقال‌ها کامل شد و نمای قطعه از پنجره جدا شد، Lifecycle نمای قطعه به حالت DESTROYED منتقل می‌شود و رویداد ON_DESTROY را برای ناظران خود منتشر می‌کند. سپس قطعه فراخوانی onDestroyView() خود را فراخوانی می کند. در این مرحله، نمای قطعه به پایان چرخه عمر خود رسیده است و getViewLifecycleOwnerLiveData() یک مقدار null برمی گرداند.

در این مرحله، تمام ارجاعات به نمای قطعه باید حذف شود و اجازه می دهد نمای قطعه زباله جمع آوری شود.

قطعه تخریب شد

اگر قطعه حذف شود، یا اگر FragmentManager از بین برود، Lifecycle قطعه به حالت DESTROYED منتقل می‌شود و رویداد ON_DESTROY را برای ناظرانش ارسال می‌کند. سپس قطعه فراخوانی onDestroy() خود را فراخوانی می کند. در این مرحله، قطعه به پایان چرخه حیات خود رسیده است.

منابع اضافی

برای اطلاعات بیشتر در مورد چرخه حیات قطعه، منابع اضافی زیر را ببینید.

راهنماها

وبلاگ ها