activity lifecycle

activity lifecycle

چرخه حیات Activity در زامارین

Bundle State

گزینه اصلی برای ذخیره حالت instance استفاده از آبجکت دیکشنری key/value که به عنوان bundle شناخته می شود است. همانطور که قبلا گفته شد زمانی که یک activity ایجاد می شود متد OnCreate به عنوان پارامتر bundle را پاس می دهد. این bundle می تواند حالت instance را restore کند. در زمانی که دیتا پیچیده است و به سادگی و با سرعت در key/value pair سریالایز نمی شود، استفاده از bundle توصیه نمی شود (مانند bitmapها) بلکه باید آن را برای مقدار ساده مانند رشته مورد استفاده قرار داد.
هر activity روشی برای ذخیره و بازیابی حالت instance در bundle ایجاد می کند:
1- OnSaveInstanceState: این متد زمانی که activity در حال destroye شدن است invoke می شود. زمانی که Activityها روی آیتم های حالت key/value نیاز به اصرار دارند میتوانند این متد را پیاده سازی کنند.
2- OnRestoreInstanceState: این متد بعد از اتمام متد OnCreate فراخوانی می شود و فرصت دیگری را برای activity برای بازگردانی حالت خود بعد از اتمام مقداردهی اولیه می دهد.
تصویر زیر نحوه استفاده از این متدها را نمایش می دهد:

Bundle State

OnSaveInstanceState

این متد زمانی که activity در حال توقف است فراخوانی می شود. این متد پارامتر bundle را که activity می تواند حالت آن را ذخیره کند را دریافت می کند. زمانی که تجربه دستگاه پیکربندی دستگاه را تغییر می دهد، activity می تواند از آبجکت bundle که برای حفظ حالت activity پاس داده می شود تا توسط overrid، OnSaveInstanceState شود. برای مثال به کد زیر توجه کنید:

در متد بالا متغیر اینتجر C زمانی که روی دکمه incrementCounter کلیک می شود افزایش می یابد و نتیجه آن در TextViewای با نام output نمایش داده می شود. زمانی که یک تغییر پیکربندی اتفاق می افتد (برای مثال گوشی rotate می شود) کد بالا مقدار C را از دست می دهد چون مقدار bundle برابر null خواهد شد.

OnSaveInstanceState

زمانی که کنترل EditText یک id تخصیص داده شده دارد هنگامی که کاربر اطلاعات وارد می کند یا گوشی را rotate می کند، اطلاعات نمایش داده می شود مشابه تصویر زیر:

View State

View State

Overrid کردن OnSaveInstanceState مکانیسم مناسبی برای ذخیره اطلاعات گذرا در یک activity در سراسر تغییر جهت است مانند شمارنده در مثال بالا. پیاده سازی پیش فرض OnSaveInstanceState از ذخیره اطلاعات گذرا در UI در هر View ای نگه داری می کند تا زمانی که به هر View یک ID اختصاص داده شود. برای مثال در هر اپلیکیشن یک المان EditText در XML مانند زیر تعریف شود:

از آنجا که کنترل EditText یک id تخصیص داده شده دارد، زمانی که کاربر اطلاعات را وارد می کند و گوشی را rotate می کند. دیتا را همچنان نمایش داده می شود.

View state

OnRestoreInstanceState

این متد بعد از OnStart فراخوانی می شود که فرصتی برای activity فراهم می کند تا تمامی حالت هایی که قبلا در bundle در طول OnSaveInstanceState ذخیره شه است را باز گرداند که مشابه bundleای است که OnCreate را ارائه می دهد.
کد زیر نحوه ذخیره حالت را در OnRestoreInstanceState را نمایش می دهد:

این روش برای فراهم کردن انعطاف پذیری زمانی که حالت باید تغییر پیدا کند ایجاد شده است. گاهی بهتر است قبل از بازگزداندن instance حالت صبر کنید تا مقداردهی اولیه به اتمام برسد. علاوه بر این یک subclass از Activity موجود ممکن است بخواهد مقادیر خاصی از instance حالت را باز گرداند. در بیشتر مواقع override کردن OnRestoreInstanceState ضروری است تا زمانی که اغلب activityها بتوانند حالت خود را با استفاده از bundle بازگردانی کنند تا OnCreate را ایجاد کنند.

محدودیت های Bundle

اگرچه OnSaveInstanceState ذخیره داده های transient را ساده تر می کند اما محدودیت هایی نیز دارد:
1- در تمامی موارد فراخوانی نمی شود. به عنوان مثال فشار دادن دکمه Home یا دکمه Back برای خروج از Activity خروجی ای برای فراخوانی OnSaveInstanceState ندارد.
2- Bundleهای پاس شده در OnSaveInstanceState برای آبجکت های بزرگی مانند تصاویر طراحی نشده اند. در مواردی با آبجکت های بزرگ ذخیره آبجکت با OnRetainNonConfigurationInstance بهتر است.
3- اطلاعات ذخیره شده با استفاده از bundle سریالایز شده هستند که می تواند منجر به تاخیر شود.
Bundle state برای دیتاهای ساده که حافظه زیادی نمی گیرند مناسب است.دیتاهای instance پیکربندی نشده برای دیتاهای پیچیده مناسب است، یا دیتاهایی که بازیابی آن ها هزینه بر است مانند فراخوانی وب سرویس یا کوئری های دیتابیسی پیچیده.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

+ 78 = 86