16 – اندرويد دورة حياة الفعالية – ايقاف واعادة تشغيل الفعالية Activity Lifecycle :Stopping and Restarting an Activity

ملاحظة : الموضوع عبارة عن حلقة من حلقات سلسلة برمجة وتطوير اندرويد Android Development

اندرويد : ايقاف واعادة تشغيل الفعالية   Activity Lifecycle – Stopping and Restarting an Activity

السلام عليكم ورحمة الله وبركاته

سوف نتعلم في هذا الدرس مايلي :stop-android

  1. ايقاف فعاليتك stop your activity
  2. تشغيل / إعادة تشغيل فعاليتك start/restart your activity

ايقاف واعادة تشغيل الفعالية stopping and restarting an activity

تعتبر عملية ايقاف واعادة تشغيل الفعالية عملية اساسية ومهمة ضمن دورة حياة الفعالية , وهي مهمة جدا للمستخدمين الذين يستخدمون تطبيقك فيجب ألا يفقدوا اي معلومات خلال هذه العملية .

هنالك بضعة سيناريوهات يتم عبرها ايقاف واعادة تشغيل الفعالية :

  • يفتح المستخدم تطبيقك ومن ثم يقوم بالتحويل إلى تطبيق اخر. عندها فإن فعالية تطبيقك الموجودة في المقدمة سوف تتوقف. في حال عاد المستخدم إلى تطبيقك من خلال ايقونة تشغيل تطبيقك الموجودة في الصفحة الرئيسية للجهاز , او من خلال نافذة التطبيق الحالية , فإنه سيعاد تشغيل فعاليتك.
  • يقوم المستخدم بتنفيذ حدث ما ضمن تطبيقك , والذي يقوم بدوره بتشغيل فعالية جديدة.عندها فإن الفعالية الحالية سوف تتوقف وذلك عند انشاء الفعالية الجديدة. اما عندما نقر المستخدم على “زر العودة” back button , فإنه يعاد تشغيل الفعالية.
  • عندما يتلقى المستخدم اتصال هاتفي على جهازه اثناء استخدام تطبيقك.

 يزودنا صف Activity بتابعين خاصين بدورة حياة الفعالية الا وهما : onStop() و onRestart() , وهذان التابعيين يمكناننا من التعامل مع حالتي التوقف stopped state واعادة التشغيلrestarted state .

على نقيض حالة التوقف المؤقت paused state , والتي تتغيب فيها واجهة المستخدم الخاصة بالفعالية بشكل جزئي, أما حالة التوقف stopped state فإنها تضمن بأن تكون واجهة المستخدم غير مرئية ابدا, ويكون آنذاك تركيز المستخدم على فعالية اخرى(أو على تطبيق أخر).

ملاحظة : بما ان النظام يحتفظ بمستنسخ الفعالية ضمن ذاكرة النظام في حال توقفها, لذلك فإنه من المحتمل أن لا تحتاج إلى تنجيز implement اي من التابعيين onStop() وonRestart()  (او حتى تابع onStart()).

فيما بتعلق باغلب الفعاليات البسيطة, تتوقف الفعالية ويعاد تشغيلها بشكل جيد دون الحاجة إلى تنجيز اغلب التوابع الخاصة بدورة حياة الفعالية , لكن ربما قد تحتاج فقط إلى استخدام التابع onPause() لوقف الاحداث الجارية ولتحرر موارد النظام.

 

الشكل 1 : عندما يغادر المستخدم فعاليتك , يقوم النظام باستدعاء التابع onStop() لايقاف الفعالية (1).اما في حال عاد المستخدم إلى الفعالية المتوقفة , عندها يقوم المستخدم باستدعاء التابع onRestart() (2), وبسرعة يلي هذا الاستدعاء استدعاء التابع onStart() (3)ومن ثم استدعاء التابع onResume()(4). لاحظ بانها مهما كانت السيناريوهات التي قد تسبب توقف الفعالية , فإن النظام دوما يستدعي التابع onPause() قبل استدعاء التابع onStop().

الشكل 1 : عندما يغادر المستخدم فعاليتك , يقوم النظام باستدعاء التابع onStop() لايقاف الفعالية (1).اما في حال عاد المستخدم إلى الفعالية المتوقفة , عندها يقوم المستخدم باستدعاء التابع onRestart() (2), وبسرعة يلي هذا الاستدعاء استدعاء التابع onStart() (3)ومن ثم استدعاء التابع onResume()(4). لاحظ بانها مهما كانت السيناريوهات التي قد تسبب توقف الفعالية , فإن النظام دوما يستدعي التابع onPause() قبل استدعاء التابع onStop().

ايقاف فعاليتك Stop Your Activity

عندما تتلقى الفعالية استدعاء من قبل التابع onStop(), فإنها لا تعود مرئية , ويتوجب تحرير تقريبا كل الموارد الغير ضرورية والتي لا يستخدمها المستخدم.

ما إن تتوقف فعاليتك, فمن المحتمل عندها ان يدمر النظام مستنسخ الفعالية في حال احتاج إلى استعادة ذاكرة النظام. في الحالات القصوى, قد يقوم النظام ببساطة بقتل اجرائية تطبيقك بدون ان يستدعي الاستدعاء الاخير onDestroy()  الخاص بالفعالية, لذلك فإنه من الضروري استخدام التابع onStop() لتحرير النظام من الموارد التي قد تسبب عوز الذاكرة.

بالرغم من ان التابع onPause() يتم استدعائه قبل استدعاء التابع onStop(), فإنه يتوجب عليك استخدام التابع onStop() لانجاز العمليات الكبيرة الثقيلة على المعالج CPU, مثل عملية كتابة المعلومات في  قاعدة المعطيات.

على سبيل المثال, فيما يلي تنجيز للتابع  onStop() والذي يقوم بتخزين محتويات المذكرة في تخزين دائم:

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

    // 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());

    getContentResolver().update(
            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.
            );
}

عندما تتوقف فعاليتك, يبقى غرض Activity ضمن الذاكرة , ويتم استدعائه مرة اخرى عند متابعة الفعالية.ولا تحتاج إلى اعادة تهيئة المكونات التي تم انشائها من خلال اي تابع من توابع الاستدعاء التي توصلنا إلى حالة المتابعة Resumed state. يتتبع النظام الحالة الحالية لكل view ضمن التنسيق, لذلك في حال ادخل المستخدم نص ضمن حقل نصي EditText, فإن هذا المتحوى يتم الاحتفاظ به , لا تحتاج إلى حفظه واستعادته.

ملاحظة : حتى ان قام النظام بتدمير فعاليتك اثناء توقفها, فإن النظام يبقى محافظا على حالة اغراض ال view ( مثل النص المدخل ضمن EditText ) ضمن Bundle (عبارة عن ثنائيات من مفتاح – قيمة) ويقوم باستعادتهم في حال انتقل المستخدم رجوعا مرة اخرى إلى نفس المستنسخ من الفعالية( في الدرس القادم سوف نتحدث بالتفصيل عن استخدام Bundle لتخزين حالة المعطيات الاخرى في حال تم تدمير فعاليتك destroyed  ومن ثم تمت اعادة انشائها recreated).

تشغيل / وإعادة تشغيل فعاليتك Start /Restart Your Activity

عندما تعود فعاليتك إلى المقدمة من حالة التوقف stopped state, فإنها تتلقى استدعاء من التابع onRestart(). يقوم النظام ايضا باستدعاء التابع onStart(), وهذا يحدث في كل مرة تصبح فيه الفعالية مرئية ( وذلك في حال كان يتم إعادة تشغيل الفعالية او انشائها لاول مرة).

على كل الاحوال , فإن التابع onRestart() يتم استدعائه فقط عندما يتم متابعة تشغيل الفعالية من حالة التوقف stopped state, لذلك بإمكانك استخدامه لاعادة العمل على ما كان عليه.

ليس من الشائع استخدام التابع onRestart() لاستعادة حالة الفعالية, لذلك ليس هنالك أي توجيهات فيما يخص هذا التابع .

على كل الاحوال, بما انه يتوجب على التابع onStop() ان ينفذ عمليات تنظيف الموارد الاساسية الخاصة بفعاليتك, لذلك فإنه يتوجب عليك ان تقوم باعادة استنساخ re-instantiate تلك الموارد عند اعادة تشغيل فعاليتك.

وكذلك تحتاج إلى استنساخ instantiate هذه الموارد عند انشاء فعاليتك للمرة الاولى( وذلك عندما لا يتواجد اي مستنسخ من الفعالية بعد). لهذا السبب, يتوجب عليك ان تستخدم استدعاء التابع onStart() كنظير للتابع onStop(), لان النظام يستدعي التابع onStart() عندما ينشأ فعاليتك وكذلك عند اعادة تشغيل الفعالية مرة اخرى من حالة التوقف stopped state.

على سبيل المثال, قد يطيل المستخدم الفترة التي يبقى فيها بعيدا عن تطبيقك قبل العودة اليه مرة اخرى, لذلك فإن التابع onStart() يمثل المكان المناسب للتحقق من ان موارد النظام المطلوبة لا تزال متاحة:

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

    // The activity is either being restarted or started for the first time
    // so this is where we should make sure that GPS is enabled
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}

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

    // Activity being restarted from stopped state    
}

 عندما يقوم النظام بتهديم فعاليتك, فإنه يقوم باستدعاء التابع onDestroy() على فعاليتك.

وبما انك قد قمت بتحرير اغلب الموارد المرتبطة بفعاليتك عبر التابع onStop(), لذلك فإنه في الوقت الذي تتلقى فيه استدعاء من التابع onDestroy() لا يكون قد تبقى لك الكثير لتقوم به عند هذه المرحلة.

يمثل التابع onDestroy() اخر فرصة لك لتقوم بتنظيف الموارد التي قد تقودنا في حال اهملنا تنظيفها إلى عوز في الذاكرة , ويجب ان تتأكد من انه قد تم تدمير المسارب الاضافية additional threads are destroyed.

وإلى اللقاء في الدرس القادم الذي يتحدث عن “اعادة انشاء الفعالية recreating an activity”

وإلى ذلك الحين استودعكم الله والسلام عليكم ورحمة الله وبركاته.

الترجمة

المصطلح

فعالية

Activity

تابع أو وظيفة

method

استدعاء

Callback or call

تنجيز ( اي كتابة الكود البرمجي اللازم)

Implements

رماز أو كود

Code

تطبيق

Application

مشغّل

Launcher

, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

  1. أضف تعليقاً

أضف تعليقاً

Please log in using one of these methods to post your comment:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: