مبحث BroadcastReceiver برای برنامه نویسی نرم افزارهای حرفهای و نرم افزارهای چت و ارتباطات از اهمیت بالایی برخوردار است.
BroadcastReceiver یک دریافت کننده وضعیت از سمت سیستم عامل است. مثلا فرض کنید میخواهید به محض قطع شدن اینترنت به کاربر خود پیام عدم ارتباط با اینترنت را نمایش دهید، یا این که به محض کم شدن سطح باتری به کاربر پیامی نشان دهید که باتری در حال تمام شدن است.
وضعیتهایی که میتوان آنها را از سیستم عامل دریافت کرد بسیار زیاد هستند ولی نکتهای که باید بدانید این است که برای دریافت وضعیت مورد نظر باید در سیستم عامل ثبت نام کنید.
برای مثال قصد داریم یک BroadcastReceiver را برای بررسی وضعیت اینترنت ایجاد میکنیم.
پیش از شروع کار در Manifest دسترسی بررسی وضعیت شبکه را به برنامه خود میدهیم:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
کلاس MainActivity را به شکل زیر ویرایش میکنیم:
public class MainActivity extends AppCompatActivity {
private CheckNetwork checkNetwork;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
checkNetwork = new CheckNetwork();
registerReceiver(checkNetwork, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
@Override
protected void onStop() {
unregisterReceiver(checkNetwork);
super.onStop();
}
private class CheckNetwork extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
boolean isConnected = networkInfo != null && networkInfo.isConnectedOrConnecting();
if(isConnected){
Toast.makeText(MainActivity.this, "اینترنت وصل است", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "اینترنت قطع است", Toast.LENGTH_SHORT).show();
}
}
}
}
سطر 23: یک کلاس به نام CheckNetwork را از BroadcastReceiver ارث بری یا extends میکنیم. یک متد ضروری برای این کلاس وجود دارد به نام onReceive که باید آن را اضافه کنیم.
سطر 27: یک شی از روی ConnectivityManager مانند فوق ایجاد میکنیم.
سطر 28: متد getActiveNetworkInfo را از شی connectivityManager در خواست و درون networkInfo که از نوع NetworkInfo است ذخیره میکنیم.
سطر 29: مقادیر مقابل مساوی دو شرط هستند که بدلیل موجود && در صورتی isConnected را برابر true قرار میدهند که هم networkInfo برابر null نباشد و هم متد isConnectedOrConnecting شی networkInfo برابر true باشد.
سطرهای 31 تا 35: در صورت درست بودن شرط isConnected پیام "اینترنت وصل است" و در صورت غلط بودن شرط isConnected پیام "اینترنت قطع است" نمایش داده میشود.
سطر 3: یک شی به نام checkNetwork از روی متد CheckNetwork ایجاد میکنیم تا در متدهای دیگر بتوانیم از این متد استفاده کنیم.
سطر 11: متد onStart که یکی از مراحل حیات اکتیویتی MainActivity است را ایجاد میکنیم. این متد وقتی اکتیویتی اجرا و شروع به کار میکند اجرا خواهد شد.
سطر 13: درون متغیر checkNetwork شی CheckNetwork را قرار دادیم.
سطر 14: در این سطر با registerReceiver این BroadcastReceiver را در سیستم عامل ثبت نام میکنیم. ورودیهای این متد یکی checkNetwork و دیگری IntentFilter با مقدار android.net.conn.CONNECTIVITY_CHANGE است. این مقدار مخصوص دریافت وضعیت تغییرات شبکه است.
سطر 18: متد onStop نیز یکی از مراحل حیات اکتیویتی MainActivity است که آن را در این مکان ایجاد کردیم. متد onStop پس از توقف فعالیت اکتیویتی فراخوانده میشود.
سطر 19: متد unregisterReceiver برای حذف انتظار BroadcastReceiver از سیستم عامل استفاده میشود.
عملکرد این بخش مانند زیر است:
در هنگام اجرای برنامه پیام "اینترنت وصل است" نمایش داده میشود، به محض بستن WIFI پیام "اینترنت قطع است" نمایش داده میشود، و با وصل مجدد دوباره پیام "اینترنت وصل است" نمایش داده میشود.
در مثال بالا BroadcastReceiver را در سطح Activity ایجاد کردیم یعنی این BroadcastReceiver تنها در حالت حیات MainActivity فعال است و در صورت بسته شدن نرم افزار دیگر عمل نمیکند.
می توان BroadcastReceiver را به گونهای تنظیم کرد که به صرف نصب بودن نرم افزار در گوشی اندروید، گوشی تان وضعیتهای مختلف را دریافت کند.
مثلا فرض کنید میخواهید نرم افزاری را پیاده سازی کنید که به محض قطع شدن اینترنت عملیات خاصی را انجام دهد.
یا بر فرض مثال به محض وصل شدن اینترنت نرم افزار بدون این که باز شود به سرور متصل شده و دادههای جدید را دریافت کند.
برای انجام عملیات خاص باید BroadcastReceiver را در سطح Mainfest پروژه خود قرار دهید.
یک تگ جدید در Manifest خود به نام resiver مانند زیر ایجاد کنید:
<receiver android:name=".SampleBroadCastReceiver">
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
در سطر اول و در مقابل name نام کلاسی که حین دریافت BroadcastReceiver باید فعال شود را ذکر میکنیم.
در سطرهای 2 تا 4 یک intent-filter و action ایجاد میکنیم.
در سطر 3 و در تگ action و در name نام حالتی که قصد دارید وضعیت آن را رصد کنید را ذکر میکنید.
کلاس SampleBroadCastReceiver را مانند زیر ایجاد کنید:
public class SampleBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("networkStatus", "وضعیت شبکه تغییر کرده است");
}
}
اگر برنامه فوق را در ماشین مجازی اجرا کنید خواهید دید لاگی با نام networkStatus در صورت تغییر وضعیت شبکه WIFI در Android Monitor ظاهر میشود، و فرقی نمیکند که نرم افزار شما باز باشد یا بسته.
البته حالتهایی که میتوان آنها را دریافت کرد بسیار زیاد هستند و تقریبا برای هر حالتی میتوانید یک BroadcastReceiver یافت. لینک این حالت را در این جا ببینید.
ممنون از آموزش جالبتون لطفا ادامه بدید...
منتظر آموزش های بعدیتون هستیم.