当同时启用3G和WIFI时,会多次调用NetworkChangeReceiver的onReceive方法

时间:2014-05-06 14:22:32

标签: java android broadcastreceiver wifi 3g

我正在开发一个Android应用程序,我有下一个问题: 我实现了用于连接更改的广播接收器,当同时启用3G和Wifi时,方法onReceive似乎连续被调用了4次。

所以我的问题是:
有没有办法只监听互联网连接,而不是网络变更? 或者,当同时启用3G和Wifi时,方法onReceive只能被调用一次吗?

这是我的代码:

public class NetworkChangeReceiver extends BroadcastReceiver {

    public static final String TAG = "NetworkMonitoring";

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

        if (isOnline(context)) {

            Log.v(TAG, "Connected!");
            // update(context);
        } else {

            Log.v(TAG, "Not connected!");
            // stopUpdate(context);

        }
    }

    public boolean isOnline(Context context) {

        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnected())
            return true;
        return false;

    }

}

在Android Manifest中:

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

这是日志:

05-06 16:24:05.985:V / NetworkMonitoring(569):已连接!
05-06 16:24:10.250:V / NetworkMonitoring(569):已连接!
05-06 16:24:10.720:V / NetworkMonitoring(569):已连接!
05-06 16:24:11.031:V / NetworkMonitoring(569):已连接!

(注意时间!)

1 个答案:

答案 0 :(得分:3)

我对同一类型的广播接收器有同样的问题。 搜索了一下,找到了解决方法。

BroadcastReceiver receives multiple identical messages for one event

编辑: 解决方法是使用一个标志,告诉您何时第一次调用onReceive。

public class ConnectionChangeReceiver extends BroadcastReceiver {
    private static boolean firstConnect = true;

    @Override
    public void onReceive(Context context, Intent intent) {
        final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null) {
            if(firstConnect) { 
                // do subroutines here
                firstConnect = false;
            }
        }
        else {
            firstConnect= true;
        }
    }
}

希望它有所帮助。