Как зарегистрировать приемник изменения сетевого подключения программно? - PullRequest
0 голосов
/ 31 января 2019

В моем приложении я хочу уведомить, если устройство потеряло сетевое соединение и снова ли оно подключено к сети.

Итак, я написал Broadcastreceiver следующим образом:

class NetworkReceiver() : BroadcastReceiver() {

override fun onReceive(context: Context?, intent: Intent?) {

    if (isNetworkConnected(context)) {
        //do some stuff
    } else {
        //do smoke stuff
    }
}

private fun isNetworkConnected(context: Context?): Boolean {
    val connectivityManager: ConnectivityManager? = context?.getSystemService(Context.CONNECTIVITY_SERVICE)
            as ConnectivityManager?
    if (connectivityManager != null) {
        if (Build.VERSION.SDK_INT < 23) {
            val networkInfo: NetworkInfo? = connectivityManager.activeNetworkInfo
            if (networkInfo != null) {
                return networkInfo.isConnected
                        && networkInfo.type == ConnectivityManager.TYPE_WIFI
                        || networkInfo.type == ConnectivityManager.TYPE_MOBILE
            }
        } else {
            val network: Network? = connectivityManager.activeNetwork
            if (network != null) {
                val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
                return (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                        || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN))
            }
        }
    }
    return false
}

Мой вопрос, как я могу зарегистрировать этот широковещательный приемник в своей активности, чтобы вызвать NetworkReceiver, когда мое устройство подключено или отключено отсеть.Какой IntentFilter мне следует использовать?

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Чтобы программно зарегистрировать ваш BroadcastReceiver, вы можете использовать следующий код:

private NetworkReceiver reciver;


@Override
    protected void onStart() {
        super.onStart();

        reciver = new NetworkReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        this.registerReceiver(reciver, filter);
    }


      @Override
    protected void onDestroy() {
        super.onDestroy();
        this.unregisterReceiver(reciver);

    }
0 голосов
/ 31 января 2019

BroadcastReceiver

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

import static com.keshav.networkchangereceiverexample.MainActivity.dialog;

public class NetworkChangeReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        try
        {
            if (isOnline(context)) {
                dialog(true);
                Log.e("keshav", "Online Connect Intenet ");
            } else {
                dialog(false);
                Log.e("keshav", "Conectivity Failure !!! ");
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

    private boolean isOnline(Context context) {
        try {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            //should check null because in airplane mode it will be null
            return (netInfo != null && netInfo.isConnected());
        } catch (NullPointerException e) {
            e.printStackTrace();
            return false;
        }
    }
}

В файле манифеста:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<receiver android:name=".receivers.NetworkChangeReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
</receiver>
...