NetworkChangeReceiver的onReceive方法在3G和WIFI同时开启时被多次调用

nik*_*kki 2 java android broadcastreceiver wifi 3g

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

所以我的问题是:
有没有办法只监听互联网连接,而不是网络变化?
或者有什么办法onReceive可以在3G和Wifi同时启用的情况下只调用一次方法?

这是我的代码:

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;

    }

}
Run Code Online (Sandbox Code Playgroud)

在 Android 清单中:

<receiver android:name="xxxxx.xxxxx.xxxxx.NetworkChangeReceiver" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

这是日志:

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):连接!

(注意时间!)

Hri*_*ova 5

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。