سبد (0)

ایجاد مجدد Activity

آن چه در این درس خواهید آموخت:

  1. ذخیره ی اطلاعات وضعیت Activity
  2. بازیابی وضعیت Activity

مواردی که باید مطالعه کرده باشید:

  • پشتیبانی از صفحات نمایش مختلف

خودتان امتحان کنید:

دانلود دمو »

ایجاد دوباره ی Activity

خیلی کم پیش می آید که activity شما به صورت عادی خاتمه پیدا کند، یعنی کاربر دکمه ی برگشت یا Back را فشار بدهد و خودش برنامه را با فراخوانی متد ()finish خاتمه دهد. سیستم ممکن است activity شما را زمانی که در حالت stopped قرار دارد و مدت زیادی است که از آن استفاده نمی شود، خود به خود خاتمه دهد. سیستم همچنین ممکن است Activity شما را وقتی که برنامه ی فعال یا Activity فعال نیاز به منابع بیشتری دارد برنامه ی شما را خود به خود خاتمه دهد بنابراین سیستم اندروید برای بازیابی حافظه ممکن است برنامه های پس زمینه را خاتمه دهد.

هنگامی که activity با استفاده از دکمه ی برگشت خاتمه پیدا می کند، یا اینکه خود Activity خودش را خاتمه می دهد، نمونه ی activity برای همیشه از بین رفته است، زیرا این گونه خاتمه مبین آن است که Activity بیشتر از این نیاز نبوده است. با این وجود، اگر سیستم به خاطر برخی از محدودیت ها activity را خاتمه دهد، آنگاه اگرچه نمونه واقعی activity از بین رفته است، اما سیستم به خاطر می آورد که این Activity قبلاً وجود داشته است (مانند زمانی که کاربر به آن باز می گردد)، بنابراین سیستم با استفاده از مقادیر ذخیره شده ی مربوط به وضعیت Activity قبل از خاتمه ی آن، یک نمونه ی جدید از activity را ایجاد می کند. داده های ذخیره شده ای که در سیستم اندروید استفاده می شود تا وضعیت قبلی بازیابی شود را اصطلاحاً "instance state" می نامند و در حقیقت مجموعه ای از زوج های کلید مقدار هستند که در شیء Bundle ذخیره شده است. 

Note

هشدار: هربار که کاربر صفحه ی نمایش را می چرخاند، Activity از بین می رود و مجدداً ایجاد می شود. هنگامی که جهت صفحه ی نمایش تغییر پیدا می کند، سیستم Activity فعال و پیش روی صفحه نمایش را از بین می برد و آن را دوباره ایجاد می کند، زیرا تنظیمات پیکربندی صفحه ی نمایش تغییر یافته است و Activity شما می بایست، منابع جدیدی (مانند چیدمان) را بارگذار کند.


به طور پیش فرض، سیستم از وضعیت Bundle برای ذخیره ی اطلاعات مربوط به شیء View در چیدمان activity استفاده می کند (مانند متن داخل شیء EditText). بنابراین، اگر نمونه ی Activity شما  از بین رفت و مجدداً ایجاد شد، وضعیت چیدمان به حالت قبل برمی گردد بدون اینکه نیاز باشد شما کدی را بنویسید. با این وجود، ممکن است Activity اطلاعات بیشتری برای آن وضعیت داشته باشد که می بایست بازیابی شود، مانند متغیرهایی که میزان پیشرفت کاربر در activity را نشان می دهد.

Note

توجه: به خاطر اینکه سیستم اندروید وضعیت view ها را در activity شما بازیابی کند، هر view می بایست یک شناسه ی منحصر بفرد داشته باشد، این شناسه توسط خصوصیت android:id فراهم شده است.

برای ذخیره ی اطلاعات بیشتر در مورد وضعیت Activity، شما می بایست متد را ()onSaveInstanceState لغو و بازنویسی کنید. سیستم هنگامی که کاربر در حال ترک activity است این متد را فراخوانی می کند، و شیء Bundle را به آن ارسال می کند تا زمانی که Activity به صورت ناخواسته از بین رفت این شیء ذخیره شود. اگر سیستم مجبور شد که نمونه ی activity را در زمان های آتی مجدداً ایجاد کند، هم به متد  ()onCreate و هم به متد ()onRestoreInstanceState شیء Bundle را پاس می دهد.

توضیح شکل: وقتی سیستم شروع به توقف activity شما کرد، سیستم متد ()onSaveInstanceState را فراخوانی می کند (1) بنابراین شما می توانید اطلاعات بیشتری در مورد وضعیت را برای وقتی که Activity قرار است مجدداً ایجاد شود را ذخیره کنید. اگر Activity از بین رفت و Instance مشابهی می بایست ایجاد شود، سیستم اطلاعات وضعیتی که در مرحله (1) ذخیره شده بود را هم برای متد ()onCreate ارسال می کند (2) و هم برای متد ()onRestoreInstanceState ارسال می کند(3).


ذخیره ی اطلاعات وضعیت Activity

هنگامی که Activity متوقف شد، سیستم متد ()onSaveInstanceState را فراخوانی می کند، بنابراین Activity می تواند اطلاعات وضعیت را با استفاده از مجموعه ای از مقادیر کلید-مقدار ذخیره کند. در پیاده سازی پیش فرض این متد، اطلاعات وضعیت سلسله مراتب view مانند متن داخل EditText یا مکان اسکرول ListView ذخیره می شود.

برای ذخیره سازی اطلاعات بیشتر در مورد وضعیت، شما می بایست متد ()onSaveInstanceState را پیاده سازی کنید و زوج های کلید مقدار را به شیء Bundle اضافه کنید. مثال زیر دقیق تر مطلب فوق را بیان می کند:



مثال پیاده سازی ()onSaveInstanceState

 
staticfinalString STATE_SCORE ="playerScore";
staticfinalString STATE_LEVEL ="playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
   
// Save the user's current game state
    savedInstanceState
.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState
.putInt(STATE_LEVEL, mCurrentLevel);
   
   
// Always call the superclass so it can save the view hierarchy state
   
super.onSaveInstanceState(savedInstanceState);
}

Note

هشدار: همواره پیاده سازی مربوط به SupperClass (کلاسی که Activity از آن ارث بری می کند) را فراخوانی کنید. با این کار اطلاعات مربوط به وضعیت سلسله مراتبی view ذخیره می شود.


بازیابی وضعیت Activity

هنگامی که Activity از بین رفت و مجدداً ایجاد شد، می توانید وضعیت ذخیره شده ی آن را از با استفاده از شیء Bundle که سیستم برای آن Activity پاس می دهد بازیابی کنید. هم متد ()onCreate و هم متد ()onRestoreInstanceState شیء Bundle مشابهی را که حاوی اطلاعات وضعیت activity است را دریافت می کنند.

متد ()onCreate در دو حالت صدا زده می شود: هم موقعی که سیستم یک نمونه ی جدید ایجاد می کند و هم موقعی که سیستم یک نمونه Activity قبلی را مجدداً ایجاد می کند، بنابراین شما می بایست قبل از اینکه شروع به خواندن از شیء Bundle کنید، چک کنید که آیا Bundle تهی است یا نه. اگر تهی بود، سیستم در حال ایجاد یک یک نمونه ی جدید از Activity است، در غیر این صورت سیستم می بایست وضعیت قبلی Activity را بازیابی کند.

مثال زیر، نحوه ی بازیابی برخی از اطلاعات مربوط به وضعیت را در متد ()onCreate نشان می دهد:



مثال بازیابی اطلاعات وضعیت

 
@Override
protected void onCreate(Bundle savedInstanceState){
   
super.onCreate(savedInstanceState);// Always call the superclass first
   
   
// Check whether we're recreating a previously destroyed instance
   
if(savedInstanceState !=null){
       
// Restore value of members from saved state
        mCurrentScore
= savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel
= savedInstanceState.getInt(STATE_LEVEL);
   
}else{
       
// Probably initialize members with default values for a new instance
   
}
   
...
}

ممکن است بخواهید به جای بازیابی اطلاعات وضعیت در متد ()onCreate از متد ()onRestoreInstanceState استفاده کنید.

سیستم این متد را بعد از متد ()onStart فراخوانی می کند.

سیستم متد ()onRestoreInstanceState را تنها اگر وضعیت ذخیره شده ای برای بازیابی وجود داشته باشد بازیابی می کند، بنابراین در این حالت نیاز نیست بررسی کنید که آیا شیء Bundle تهی است یا نه.

Title

Code
public void onRestoreInstanceState(Bundle savedInstanceState){
   
// Always call the superclass so it can restore the view hierarchy
   
super.onRestoreInstanceState(savedInstanceState);
   
   
// Restore state members from saved instance
    mCurrentScore
= savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel
= savedInstanceState.getInt(STATE_LEVEL);
}
 
Note

هشدار: همواره پیاده سازی ()onRestoreInstanceState مربوط به SupperClass (کلاسی که Activity از آن ارث بری می کند) را فراخوانی کنید. با این کار اطلاعات مربوط به وضعیت سلسله مراتبی view که قبلاً به صورت خودکار ذخیره شده بود بازیابی می شود.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه