مفهوم الـ: Context
افضل طريقة لشرح مفهوم الـ Context هو بالمثال, دعنا نفترض ان لديك مبنى وبداخل المبنى مجموعة من المخازن او المستودعات لتخزين الاغراض, وبداخل كل مستودع بعض الصناديق وكل صندوق بداخله بعض الاغراض, فاذا طلبت منك مثلا ان تحضر لي غرض ما من مستودع ما بداخل المبنى فهنا انا اخبرتك بالوجهة الاولى او المحيط الذي يجب عليك ان تبحث فيه وهو المبنى, ولكن لكي اسهل عملية البحث عليك ساحدد لك المستودع وبشكل اعمق ساحدد لك الصندوق الذي يجب ان تبحث بداخله, فبهذه الطريقة قمت بتضيق المحيط الذي يجب ان تبحث بداخله لكي اسهل عليك مهمة البحث .
لنطبق نفس المثال السابق على الاندرويد, اعتبر ان جهازك هو المبنى وبداخل جهازك مجموعة من التطبيقات (مستودع) و كل تطبيق معزول تماماً عن بقية البرامج الاخرى, وبداخل كل تطبيق بعض المجلدات وكل مجلد مختص بامر ما, فبعض المجلدات قد تجد بداخله صور وبعضها الاخر قد تجد بداخله نصوص او غيرها.
الان ان اردت مثلاً ان اصل الى صورة موجودة في مجلد الصور الخاصة بـ تطبيق X, فيجب علي ان احدد المحيط (Context)الذي يجب ان ابحث بداخله, فالمحيط هنا هو التطبيق, X ويسمى هذا المحيط في الاندرويد بالـContext .
ماهو ال Context
ان اردنا تعريفه من منظور برمجي فالـ Context يعد Abstract Class تستطيع من خلاله الوصول الى ملفات وموارد التطبيق او تستطيع من خلاله استدعاء اوامر موجودة في النظام مثل launching activities, broadcasting and receiving intents في نطاق المحيط الخاص بالتطبيق.
انواع ال: Context
الـ 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 الخاص بالـ Application , قم باستدعائه مباشرة عن طريق ()getApplicationContext
- لاستدعاء الـ Context الخاص بالـ Activity, قم باستدعائه عن طريق ()getBaseContext
- لاتقم ابداً بحفظ الـContext الخاص بالـ Application بداخل اوبجكت من Context وانما قم باستدعائه دائما عن طريق ()getApplicationContext
اخيراً
الـ Context من احد اهم المفاهيم في برمجة الاندرويد والتي يجب عليك معرفتها ومعرفة انواعها وطريقة التعامل معها, فكل نوع لديه صلاحياته الخاصة وكل نوع يجب عليك استخدامه في مكانه المناسب والوقت المناسب.