اگه تازه وارد دنیای اندروید شده باشی، حتماً دیدی که هر کاری میخوای بکنی، اندروید ازت یه چیزی به اسم Context میخواد. میخوای یه پیام ساده (Toast) نشون بدی؟ کانتکست بده. میخوای بری صفحه‌ی بعد؟ کانتکست بده. می‌خوای دیتابیس راه بندازی؟ باز هم کانتکست!

احتمالا برات سوال پیش اومده که این کانتکست دقیقاً چیه که همه‌جا هست؟ و از اون مهم‌تر، چرا گاهی مینویسیم Activity.this و گاهی مینویسیم getApplicationContext()؟ مگه جفتشون کانتکست نیستن؟

توی این مقاله میخوایم خیلی ساده و کاربردی، پرونده‌ ی این کانتکست‌ ها رو ببندیم و ببینیم کجا باید از کدوم استفاده کنیم تا برنامه‌ مون نه کرش کنه، نه حافظه‌ ی گوشی رو الکی اشغال کنه.

کانتکست (Context) در اندروید چیست؟

کانتکست (Context) چیست؟

تصور کن توی یه شرکت بزرگ استخدام شدی. هر بخش این شرکت (انبار، حسابداری، پارکینگ) برای خودش یه سری قوانین داره. تو برای اینکه بتونی از پرینتر استفاده کنی یا وارد سلف بشی، نیاز به یه «کارت تردد» داری که نشون بده تو واقعاً کارمند اونجایی و دسترسی‌ های لازم رو داری.

در اندروید، Context دقیقاً همین کارت تردد یا «معرفی‌نامه» است. کانتکست به سیستم‌عامل میگه: «من بخشی از این اپلیکیشن هستم و اجازه دارم به منابع سیستم (مثل دیتابیس، عکس ‌ها یا سرویس ‌ها) دسترسی داشته باشم.»

تفاوت اصلی در یک نگاه

تفاوت این دوتا کانتکست، دقیقاً توی «میزان اعتبار» و «عمر» اون‌هاست. بیا با یه مثال ملموس بررسیشون کنیم:

۱. Activity Context (یا همون Activity.this)

این کانتکست مثل «بلیط سینما» میمونه. فقط برای همون سانس و همون سالن اعتبار داره. وقتی مینویسی MainActivity.this یعنی داری از کانتکستی استفاده میکنی که متعلق به همون صفحه‌ ست.

  • عمرش چقدره؟ تا وقتی که اون صفحه (Activity) بازه. اگه کاربر دکمه Back رو بزنه، این کانتکست هم باطل میشه.

  • کجا ازش استفاده کنیم؟ هر جا که با ظاهر برنامه (UI) سر و کار داری. مثلاً برای نشون دادن دیالوگ‌ها، رفتن به صفحه‌ی جدید یا نمایش توست (Toast).

۲. Application Context

این یکی مثل «کارت ملی» میمونه. همه‌جا اعتبار داره و تا وقتی تو (اپلیکیشن) زنده هستی، این کارت هم همراهته.

  • عمرش چقدره؟ از لحظه‌ای که برنامه باز میشه تا لحظه‌ای که کاربر کلاً از برنامه خارج میشه و پردازشش بسته میشه.

کجا ازش استفاده کنیم؟ برای کارهای زیرساختی و غیر ظاهری. مثلاً وقتی میخوای یه کتابخانه‌ ی دیتابیس رو راه بندازی که قراره توی کل برنامه ‌ات ثابت بمونه.

چرا نباید این دوتا رو جا به جا استفاده کنیم؟

شاید بگی: «خب من همه‌ جا از Application Context استفاده میکنم که خیالم راحت باشه همیشه هست!» اما داستان به این سادگی نیست. دو تا مشکل بزرگ پیش میاد:

  1. مشکل ظاهری: کانتکستِ اپلیکیشن چون به هیچ صفحه‌ ی خاصی وصل نیست، نمیتونه کارهای ظاهری انجام بده. مثلاً اگه بخوای با کانتکستِ اپلیکیشن یه AlertDialog نشون بدی، برنامه‌ات با مخ می‌خوره زمین (Crash می‌کنه)! چون سیستم نمیدونه این دیالوگ رو روی کدوم صفحه نمایش بده.

  2. نشت حافظه (Memory Leak): این همونجاییه که برنامه‌ نویس ‌های تازه‌کار رو به دردسر میندازه. اگه کانتکستِ یک اکتیویتی (که موقتیه) رو به یه بخش دائمی از برنامه بدی، وقتی اکتیویتی بسته میشه، اندروید نمیتونه اون رو از حافظه پاک کنه، چون یه جای دیگه هنوز بهش اشاره شده. اینطوری حافظه گوشی پر میشه و برنامه سنگین و کُند عمل میکنه.

ویژگی Activity Context Application Context
طول عمر تا وقتی صفحه بازه تا وقتی اپلیکیشن بازه
کار با UI ✅ بله (عالیه) ❌ خیر (باعث کرش میشه)
دسترسی به منابع ✅ بله ✅ بله
خطر Memory Leak ⚠️ زیاد ✅ خیلی کم

جمع ‌بندی

توی اندروید، انتخاب کانتکست درست مثل انتخاب لباس مناسبه:

  • اگه میخوای بری توی مهمونی (UI و نمایش دیالوگ)، لباس مجلسی بپوش (Activity Context).

  • اگه میخوای بری پیاده‌ روی طولانی و کارهای زیربنایی انجام بدی، لباس راحت و موندگار بپوش (Application Context).

همیشه یادت باشه: اگه کارت به نمایش چیزی روی صفحه مربوط میشه، شک نکن و از Activity.this استفاده کن. در غیر این صورت، getApplicationContext() رفیق امن ‌تریه.