یکی از محدودیت هایی که در برنامه نویسی اندروید نسبت به سایر زبان های برنامه نویسی وجود داره اینه که تقریبا در 90 درصد قسمت های اندروید به شیء context یا activity نیاز داریم . برای مثال برای استارت یک سرویس اگه از یک activity بخواهیم سرویس رو استارت کنیم فقط کافیه بنویسیم :
1 |
startService(service); |
اما حالا فرض کنید که ما یک کلاسی ساختیم و این کلاس یک Activity نیست و قراره تو این کلاس یک سرویس رو استارت کنیم ! اما مشکل اینه که دیگه اینجا نمیتونیم از کد بالا برای استارت سرویس استفاده کنیم چون کلاس ما از اکتیویتی مشتق نشده . برای حل این مشکل چند راه وجود داره :
-
استفاده از constructor یا سازنده :
اگه کلاس ما قراره در قسمتی دیگه ای از برنامه نمونه سازی یا Instantiate بشه میتونیم یکی از پارمتر های Constructor رو شیء Context یا Activity بذاریم :
1 2 3 4 5 |
public Class myClass{ Activity activity; public myClass(Activity activity){ } } |
با این روش شیء activity در تمام کلاس ما قابل استفاده است.
-
استفاده از شیء Activity در پارامتر های متد :
فرض کنید شما میخواهید با استفاده از یک متد، یک پنجره درخواست اجازه از یوزر رو باز کنید مثلا درخواست اجازه دسترسی به مخاطبین یا کارت حافظه ، و فرض کنید برای اینکار یک متدی استاتیکی نوشتیم که فقط مجوزی که برای همون بخش رو نیاز داریم مثلا Manifast.permission.WRITE_EXTERNAL_STORAGE رو به عنوان پارامتر بهش میدیم و متد پنجره همون درخواست رو برای ما نشون میده . اینجا ما میتونیم یکی از پارامتر های متدی که تعریف کردیم رو شیء Activity بذاریم و برای بررسی نتیجه انتخاب یوزر هم از متد onActivityResult همان اکتیوی استفاده کنیم .
1 2 3 |
public static void showPermissionDialig(Activity activity,String permission){ ... } |
-
استفاده از کلاس Application :
برای دسترسی به متد های یک اکتیویتی در کلاس های دیگه ای که خودشون Context دارن میتونیم از این روش استفاده کنیم . ابتدا یک کلاس به اسم مثلا MyApplication میسازیم که از کلاس Application مشتق شده باشه :
1 2 3 4 5 |
public class MyApplication extends Application { public MainActivity mainActivity; } |
سپس این کلاس باید به عنوان خاصیت name مربوط به تگ <application> فایل AndroidManifast.xml قرار داده بشه :
1 2 3 |
<application name=".MyApplication" ... > |
بعد از این اگر به کلاس MainActivity و متد هایش نیاز داشتیم در متد onCreate کلاس MainActivity به این صورت عمل میکنیم :
1 2 3 4 5 6 7 8 |
public class MainActivity extends AppCompatActivity{ void onCreate(... ) { ... MyApplication myApplication=(MyApplication)getApplication(); myApplication.mainActivity=this; } } |
و در آخر در کلاس یا اکتیوتی دیگه ای که به متد های کلاس MainActivity نیاز داریم از این کد ها استفاده میکنیم :
1 2 3 4 5 6 7 8 9 10 |
public class AnotherActivity extends AppCompatActivity{ void onCreate(... ) { ... MyApplication myApplication=(MyApplication)getApplication(); // یا در کلاس هایی که از اکتیویتی مشتق نمیشن : //MyApplication myApplication=(MyApplication)context.getApplication(); MainActivity activity=myApplication.mainActivity; } } |
-
استفاده از Activity به صورت استاتیک :
حال فرض کنید که هیچ کدوم از روش های بالا برای ما قابل استفاده نیست حالا به هر دلیلی ! اینجا میتونیم از این روش استفاده کنیم که اول یک شی استاتیک از Actitity در یکی از اکتیویتی های که بهش نیاز داریم میسازیم برای مثال فرض کنید به شیء Activity یا Context کلاس MainActivity نیاز داریم :
1 2 3 4 5 6 7 8 9 |
public Class MainActivity extends AppCompatActivity{ public static Activity activity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.activity=this; } } |
حالا برای استفاده از خاصیت شیء activity کلاس MainActivity فقط کافیه هرجا که بهش نیاز داریم با استفاده از کد زیر ازش استفاده کنیم :
1 |
Activity anotherActivity=MainActivity.activty; |
اما تا حد امکان سعی کنید یک اکتیوی رو به صورت استاتیک استفاده نکنید یا اگه استفاده کردید از شی context اون استفاده کنید به این صورت که :
1 |
Context context = anotherActivity.getApplicationContext(); |