چگونه برادکست رسیور را ثبت کنیم؟

درس بعدی | | | | | درس قبلی

‌Broadcast receiver به سادگی به پیام های پخش شده از برنامه های دیگر یا از خود سیستم پاسخ می دهند. این پیام ها گاهی اوقات رویدادها یا اهداف نامیده می شوند. به عنوان مثال ، برنامه ها همچنین می توانند پخش را آغاز کنند تا سایر برنامه ها بدانند که برخی از داده ها در دستگاه بارگیری شده اند و برای آنها در دسترس است ، بنابراین این گیرنده پخش است که این ارتباط را رهگیری کرده و اقدامات مناسب را آغاز می کند.

برای ایجاد BroadcastReceiver برای اهداف پخش شده در سیستم ، دو مرحله مهم وجود دارد –

ایجاد ‌Broadcast Receiver

ثبت Broadcast Receiver

اگر بخواهید اهداف دلخواه خود را پیاده سازی کنید ، یک مرحله دیگر وجود دارد ، شما مجبورید آن اهداف را ایجاد و پخش کنید.

ایجاد ‌Broadcast Receiver
یک گیرنده پخش به عنوان یک زیر کلاس از کلاس BroadcastReceiver و ایجاد متد onReceive (که هر پیام به عنوان یک پارامتر شی object Intent دریافت می شود) پیاده سازی می شود.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
     ...
   }
}

ثبت Broadcast Receiver

برای نسخه های اندروید کمتر از ۷ کافی است تنظیمات به صورت زیر در مانیفست (manifest.xml) انجام شود. ما قصد داریم برنامه ای بنویسیم که اپلکیشن از فعال و غیر فعال شدن اینترنت با خبر شود.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ir.faratez.msession4">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <receiver android:name=".Mybroadcast">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

همانطوریکه مشاهده می شود ابتدا یک سطح دسترسی برای وضعیت شبکه دریافت شده است که کد آن در زیر آمده است:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

در دستور receiver برادکسترسیور ثبت می شود. کلاس Mybroadcast که قبلا ایجاد شده است معرفی شده است و در دستور receiver این کلاس جهت بررسی تغییرات اتصال ثبت شده است.

<receiver android:name=".Mybroadcast">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

به کلاس Mybroadcast برمیگردیم. جهت بررسی وضعیت شبکه تابع () checkNetwork را نوشتیم. کد آن بصورت زیر است:

    private boolean checkNetwork(Context mContext){
        try {
            ConnectivityManager conManager= (ConnectivityManager)
                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo nInfo=conManager.getActiveNetworkInfo();
            if (nInfo.isConnected()){
                return true;
            }else{
                return false;
            }
        }catch (NullPointerException e){
            return false;
        }


    }

توسط متد ConnectivityManager و سپس ()getActiveNetworkInfo وضعیت اتصال بررسی شده و نتیجه در nInfo ذخیره می‌شود. متد از نوع boolean بوده و قرار است یک نتیجه true یا false برگرداند. سپس با دستور زیر تعیین می شود اتصال برقرار است یا خیر.

if (nInfo.isConnected()){
                return true;
            }else{
                return false;
            }

در رویداد () onReceive کد زیر را می نویسیم تا با تغییر وضعیت شبکه یک پیغام به کاربر نمایش دهد.

 public void onReceive(Context context, Intent intent) {
        if (checkNetwork(context)){
            Toast.makeText(context, "اتصال به شبکه برقرار است", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(context, "اتصال برقرار نیست", Toast.LENGTH_SHORT).show();
        }
    }

به کلاس MainActivity میرویم. چنانچه نسخه اندروید بالای ۷ باشد مجدد در متد onResume باید برادکست رسیور ثبت شود. بنابراین اول تعیین میشود نسخه اندروید چند است و اگر بالای ۲۴ (اندروید ۷ یا بالاتر) بود ثبت می شود. به صورت زیر:

@Override
    protected void onResume() {
        if (Build.VERSION.SDK_INT>Build.VERSION_CODES.N){
            myBroadcast=new Mybroadcast();
            registerReceiver(myBroadcast,new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
        }
        super.onResume();
    }

جهت جلوگیری از بروز خطا باید در رویداد onPause عدم ثبت انجام شود. کد آن بصورت زیر است.

 @Override
    protected void onPause() {
        unregisterReceiver(myBroadcast);
        super.onPause();
    }

برنامه را اجرا می کنیم با فعال و غیرفعال کردن Wifi پیغام Toast نمایش داده می شود.