برمجة الأندرويد

ما وراء الـ Context

تنبيه (14/1/2016) هذا المقال مكتوب باللغة العامية المصرية .. وبناءا على استفتاء متابعين هنديوير اخذنا قرار بالكتابة باللغة العربية الفصحى .. لذلك نعتذر ان كان هناك بعض المصطلحات الغير مفهومة ويمكنك الرد بتعليق اذا واجهتك صعوبة فى أحد المصطلحات .
تخيل فى مرة كده تصحى من النوم تلاقى نفسك فى مكان بعيد أول مرة تشوفه لا عارف البيوت ولا الشوارع ولا عارف تميز الطرق ولا الأماكن  ايه الفرق بين ده وبين انك تصحى فى بيتكم ؟

الفرق بين الموقفين دول نفس الفرق بين انشاء أى مكون من مكونات الأندرويد بدون كونتكست والاخر انشاؤه بالكونتكست

يعنى الكونتكست باختصار ده عباره عن مجموعة معلومات عن بيئة التطبيق .

فلو مثلا ينفع نعمل Button من غير Context كالتالى :

 Button btn = new Button();

تخيل بقى ان الـ Button ده هيكون تايه زيك بالظبط لو صحيت فى مكان بعيد ولو اتكلم هيقولك أين انا بحق الجحيم الى جابنى الاكتيتفى ده وبعمل ايه هنا  بالظبط ؟ !

أما لما تعمل Button

 Button btn = new Button(this);

 

 

كده تمام والـ Button هنا خد الـ Context فى الـ Constructor  والى هو هنا this وبنشير بيها لكونتكست الأكتيتفتى والبوتن عارف بقى دلوقت هو فى أى أكتيتفى وبيعمل ايه بالظبط والتطبيق ده شغال ازاى  وهكذا ..

تعالى بقى نعرف ايه هو الكونتكست ده بالظبط

 

ما هو  الـ Context  ؟

كلمة Context تعنى ” سياق ” بالعربية مثل سياق النص أو سياق الحديث ..

موقع مطورى الأندرويد الرسمى بيعرف كلاس الـ Context انه عباره عن كلاس يحتوى معلومات شاملة حول بيئة التطبيق وبيتم تنفيذه عن طريق نظام الأندرويد والى عن طريق الكلاس ده بنقدر نعمل Access لكل الى عاوزينه زى مثلا الـ Resourcess بتاعة التطبيق بالإضافة اننا عن طريقه بنقدر نفتح Activities اخرى أو نبدأ سيرفس أو نعمل بروكاستينج أو نستدعى Resourcess معينة من الـ Resourcess   .

 

ملحوظة :  ميثود startActicity  دى أحد الـ Methods الموجوده فى الـ Context يعنى مش تبع الاكتيتفى اصلا  لكن الأكتيتفى بيورث من  كلاس بتورث من الـ كونتكست !  .

الصورة دى من موقع stackoverflow بتوضحلك علاقة الأكتيتفى بالكونتكست

mn21A

 

ركز على السهم الأزرق بس

ومش فقط الأكتيتفى هو الى بيورث من الـ كونتكست لا كمان الـ Application ذات نفسه ولو انت من محبى العبث جرب تعمل كلاس يعمل extend للـ Application ودوس على كنترول واضغط كلمة Applicatoion وامشى معاه دوس على الحاجات الى الـ Application بيعمل extend ليها هتلاقى برضو انه بيورث من الـ ContextWrapper والى بتورث هيا من الـ Context

 

طيب ايه حكاية الـ ContextWrapper دى بقى ؟

دى ياسيدى بتورث من الـ Context وبتحتوى على عدة Methods مهمة جدا وبتفيدنا وانت بتشتغل بيها كتير على سبيل المثال الى فى الصورة دول  ودى عبارة عن سكرين شوت واخدينها من كلاس الـ Context Wrapper  :

Screen Shot 2016-01-08 at 9.16.09 PM

 

 

أكيد طبعا سبق ليك استخدام شىء منهم قبل كده وبرضو ميثود startActivity(); و   startActivityForResult(); موجودين جوه الـ ContextWrapper

 

كده تمام فكرة الـ Context ومفهوم عمله بدأ يتضح طيب بقى ايه حكاية getApplication و getActivity و this و getBaseContext الخ ….

بالنسبة لموضوع getActivity فدى ميثود بترجع بالأكتيتفى بالكونتكست بتاعه  فمممكن تستخدمها ككونتكست أو تستخدمها فى غرض تانى للتعديل على الأكتيتفيى أو أحد مكوناته .

getApplication بترجع بالأبليكشن بالكونتكست برضو

getApplicationContext بترجع بـ Context التطبيق كامل بما فيه كونتكست كل الأكتيتفيز

getContext ودى بترجع بـ Context الـ View نفسه زى مثلا v.getContext

getBaseContext  ودى أحد الميثودس الموجوده فى الـ ContextWrapper Class وبترجع بالـ BaseContext

 

الخلاصة :

– الكونتكست عبارة عن معلومات بيئة التطبيق وأى أكتيتفى بيورث من كلاس الـ Context وكذلك الأبليكشن بيورثها

–  this بيشير لكونتكست الأكتيتفيتى .

–  كونتكست getApplicationContext بيرجع بالـ Context لكامل التطبيق والذى يستمر مع دورة حياة التطبيق حتى الاغلاق .

–  كونتكست Activity.this بيعود بـ Context الأكتيتفى الحالى وبيستمر مع دورة حياة الاكتيتفى وبينتهى بانتهاء الأكتيتفى

التالي
ليه بنعمل Cast

20 تعليق

أضف تعليقا

  1. باسم نصر قال:

    موضوع هايل كما عودتنا
    شكرا اخ هندي

    1. Hendiware قال:

      شكرا لك ياباسم نورت التدوينة ^ـ^

  2. نت قال:

    ممكن تكتب المصطلحات بالانجليزية كما هي
    يعني بدل ما تكتب الكونستركتور … اكتب consrtactor
    والباقي زي كده أحسن

    1. Hendiware قال:

      حاضر إن شاء الله .. شكرا على التنبيه .

  3. عبدالله النجار قال:

    موضوع جميل وشرح ممتاز keep up the good work

    1. Hendiware قال:

      شكرا لك صديقى عبدالله
      نورت المدونة بزيارتك

  4. Sama قال:

    موضوع رائع والاسلوب اروع

    1. Hendiware قال:

      شكرا جزيلا .. مبسوطين إنه عجبك

  5. أحمد مجدى قال:

    عاش يا هندى .. بالتوفيق 🙂

    1. Hendiware قال:

      لنا ولك ياأحمد
      نورتنا بزيارتك للمدونة ^^

  6. bayhas قال:

    البساطة بالشرح حلوة

  7. أحمد علي قال:

    اولا مشكور علي المقال الرائع بس في سؤال بسيط
    دلوقت لو انا استخدمت getApplicationContext في ال Toast مثلا هتفرق ايه عن this أو getBaseContext
    هل دا بياخد مساحه من الذاكرة وبيأثر علي سرعة أداء التطبيق ؟ اخر حاجه كان يا ريت تكتب امتي نستخدمهم لان ساعات بقعد الف علي جملة ال context الشغالة 😀

    1. Hendiware قال:

      لما تكون هتستخدم حاجه دورة حياتها جوه الأكتيتفى استخدم this ولما هتكون هتستخدم حاجه عامة على مستوى التطبيق هتستخدم getApplicationContext
      لأن الـ Context بتاع الأكتيتفيى (this) بينتهى مجرد ما ينتهى الأكتيتفيتى من دورة حياته .
      يعنى انت الى تحدد حسب كودك وظروفك

  8. mohamed قال:

    شكرا جدا موضوع رائع كنت محتاجه جدا

  9. صلاح ايمن قال:

    بجد مدونه فوق الممتاز

  10. fadi quader قال:

    فهمني اكتر من الشرح الانجليزي
    شرح عظيم

  11. Anas قال:

    اخي ممكن مثال اخر لاني لم افهم جيدا مثلا ارى getcontext().xxxxx او شيء اخر و لم افهم استعماله ايضا في arrayadapter ، اريد ان افهم جيدا لكي اعرف كتى يجب علي استعمال context في method خاص بي مثلا

  12. شكرا على المدونة الرائعة و المقالات ولا اروع…. صراحة تفاجأت حين ما نصحني صديقي بهذا الموقع …. شاهد المقالات باحترافية رائعة في الأداء والإلقاء. وعرضت علي أشياء كانت مبهمة … شكرا جزيلا. …

  13. محمد قال:

    بارك الله فيك اخى الكريم

  14. ibrahim sar قال:

    دائما ما تتطرقون الى موضيع مهمة بطريقة بسيطة وواضحة ومفهومة شكرا لكم دمتم متألقين

اترك تعليقاً

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.