用于互联网连接的 Android BroadcastReceiver 调用了两次

标签 android android-activity broadcastreceiver android-broadcast android-networking

我遇到这个问题有一段时间了,注意到其他一些人也遇到了这个问题,但我无法解决。

问题

我有一个 BroadcastReceiver,它一直在监听互联网变化。因此,每当互联网连接或断开连接时,我都会在 onReceive 中获得状态接收器。

问题是它总是被调用两次。当我连接调试器并在代码中设置断点时,我可以看到它被调用了两次,但我的状态更改代码会执行。当调试器未连接时,在这种情况下,我的状态更改代码根本不会执行。

我的代码

广播接收文件

public class ConnectivityReceiver
    extends BroadcastReceiver {

public static ConnectivityReceiverListener connectivityReceiverListener;

public ConnectivityReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent arg1) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();

    if (connectivityReceiverListener != null) {
        connectivityReceiverListener.onNetworkConnectionChanged(isConnected);
    }
}

public static boolean isConnected() {
    ConnectivityManager
            cm = (ConnectivityManager) MyApplication.getInstance().getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null
            && activeNetwork.isConnectedOrConnecting();
}


public interface ConnectivityReceiverListener {
    void onNetworkConnectionChanged(boolean isConnected);
}

}

明显的 Intent 行动

<receiver
        android:name=".utils.ConnectivityReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

这里是当我只尝试使用 <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 时在过滤器中,然后它也来到了onRecieve两次。当我尝试使用 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 时,那我就没来onReceive完全没有。

基础 Activity

 @Override
public void onNetworkConnectionChanged(boolean isConnected) {
    setNetworkIndicator(isConnected); //THE CODE TO EXECUTE ON STATUS CHANGE
}

我尝试了现有的答案,但它对我不起作用。

最佳答案

我的猜测是 wifi 接收器被调用了两次,因为它在 enabling 状态下被调用了一次,在后续的 enabled 状态下被调用了一次。

Documentation据称:

Broadcast intent action indicating that Wi-Fi has been enabled, disabled, enabling, disabling, or unknown. One extra provides this state as an int. Another extra provides the previous state, if available.

您可以检查 EXTRA_WIFI_STATE 的值和 EXTRA_PREVIOUS_WIFI_STATE验证是否是这种情况。

因此,为了忽略不需要的连接/断开状态,您可以将您的onReceive()更新为以下内容:

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

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

    boolean isConnected = false;
    if (activeNetwork != null){

        if (activeNetwork.getState() == NetworkInfo.State.CONNECTING || activeNetwork.getState() == NetworkInfo.State.DISCONNECTING){
            return;
        }
        isConnected = activeNetwork.isConnected();
    }

    if (connectivityReceiverListener != null) {
        connectivityReceiverListener.onNetworkConnectionChanged(isConnected);
    }

}

关于用于互联网连接的 Android BroadcastReceiver 调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49748463/

相关文章:

java - 如何添加到 3d arrayList 而不覆盖以前的条目?

java - 如何将多个动画 GIF 组合成一个 GIF 网格

android - 如何让 youtube 视频在加载视频时不自动播放

android - 转换按钮不显示

java - NOTIFICATION_RECEIVER 无法解析为变量

android - 关闭应用程序时共享偏好值丢失

android - 单击电源按钮现在在 Android KitKat 上的 Activity 中调用 onStop,以前只是 onPause?

java - 有什么方法可以跟踪或监听用户点击浏览器中的任何链接,或任何聊天信使应用程序甚至短信吗?

sdcard的android Intent 准备好了

android - onReceive 中的对话框抛出异常 : unable to add window -- token null is not