15 – اندرويد دورة حياة الفعالية – تشغيل الفعالية Activity Lifecycle :Starting an Activity

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

اندرويد : تشغيل الفعالية   Activity Lifecycle – Starting an Activity

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

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

  1. فهم واستيعاب استدعاءات دورة الحياة الفعالية lifecycle callbcaks
  2. تحديد مشغل فعالية تطبيقك   App’s Launcher Activity
  3. إنشاء مستنسخ جديد Create a New Instance
  4. هدم الفعالية Destroy the Activity

تشغيل الفعالية Starting an Activity

على غيار بقية نماذج لغات البرمجة والتي يتم فيها تشغيل البرنامج عبر استخدام تابع main(), فإن نظام اندرويد يبدأ الكود ضمن مستنسخ من الفعالية Activity instance, وذلك عبر استدعاء بعض توابع الاستدعاء الخاصة callback methods والمتعلقة بمراحل محددة من دورة حياة الفعالية.

هنالك سلسلة من توابع الاستدعاءات والتي تقوم بتشغيل الفعاية , وسلسلة أخرى من توابع الاستدعاء التي تقوم بهدم الفعالية.

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

فهم واستيعاب استدعاءات دروة حياة الفعالية understand the Lifecycle callbcaks

خلال حياة الفعالية , يقوم النظام باستدعاء مجموعة اساسية من التوابع الخاصة بدورة حياة الفعالية, ضمن تسلسل يشبه عملية الصعود والخطو إلى أعلى الهرم.

هذا يعني بأن كل مرحلة من مراحل دورة حياة الفعالية بمثابة خطوة منفصلة على الهرم.

ما إن ينشأ النظام مستنسخ جديد من فعالية ما, فإن كل تابع استدعاء ينقل الفعالية خطوة واحدة باتجاه اعلى الهرم.

تمثل قمة الهرم النقطة التي تعمل فيها الفعالية في المقدمة ويستطيع المستخدم التفاعل معها.

ما إن يبدأ المستخدم بترك الفعالية حتى يستدعي النظام بقية التوابع methods الاخرى التي تحرك الفعالية خطوة للوراء باتجاه اسفل الهرم وذلك بهدف تفكيك الفعالية.
في بعض الحالات , قد تتحرك الفعالية خطوة محدودة باتجاه اسفل الهرم وتبقى تنتظر( على سبيل المثال , عندما ينتقل المستخدم إلى تطبيق آخر), ومن تلك النقطة يمكن للفعالية ان تنتقل خطوة مرة اخرى باتجاه القمة ( في حال عاد المستخدم إلى الفعالية ) وتتابع من النقطة التي توقف عندها المستخدم.

start 1

الشكل 1 : عبارة عن شكل توضيحي يبين دورة حياة الفعالية, ممثلة على شكل هرم مدرج.

 يبن لنا الشكل كيف ان مقابل كل استدعاء للفعالية يخطو بها خطوة باتجاه حالة “المتابعة” Resumed  – المتوجدة في القمة – ,يوجد هنالك تابع استدعاء يأخذ بالفعالية خطوة للاسفل.

بإمكان الفعالية ايضا الرجوع إلى حالة “المتابعة ” resumed state من حالة الايقاف المؤقت Paused State ومن حالة التوقف Stopped State.

على الاغلب لن تحتاج إلى تنجيز كل هذه التوابع الخاصة بدورة حياة الفعالية , وهذا الأمر يعتمد على مدى تعقيد فعاليتك.

على كل الأحوال, من المهم ان نفهم كل تابع من التوابع , ونقوم بتنجيز implement تلك التوابع التي تحقق لنا سلوك ملائم لتطبيقنا يوافق توقعات المستخدم.

إن القيام بالتنجيز implement الصحيح لتوابع دورة حياة الفعالية يضمن لك ان يعمل تطبيقك بشكل جيد من عدة نواحي, بما فيها مايلي:

  • أن لا ينهار التطبيق في حال تلقى المستخدم اتصال هاتفي أو قام بالتحول إلى تطبيق آخر اثناء استخدام تطبيقك.
  • لا يستهلك موارد النظام القيمة وذلك اثناء عدم استخدام المستخدم للتطبيق بشكل فعلي.
  • أن لا يفقد المستخدم المستوى الذي وصل إليه في تطبيقك وذلك في حال غادر المستخدم التطبيق وعاد إليه في وقت لاحق.
  • أن لا ينهار التطبيق أو يفقد المستوى الذي وصل إليه المستخدم فيه وذلك اثناء التنقل بين التوضعات المختلفة للشاشة (عمودي أو افقي).

وكما سنرى لاحقا , فإن هنالك عدة اوضاع يمكن للفعالية ان تنتقل عبرها بين الاوضاع المختلفة للفعالية , كما هو موضح في الشكل 1.

على كل الأحوال, من ضمن تلك الأوضاع هنالك فقط ثلاث اوضاع ثابتة, ويمكن للفعالية ان تتواجد في أحد هذه الاوضاع الثلاث لفترة ممددة من الزمن:

وضع الاستمرار Resumed:

في هذه الحالة , تكون الفعالية في المقدمة , وبإمكان المستخدم التفاعل معها.(يشار إلى هذه الوضعية في بعض الأحيان بوضعية التشغيل  running state).

وضعية التوقف المؤقت Paused:

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

وضعية التوقف Stopped :

في هذه الحالة , تكون الفعالية مخفية بشكل كامل , وليست ظاهرة للمستخدم. وتعتبر موجودة في الخلفية. يحافظ مستنسخ الفعالية اثناء التوقف على كافة معلومات حالة الفعالية مثل : متحولات المستخدم member variable, ولكن لا يمكن تنفيذ اي كود.

بقية الحالات ( حالة الإنشاء created أو حالة بدء التشغيل Started) هي حالات وقتية عابرة , وينتقل النظام بسرعة إلى الحالة التالية عبر استدعاء تابع الاستدعاء المناسب لدورة حياة الفعالية.

بعد ان يستدعي النظام التابع onCreate(), فإنه يقوم بسرعة باستدعاء التابع onStart(), والذي يتبعه فورا التابع onResume().

هذا هو كل ما يخص الامور الاساسية من دورة حياة الفعالية.

الآن سوف نتعلم عن بعض سلوكيات الخاصة بدورة حياة الفعالية activity lifecycle behavior.

تحديد مشغل فعالية تطبيقك  App’s Launcher Activity

عندما يختار المستخدم ايقونة تطبيقك من الشاشة الرئيسية من جهازه, يقوم عندها النظام باستدعاء التابع onCreate() من اجل الفعالية الموجودة في تطبيقك (الفعالية التي حددتها لأن تكون الفعالية الأساسية المشغلة للتطبيق “launcher” or “main” ). تلك الفعالية هي الفعالية التي تقوم بمقام نقطة المدخل الرئيسي ضمن واجهة المستخدم إلى تطبيقك.

بإمكانك ان تتحكم في اختيار الفعالية التي ترغب بأن تكون الفعالية الرئيسية لتطبيقك , وذلك من خلال ملف Android manifest AndroidManifest.xml, ويقع هذا الملف تحت جذر مجلد المشروع مباشرة.

يجب ان يتم التصريح عن الفعالية الاساسية في تطبيقك ضمن ملف ال manifest باستخدام تاغ الفلتر  <intent-filter> والتي تتضمن كل من التاغات التالية:

على سبيل المثال :

 <activity android:name=”.MainActivity” android:label=”@string/app_name”>

<intent-filter>

<action android:name=”android.intent.action.MAIN” />

<category android:name=”android.intent.category.LAUNCHER” />

</intent-filter>

</activity>

ملاحظة : عندما تقوم بإنشاء مشروع اندرويد جديد عبر استخدام ادوات SDK, فإن ملفات المشروع الافتراضية تتضمن صف Activity وقد تم التصريح عنه ضمن ملف manifest عبر استخدام تاغ الفلتر <intent-filter>.

في حال لم يتم اسناد إحدى فعالياتك إلى احد التاغات التالية MAIN أو MAIN , عندها لن تظهر ايقونة تطبيقك على الشاشة في الصفحة الرئيسية لجهاز اندرويد Home screen ضمن قائمة التطبيقات.

إنشاء مستنسخ جديد Create a New Instance

تحوي معظم التطبيقات على عدة فعاليات مختلفة والتي تمكن المستخدم من انجاز مهام متعددة.

سواء كانت الفعالية هي الفعالية الاساسية main activity  التي تم انشائها عند ضغط المستخدم على ايقونة تطبيقك أو كانت فعالية اخرى قام تطبيقك بتشغلها كاستجابة للاحداث القادمة من المستخدم, فإن النظام يقوم بإنشاء المستنسخات الجديدة من الفعالية new instance of Activity  عبر استدعاء التابع onCreate() الخاص بها.

يتوجب عليك تنجيز implement  التابع (الوظيفة) onCreate() وذلك لتنجز العمليات المنطقية الاساسية الخاصة ببدء تشغيل التطبيق, والتي تحدث – أي هذه العمليات المنجزة ضمن التابع onCreate()) لمرة واحدة ضمن دورة حياة الفعالية. على سبيل المثال, يجب ان تقوم اثناء تنجيز التابع onCreate() بتعريف وتحديد واجهة المستخدم , وربما قد تقوم ايضا باستنساخ بعض المتحولات الخاصة بالصف possibly instantiate some class-scope variables.(سيتم شرحها بعد لحظات).

على سبيل المثال:

المثال التالي الخاص بالتابع onCreate() يظهر لنا بعض الترميز الذي يقوم بانجاز بعض الاعدادات الاساسية الخاصة بالفعالية, مثل التصريح عن واجهة المستخدم( المعرفة ضمن ملف التنسيق XML), وتعريف بعض المتحولات الأعضاء member variable,وتشكيل وربط بعض واجهات المستخدم بمكانها الصحيح.

TextView mTextView; // Member variable for text view in the layout

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

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

// Make sure we’re running on Honeycomb or higher to use ActionBar APIs

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

// For the main activity, make sure the app icon in the action bar

// does not behave as a button

ActionBar actionBar = getActionBar();

actionBar.setHomeButtonEnabled(false);

}

}

 

ملاحظة : تم استخدام SDK_INT وذلك لمنع النظم القديمة من تنفيذ واجهات التطبيق الجديدةnew APIs  , ويتم العمل بهذا الاسلوب مع Android2.0  (API level 5)أو أعلى. اما النسخ القديمة فسوف يظهر لنا استثناء في زمن التنفيذ runtime exception.

ما إن ينتهي تابع onCreate() من التنفيذ, حتى يستدعي النظام التابع onStart()  و onResume() بتتابع سريع.

لا تبقى الفعالية ابدا في اي من حالتي الإنشاء Created أو حالة البدء Started.

بعبارة تقنية بإمكاننا القول بأن الفعالية تصبح ظاهرة للمستخدم عندما يتم استدعاء التابع onStart() , والذي يتبعه بسرعة استدعاء التابع onResume() ومن ثم تبقى الفعالية مضن حالة المتابعة Resumed state حتى يحدث شيء ما ويغير تلك الوضعية, على سبيل المثال  بأن يقوم المستخدم بتلقي اتصال هاتفي, عندها ينتقل المستخدم إلى فعالية أخرى, أو تطفي شاشة الجهاز.

سنرى في الدروس القادمة كيف ان بقية التوابع الخاصة ببدء التشغيل والاقلاع onStart() و onResume(), مفيدة خلال دورة حياة الفعالية وبذلك عند استخدامها لمتابعة الفعالية من حالة التوقف المؤقت أو حالة التوقف التام.

ملاحظة:  يتضمن التابع onCreate() معامل parameter يدعى savedInstanceState, والذي سيتم الحديث عنه في احد الدروس القادمة والذي يتحدث عن “اعادة انشاء الفعالية Recreating an Activity”.

 

الشكل 2 : صورة توضيحية اخرى تبين هيكل دورة حياة الفعالية , مع محاولة التأكيد ضمن الشكل على الاستدعاءات الثلاث الاساسية التي يقوم النظام باستدعائها ضمن تتالي محدد وذلك عند انشاء مستنسخ جديد من الفعالية onCreate() , onStart() و   onResume().ما إن ينتهي هذا التسلسل من الاستدعاءات, حتى تصل الفعالية إلى حالة المتابعة Resumed state حيث يصبح بإمكان المستخدم التفاعل مع الفعالية إلى ان ينتقل إلى فعالية أخرى.

الشكل 2 : صورة توضيحية اخرى تبين هيكل دورة حياة الفعالية , مع محاولة التأكيد ضمن الشكل على الاستدعاءات الثلاث الاساسية التي يقوم النظام باستدعائها ضمن تتالي محدد وذلك عند انشاء مستنسخ جديد من الفعالية onCreate() , onStart() و onResume().ما إن ينتهي هذا التسلسل من الاستدعاءات, حتى تصل الفعالية إلى حالة المتابعة Resumed state حيث يصبح بإمكان المستخدم التفاعل مع الفعالية إلى ان ينتقل إلى فعالية أخرى.

هدم الفعالية Destroy the Activity

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

لا تحتاج أغلب التطبيقات إلى تنجيز implement هذا التابع , وذلك لأن مراجع الصف المحلية local class references قد تم تهديمها مع الفعالية , ويتوجب على فعاليتك ان تنجز اغلب عمليات التنظيف من خلال تابعي onPause() و onStop().

على كل الاحوال, في حال كانت تحوي فعاليتك على مسارب تعمل في الخلفية background threads (إن جاز التعبير عن كلمة threads بمسارب) والتي قمت بإنشائها من خلال onCreate() أو غير ذلك من الموارد التي تم تشغيلها من فترة طويلة والتي قد تؤدي إلى عوز بالذاكرة في حال لم يتم اغلاقها بشكل صحيح, عندها يتوجب عليك قتل هذه الامور المذكورة والتخلص منها واغلاقها عبر استدعاء التابع onDestroy().

@Overridepublic void onDestroy() {super.onDestroy();  // Always call the superclass

// Stop method tracing that the activity started during onCreate()

android.os.Debug.stopMethodTracing();

}

ملاحظة : يستدعي النظام التابع onDestroy()  بعد استدعاءه للتابع لكل من onPause() و onStop() في كل الحالات باستثناء حالة واحدة:  وذلك في حالة قيامك باستدعاء التابع finish()  ضمن التابع onCreate(). في بعض الحالات قد تعمل فعاليتك بمثابة صانع مؤقت للقرار temporary decision maker  لتشغيل فعالية اخرى, ربما تستدعي التابع finish() من خلال التابع onCreate() وذلك لهدم الفعالية. في هذه الحالة, يقوم النظام فورا باستدعاء التابع onDestroy() بدون استدعاء أي من التوابع الاخرى الخاصة بدورة حياة الفعالية.

اتمنى ان يكون شرح “تشغيل الفعالية ” وعمل التابع onCreate() قد اصبح واضحاً لكم.وإلى لقاء قريب في الدروس القادمة التي ستتمحور حول الحالات التي تمر بها الفعالية والموضحة بالرسوم التوضيحية اعلاه.

أما بالنسبة للدرس القادم فسوف نتطرق فيه إلى شرح عملية “ التوقيف المؤقت للفعالية ومن ثم متابعة تشغيلها”.

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

 

الترجمة

المصطلح

فعالية

Activity

تابع أو وظيفة

method

استدعاء

Callback or call

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

Implements

رماز أو كود

Code

تطبيق

Application

مشغّل

Launcher

Advertisements

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

  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 مدونون معجبون بهذه: