lifecycle یک Activity بخش دوم

در پست های قبلی در رابطه با lifecycle یک Activity در اندروید به صورت مختصر توضیح داده شد.در این پست سعی بر این است که به صورت پایه ای تر به lifecycle بپردازیم.

onCreate()

این متد(callback) زمانی که سیستم activity را می سازد صدا زده می شود.در زمان اجرای این متد activity  در وضعیت Created قرار می گیرد.در این متد منطق اولیه برای activity  پیاده می شود.برای مثال اجرای یک thread ، bind کردن یک list و مقدار دهی متغیر های سطح activity در متد onCreate انجام می شود.این متد دارای یک پارامتر ورودی به اسم savedInstanceState از جنس Bundle  است که اگر activity  برای اولین بار است که اجرا می شود برابر است با null.هدف از savedInstanceState نگهداری وضعیت قبلی activity است.

TextView mTextView;

// some transient state for the activity instance
String mGameState;

@Override
public void onCreate(Bundle savedInstanceState) {
    // call the super class onCreate to complete the creation of activity like
    // the view hierarchy
    super.onCreate(savedInstanceState);

    // recovering the instance state
    if (savedInstanceState != null) {
        mGameState = savedInstanceState.getString(GAME_STATE_KEY);
    }

    // set the user interface layout for this Activity
    // the layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);

    // initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_view);
}

// This callback is called only when there is a saved instance previously saved using
// onSaveInstanceState(). We restore some state in onCreate() while we can optionally restore
// other state here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
}

// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
    out.putString(GAME_STATE_KEY, mGameState);
    out.putString(TEXT_VIEW_KEY, mTextView.getText());

    // call superclass to save any view hierarchy
    super.onSaveInstanceState(out);

کد بالا نشان دهنده نحوه استفاده از متد onCreate است.

زمانی که activity از وضعیت created خارج شد به وضعیت Started تغییر وضعیت خواهد داد.

onStart()

این متد آماده کننده activity برای نمایش و همچنین برای تعامل با کاربر است.متد onStart() همانند متد onCreate به سرعت خاتمه می یابد.به عبارتی وضعیت activity در حالت Started نخواهد ماند.

onResume()

بعد از اینکه activity آماده تعامل با کاربر شد صدا زده می شود و در این حالت activity  به وضعیت Resumed تغییر وضعیت می دهد.این وضعیت تا زمانی که برای activity حالتی رخ ندهد که focus را از دست بدهد ادامه خواهد یافت.حالت هایی که ممکن است activity  فوکس را از دست بدهد:

  • خاموش شدن صفحه
  • رفتن به یک activity دیگر
  • تماس ورودی
  • و …

در حالت های بالا  activityبه وضعیت Paused تغییر وضعیت خواهد داد و سیستم اندروید متد onPause() را صدا می زند.اگر به هر عنوان دوباره activity از وضعیت Paused به وضعیت Resumed تغییر وضعیت دهد متد onResume فراخوانی خواهد شد.بنابراین یک activity به طور مرتب بین وضعیت Paused و Resumed تغییر وضعیت خواهد داد.

همچنین ممکن است نیاز باشد که در متد onResume منابعی که در متد onPause رها کرده بودید دوباره مقدار دهی کنید:

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first


    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

onPause()

این متد زمانی فراخوانی می شود که کاربر به هر عنوان activty را ترک کند:

  • مواردی که در onResume گفته شد.
  • در اندروید ۷٫۰ (API level 24) ممکن است هنگام استفاده از قابلیت multi-window mode برنامه جاری ما روی صفحه باشد ولی کاربر با برنامه دیگری در حال کار کردن است.به عبارتی focus روی برنامه ما نیست.
  • activty فعال است ولی focus به وسیله یک activty دیگر مثل دیالوگ گرفته شده است.

در متد onPause می توان منابعی که روی باتری تاثیر گذار هستند ولی کاربر به آنها نیاز ندارند را آزاد کرد.مثل  broadcast receiverها و یا سنسور ها.

برای مثال اگر activty در حال استفاده از دوربین هست onPause محل خوبی برای آزاد کردن است:

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first


    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

مدت زمان اجرای onPause() بسیار کوتاه است و نباید عملیات های زمان بری مثل تراکنش دیتابیس و یا شبکه ای در این متد انجام شود.برای این منظور بهتر است از متد onStop()  که در ادامه توضیح داده خواهد شد استفاده کنیم.توجه داشته باشید که اگر یک activity به وضعیت Paused تغییر وضعیت دهد تا زمانی که به طور کامل Stoped و یا Resumed شود در وضعیت Paused خواهد ماند.

onStop()

زمانی که activity از دید خارج می شود(invisible) این متد صدا زده می شود.خیلی مهم هست که در متد onStop() منابع را آزاد کنیم.زیرا ممکن هست هیچ زمان onDestroy صدا زده نشود .همچنین اطلاعات مورد نیاز از activity جاری را نیز باید ذخیره کنیم:

@Override
protected void onStop() {
    // call the superclass method first
    super.onStop();

    // save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    // do this update in background on an AsyncQueryHandler or equivalent
    mAsyncQueryHandler.startUpdate (
            mToken,  // int token to correlate calls
            null,    // cookie, not used here
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
    );
}

توجه داشته باشید که onStop به معنی پایان یک activity نیست و سیستم اندروید کماکان activity را در رم نگه می دارد.همچنین اطلاعاتی که در view وجود دارد را نیز در صورت فعال شدن مجدد activity حفظ خواهد کرد.برای مثال اگر کاربر در حال تایپ یک مقدار در EditText باشد در صورتی که متد onStop صدا زده شود و دوباره activity فعال شود مقدار EditText حفظ خواهد شد.

حتی زمانی که سیستم اندروید activity را destroys می کند در این حالت باز وضعیت viewهای موجود در activity حفظ خواهند شد و به صورت اتوماتیک در شی savedInstanceState ذخیره و بازیابی خواهند شد.

onDestroy()

این متد زمانی که تابع finish() و یا سیستم تصمیم می گیرد پروسس را صدا بزند فراخوانی می شود.onDestroy() تمام منابعی که در onStop خالی نشده بودند را صدا می زند.

توجه داشته باشید که سیستم اندروید یک activity از kill نمی کند بلکه تمام پروسس و هر چه درون پروسس هست را در صورت نیاز kill خواهد کرد.همچنین شانس اینکه با یک برنامه در حال کار کردن باشید و سیستم تصمیم بگیرد آن پروسس را kill کند بسیار کم است.

پاسخ دهید

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