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



我正在开发一个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): Connected!
05-06 16:24:10.250: V/NetworkMonitoring(569): Connected!
05-06 16:24:10.720: V/NetworkMonitoring(569): Connected!
05-06 16:24:11.031: V/NetworkMonitoring(569): Connected!

(注意时间!)

我在使用相同类型的广播接收器时遇到了同样的问题。搜索了一下,找到了一个解决方法。

BroadcastReceiver为一个事件接收多个相同的消息

编辑:解决方法是使用一个标志,告诉您何时第一次调用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;
        }
    }
}

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新