我的猜测是,wifi接收器被调用两次,因为它在enabling]状态被调用一次,而在后续的[[enabled
我面对这个问题已经有一段时间了,注意到其他一些人也遇到了这个问题,但是我无法解决。
问题
我有一个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 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
表示意图启用,禁用,启用,禁用或未知的Wi-Fi的广播意图动作。一个额外的提供此状态为int。如果可用,另一个附加项提供先前的状态。更新为以下内容:您可以检查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);
}
}
通常,在两次接收时被称为广播广播,两次被接收器广播。因此,请检查您是否在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. }
我的猜测是,wifi接收器被调用两次,因为它在enabling]状态被调用一次,而在后续的[[enabled
仅注册您的广播或创建活动,并且<例如注册广播接收器,
String action = arg1.getAction();
if (action != null && action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
// do your task here.
}