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

问题描述 投票:5回答:4

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

问题

我有一个BroadcastReceiver,它一直在监听互联网的变化。因此,无论何时连接或断开Internet,我都会在接收器的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);
}

}

清单意图动作

<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

BaseActivity

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

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

android android-activity broadcastreceiver android-broadcast android-networking
4个回答
0
投票

Check this link

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

因此在您活动的onCreate()

中添加以下几行:
    myConnectivityReceiver = new ConnectivityReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(getResources().getString(R.string.action_connectivity_change));
    registerReceiver(myConnectivityReceiver,filter);

onDestroy()

中的>
  @Override
  protected void onDestroy() {
      unregisterReceiver(myConnectivityReceiver);
      super.onDestroy();
  }

在strings.xml中定义意图动作

<string name="action_connectivity_change">android.net.conn.CONNECTIVITY_CHANGE</string>

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

状态被调用一次。
[Documentation中指出:

表示意图启用,禁用,启用,禁用或未知的Wi-Fi的广播意图动作。一个额外的提供此状态为int。如果可用,另一个附加项提供先前的状态。

您可以检查EXTRA_WIFI_STATEEXTRA_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); } }
通常,在两次接收时被称为广播广播,两次被接收器广播。因此,请检查您是否在2个位置注册了广播?如果是,请在履历表中创建

仅注册您的广播或创建活动,并且<例如注册广播接收器,

LocalBroadcastManager.getInstance(this).registerReceiver(myLocalBroadcastManager, new IntentFilter(Constant.CONNECTIVITY_CHANGE));

未注册的广播接收器,如:-

LocalBroadcastManager.getInstance(this).unregisterReceiver(myLocalBroadcastManager);

希望对您有帮助。

您应该在onReceive回调中检查intent操作:
String action = arg1.getAction(); if (action != null && action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { // do your task here. }

2
投票

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


0
投票
通常,在两次接收时被称为广播广播,两次被接收器广播。因此,请检查您是否在2个位置注册了广播?如果是,请在履历表中创建

仅注册您的广播或创建活动,并且<例如注册广播接收器,


0
投票
String action = arg1.getAction(); if (action != null && action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { // do your task here. }
© www.soinside.com 2019 - 2024. All rights reserved.