BroadcastReceiver on android.net.conn.CONNECTIVITY_CHANGE called multiple times

眉间皱痕 提交于 2019-12-07 02:20:08

问题


I have the following in my manifest

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

and the following BroadcastReceiver:

public class WifiReceiver extends BroadcastReceiver { 
private static String TAG = makeLogTag(WifiReceiver.class);

@Override
public void onReceive(Context context, Intent intent) {

    ConnectivityManager connectivityManager = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = null;
    if (connectivityManager != null) {
        networkInfo =
                connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        LOGD(TAG, "connectivity info:" + networkInfo);
    }

   if(networkInfo != null && networkInfo.isConnected()) {
       //TODO: see why this is called multiple times and handle schedule reloading
       LOGD(TAG, "have Wifi connection and is connected");
   }else
       LOGD(TAG, "don't have Wifi connect or it isn't connected");
}

When i switch from mobile to wifi the receiver get called multiple times (no problem there) but the if(networkInfo != null && networkInfo.isConnected()) branch evaluates to true all 4 times


回答1:


public class NetworkChangeReceiver extends BroadcastReceiver {
Context mContext;

@Override
public void onReceive(Context context, Intent intent) {
    mContext = context;
    String status = NetworkUtil.getConnectivityStatusString(context);

    Log.e("Receiver ", "" + status);

    if (status.equals("Not connected to Internet")) {
        Log.e("Receiver ", "not connction");// your code when internet lost


    } else {
        Log.e("Receiver ", "connected to internet");//your code when internet connection come back
    }

}

}

and use this call for check wifi or internet conenctivity lost

public class NetworkUtil {

public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 2;
public static int TYPE_NOT_CONNECTED = 0;

public static int getConnectivityStatus(Context context) {

    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

    if (null != activeNetwork) {

        if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
            return TYPE_WIFI;

        if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
            return TYPE_MOBILE;
    }
    return TYPE_NOT_CONNECTED;
}

public static String getConnectivityStatusString(Context context) {

    int conn = NetworkUtil.getConnectivityStatus(context);

    String status = null;
    if (conn == NetworkUtil.TYPE_WIFI) {
        //status = "Wifi enabled";
        status="Internet connection available";
    } else if (conn == NetworkUtil.TYPE_MOBILE) {
        //status = "Mobile data enabled";
        status="Internet connection available";
    } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
        status = "Not connected to Internet";
    }
    return status;
}

}

and add this in your androidmanifest file

<receiver
        android:name=".NetworkChangeReceiver"
        android:label="NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

Add internet permission in manifest-file:

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

i hope it's work for you and




回答2:


It's strange. Anyway try this little bit different code:

ConnectivityManager cm =
    (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if(activeNetwork != null){
    boolean isConnected = activeNetwork.isConnected();
    boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

    if(isConnected && isWiFi){

    }
}


来源:https://stackoverflow.com/questions/19207263/broadcastreceiver-on-android-net-conn-connectivity-change-called-multiple-times

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!