ماهو الـ Context? وطريقة استخدامه وانواعه

الـ Context يعد تقريباً من اكثر الامور المستخدمة في برمجة الاندرويد, وبالتأكيد قد تعاملت معه في تطبيقك ولكن كيف يعمل وماهو بالضبط؟

مفهوم الـ Context

افضل طريقة لشرح مفهوم الـ Context هو بالمثال, دعنا نفترض ان لديك مبنى وبداخل المبنى مجموعة من المخازن او المستودعات لتخزين الاغراض, وبداخل كل مستودع بعض الصناديق وكل صندوق بداخله بعض الاغراض, فاذا طلبت منك مثلا ان تحضر لي غرض ما من مستودع ما بداخل المبنى فهنا انا اخبرتك بالوجهة الاولى او المحيط الذي يجب عليك ان تبحث فيه وهو المبنى, ولكن لكي اسهل عملية البحث عليك ساحدد لك المستودع وبشكل اعمق ساحدد لك الصندوق الذي يجب ان تبحث بداخله, فبهذه الطريقة قمت بتضيق المحيط الذي يجب ان تبحث بداخله لكي اسهل عليك مهمة البحث .

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

الان ان اردت مثلاً ان اصل الى صورة موجودة في مجلد الصور الخاصة بـ تطبيق X, فيجب علي ان احدد المحيط (Context)الذي يجب ان ابحث بداخله, فالمحيط  هنا هو التطبيق X, ويسمى هذا المحيط في الاندرويد بالـContext.

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

Screen Shot 2015-11-26 at 1.22.38 AM

ماهو الـ Context

ان اردنا تعريفه من منظور برمجي فالـ Context يعد Abstract Class تستطيع من خلاله الوصول الى ملفات وموارد التطبيق او تستطيع من خلاله استدعاء اوامر موجودة في النظام مثل  launching activities, broadcasting and receiving intents في نطاق المحيط الخاص بالتطبيق.

انواع الـ Context

context_class_hierarcy

الـ Context له العديد من الانواع وليست جميعها متشابهه اثناء انشائها, فنوعها يعتمد على الـ Component الذي قام بانشائها:

Application

الـ Context من هذا النوع يعد singleton وهذا يعني ان تطبيقك لديه Context واحد فقط من نوع application ومن خلال هذا الـ context تستطيع الوصول الى جميع المصادر (resuorese) والملفات الخاصة بالتطبيق سواء كانت صور او واجهات او غيرها, تستطيع استدعاء هذا الـ Context طريق الميثود  getApplication() من اي Activity او Service, وتستطيع استدعائه عن طريق getApplicationContext() من اي Object يرث من Context, من ناحية اخرى لايهم من اي Class قمت باستدعائهلانه في جميع الاحوال سيرجع لك نفس الـ Context.

Activity/Service

هذا النوع يرث من ContextWrapper وهو مايعرف بـ base context, فعند انشائك لـ Activity or Service جديدة, سيقوم النظام بانشاء Context خاص بها, وهذا يعني اذا قمت بانشاء two acttivities سيقوم النظام بانشاء Context لكل Acticity, و مايجب عليك الانتباه له هو ان كل context قام النظام بانشائه هو معزول تماماً عن الاخر اي ان الـ context الخاص بالـ Activity الاول ليس له الصلاحية للوصول الـ Context الاكتفتي الثانيه الا عن طريق Application Context وهو الذي يجمعهم سويه.

Broadcast Receiver

لايحتوي على Context خاص به ولايقوم النظام بانشاء واحد خاص به مثل الـ Activity, ولكن مايفعله النظام هو انه يمرر له Context عند استدعائه, والـ Context الذي سيقوم النظام بتمريره له هو الـ Context الذي قام باستدعائه, فمثلا لو قام Service بالتعامل مع الـ Broadcast Receiver سيقوم النظام بتمرير الـ Context الخاص بالسيرفس عن طريق ميثود  onReceive() في كل مرة يتم استدعائه فيها.

Content Provider

ايضا لاتحتوي على Context خاص بها, ولكن يعطى لها Context عند انشائها والتي يمكن الوصول لها عن طريق getContext().

صلاحيات الـ Context

كما قلنا سابقاً ان هناك انواع عديدة من الـ Context وبعضها معزول تماماً عن الاخر “baseContext” وبعضها لديه الصلاحية للوصول الى Context اصغر منه “ApplicationContext”, فبعضها تستطيع من خلاله الوصول الى بعض الصلاحيات وبعضها لاتستطيع

BroadcastReceiverContentProviderServiceActivityApplication 
لالالانعملاShow a Dialog
نعم "ولكن لاينصح"نعم "ولكن لاينصح"نعم "ولكن لاينصح"نعمنعم "ولكن لاينصح"Start an Activity
نعم "ولكن لاينصح"نعم "ولكن لاينصح"نعم "ولكن لاينصح"نعمنعم "ولكن لاينصح"Layout Inflation
نعمنعمنعمنعمنعمStart a Service
لانعمنعمنعمنعمBind to a Service
نعمنعمنعمنعمنعمSend a Broadcast
لانعمنعمنعمنعمRegister BroadcastReceiver
نعمنعمنعمنعمنعمLoad Resource Values

تنبيهات للتعامل مع الـ Context

  • لإستدعاء الـ Context الخاص بالـ Application , قم باستدعائه مباشرة عن طريق getApplicationContext()
  • لاستدعاء الـ Context الخاص بالـ Activity, قم باستدعائه عن طريق getBaseContext()
  • لاتقم ابداً بحفظ الـContext الخاص بالـ Application بداخل اوبجكت من Context وانما قم باستدعائه دائما عن طريق getApplicationContext()

اخيراً

الـ Context من احد اهم المفاهيم في برمجة الاندرويد والتي يجب عليك معرفتها ومعرفة انواعها وطريقة التعامل معها, فكل نوع لديه صلاحياته الخاصة وكل نوع يجب عليك استخدامه في مكانه المناسب والوقت المناسب.

Share:
1 comments on ماهو الـ Context? وطريقة استخدامه وانواعه
Ahmad Mustafa
  • نوفمبر 28 2015
  • رد
تسلم الأنامل أ.عبد الله مجهود تشكر عليه .....

Post a comment

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *