المبتدئين

الـ Tasks والـ BackStack

يعتبر موضوع الـ Tasks والـ BackStack من الأشياء الاساسية التى يجب على مبرمج الأندرويد أن يكون على علم بها  لانها تساعده فى فهم سلوك التطبيقات فى الأندرويد للتحكم فى تطبيقك بشكل افضل اثناء فتحه من قبل المستخدم ستكون رحلتنا اليوم مع الـ Tasks والـ Backstack  فى نظام الأندرويد والذى سيتضح لك الكثير من الاشياء كنت تجهلها حين يفتح التطبيق  .

 

الـ Tasks والـ BackStack

بشكل عام يتكون التطبيق من واحد أو اكثر من الـ Activities فلا يوجد اى تطبيق يخلو على الاقل من Activity واحد عندما تقوم ببدء تشغيل برنامج من الـ HomeScreen فى الموبايل فانه يقوم بفتح الـ Activity فلنقل MainActivity من داخل MainActivity يمكن ان تضغط على زر فيقوم بفتح Acticvity اخر ومن هذا الـ Activity الاخر يمكنك فتح اكتيفتى ثالث ورابع وخامس و …

هذه الاكتيتفى مجتمعة مع بعضها بالنسبة للأندرويد يطلق عليها task  اى ان الـ task عبارة عن مجموعة من ال Activities مرتبة بترتيب معين حسب فتحها بداخل ما يعرف بالـ Backstack وهو ما تلاحظه عندما تفتح مجموعة من الـ Activites بالتتابع ثم تبدأ بالضغط على زر back فى الشاشة فيقوم باحضار الأكتيتفى السابق تضغط back مرة أخرى فيقوم باحضار الأكتيتفى السابق وهكذا الى ان تصل للـ Home Screen  .

 

وتعتبر الـ Home Screen هى المكان التى تبدأ منه معظم الـ Tasks فى الأندرويد بمجرد ضغطك على ايقونة احد التطبيقات يكون هناك احتمالين هذا التطبيق مفتوح من قبل وله Task سابقة يقوم الاندرويد باحضارها لك أو لا يكون له Taskسابقة فيبدأ الاندرويد Task جديدة خاصة بهذا التطبيق ويسجل معك انتقالك من أكتيتفى الى اخر فى الـ BackStack   .

 

عندما يتم فتح Activity من الـ Activity اخر فان ما يحدث ان الـ Activity الاول يتم وضعه فى حالة توقف وحفظ حالة الواجهة للمستخدم ومناداة onStop ويظهر الـ Activity الثانى اما المستخدم  يقوم المستخدم بالضغط على زر مثلا يفتح Activity ثالث فإن الـ Activity الثانى يوضع فى حالة stop ويظهر الـ Activity الثالث للمستخدم وهكذا والعكس يحدث عند الضغط على زر الـ back من قبل المستخدم يتم تدمير الاكتيتفى  الثالث ويتم اظهار الاكتيتفى السابق للمستخدم وعند الضغط على زر back يقوم بتدمير الاكتيتفى واظهار السابق له كما فى الصورة التوضيحية التالية من موقع المطورين :

 

وعندما يضغط المستخدم back ويتم حذف كل الـ Activites ولم يعد هناك Activities يصل للـ home screen او الى اكتيتفى فى تطبيق اخر اى ان الـ backstack لم يعد يحتوى   عى اى اكتيتفيز يتم حذف التاسك وتنتهى

لذلك عندما تضغط على الزر الايمن من ازرار الـ Navigation يظهر لك اخر التطبيقات  التى كانت مفتوحة فى الحقيقة هذه هى عبارة عن Tasks .

 

وبشكل عام فى الـ BackStack لا يتم اعادة ترتيب الـ Activites بمعنى انه اذا قام المستخدم مثلا بفتح الـتطبيق Main Activity ثم انتقل الى صفحة اخرى مثلا LastNewsActivity هذه الصفحة بها زر يذهب للـ MainActivity وذهب اليها المستخدم عن طريق الضغط على الزر وليس عن طريق زر الـ Back فإن الـBackStack يحتوى الان على MainActivity ،LastNewsActivity,MainActivity  اى انه الان يحتوى على اثنين من الـ MainAcitity .

 

ويمكننا تلخيص سلوك الـ Activites فى الـ Backstack كالتالى :

عندما يتم فتح الاكتيفيتى “ب ” من الأكتيفيتى ” أ ”  فإن الأكتيفيتى ” أ ” يتم ايقافه مؤقتا مع حفظ حالة الوجهة التى كانت امام المستخدم  منها مثلا موضع السكرول اذا كان الاكتيتفى فيه سكرول والمستخدم قام بعمل سكرول لموضع معين .

عند الضغط على زر “back”  والاكتيتفى الحالى هو ” ب” يتم تدمير الأكتيتفيى ” ب ” اى انهاؤه تمام وعمل Resume للأكتيتفى السابق له والذى هو ” أ ” هنا .

 

عندما يذهب المستخدم للخلفية او لتطبيق اخر بدأ Task اخرى ويتم حفظ هذه الـ Task فى الخلفية حتى يعود المستخدم لها لاحقا فيتم عمل Resume لها .

 

لكن فى بعض الحالات قد يحتاج النظام الى رامات أكثر  لتطبيق اخر مفتوح فيقوم بتدمير الـ Activity  موجود فى الخلفيلة فى الـ Backstack وبالتالى يفقد بيانات حالة الواجهه وعند استعادته تجد ان الـ Activity يبدأ من البداية وليس فقط يتم عمل Resume   لذلك يفضل ان تقوم بحفظ بيانات الواجهه بنفسك مثل موضع السكرول وحقول الادخال فى ميثود onSavedInstanceState() الموجودة فى الأكتيتفى .

 

 

إدارة الـ Tasks

النمط الخاص بسلوك الـ backstack الذى وضحناه سابقا مناسب لمعظم التطبيقات لكن فى بعض الاحيان تريد التعديل عليه مثلا تريد أكتيتفى معين يبدأ Task جديدة ولا يبدأ كـ Activity فى هذه الـ Task تريد اكتيتفى معين عند فتحه لا يتم انشاء instance جديد فى الـ backstack وتريد ان يتم احضار الـ instance السابق ان كان تم فتحه من قبل وموجود فى الـ Task هذه الحالات وحالات اخرى قد تواجهك تريد تنفيذ شىء معين فى سلوك الـ Task فيجب أن تقوم بإدارة تعامل الـ Activity مع الـ Task ويمكن ذلك بطريقتين

إما عن طريق ملف Manifest او عن طريق الـ IntentFlags

 

ويعتبر أشهر استخدامات إدارة الـ Tasks  هو 3 Flags تستخدم مع الـ Intent

FLAG_ACTIVITY_NEW_TASK وهذا الـ Flag عندما يعطى للـ Intent  يقوم ببدء Task جديدة باستخدام الـ Activity الذى سيفتح من خلال الـ Intent  .

 

FLAG_ACTIVITY_SINGLE_TOP هذا الـ Flag عندما يعطى للـ Intent يقوم باحضار النسخة القديمة من الـ instance الخاصة بالـ Activity مسبقا وموجودة فى الـ backstack الى المقدمة وعرضها للمستخدم بدون انشاء instance جديد فى التاسك .

 

FLAG_ACTIVITY_CLEAR_TOP وهذا الـ Flag عندما يعطى للـ Intent اذا كان الـ Activity موجود مسبقا فى الـ Backstack  يتم حذف وتدمير كل الـ Activities العلوية التى بعده والتى كان المستخدم سيضغط back ثم back ليصل لهذا الـ Activity  واحضار هذا الـ Activity للمقدمة .

 

 

 

السابق
GCM بالـعربية – الدرس الثانى
التالي
RX Android بالعربية – الدرس الأول

3 تعليقات

أضف تعليقا

  1. Ahmed Ali قال:

    موضوع جميل والشرح بسيط 🙂

  2. Ahmed nasser قال:

    رائع

  3. walid barakat قال:

    هل يوجد مثال

اترك تعليقاً

This site uses Akismet to reduce spam. Learn how your comment data is processed.