用于互联网连接的Android Broacdcast接收器调用了两次

The*_*Bat 5 android android-networking android-activity android-broadcast android-broadcastreceiver

我暂时面对这个问题并注意到其他一些人也遇到过这个问题,但我无法解决它.

问题

我有一个BroadcastReceiver,它一直在监听互联网的变化.因此,无论何时连接或断开互联网,我都会获得onReceive接收器的状态.

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

我的守则

BroadcastReceiver文件

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);
}

}
Run Code Online (Sandbox Code Playgroud)

表现意图行动

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

在这里,当我尝试只<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />使用过滤器,然后它来了onRecieve两次.当我尝试时<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />,我根本没有来onReceive.

BaseActivity

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

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

net*_*wda 1

检查此链接

对于Android 7及更高版本,您需要在活动文件中而不是清单文件中注册接收器。

因此,在您的活动的onCreate()中添加以下行:

    myConnectivityReceiver = new ConnectivityReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(getResources().getString(R.string.action_connectivity_change));
    registerReceiver(myConnectivityReceiver,filter);
Run Code Online (Sandbox Code Playgroud)

并在onDestroy()中

  @Override
  protected void onDestroy() {
      unregisterReceiver(myConnectivityReceiver);
      super.onDestroy();
  }
Run Code Online (Sandbox Code Playgroud)

在 strings.xml 中定义意图操作

<string name="action_connectivity_change">android.net.conn.CONNECTIVITY_CHANGE</string>
Run Code Online (Sandbox Code Playgroud)