我一注册 BroadcastReceiver 就收到 "android.net.wifi.WIFI_STATE_CHANGED"

I am receiving "android.net.wifi.WIFI_STATE_CHANGED" as soon as Registering BroadcastReceiver

我在运行时注册了一个广播来接收"android.net.wifi.WIFI_STATE_CHANGED"

   IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
    broadcastReceiverAction = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("android.net.wifi.WIFI_STATE_CHANGED")) {
/*I get this action as soon as calling registerReceiver(broadcastReceiverAction, intentFilter);*/
    }
    }
    }
    registerReceiver(broadcastReceiverAction, intentFilter);

问题: 注册接收者后立即获取广播动作。 我在 Android API 26 & Higher 上得到了这个,我不能在清单中声明 "android.net.wifi.WIFI_STATE_CHANGED"。 (Android 系统不再支持)

要检查网络连接状态更改,您可以通过编程方式进行。它支持 API 21+.

    public class ConnectionStateMonitor extends ConnectivityManager.NetworkCallback {
    public final String TAG = ConnectionStateMonitor.class.getSimpleName();
                    private boolean isLost = false;


                    final NetworkRequest networkRequest;
                    Context context;
                    private ConnectionStateMonitor instance;
                    private boolean isLost = false;

                    private ConnectionStateMonitor() {
                        networkRequest = new NetworkRequest.Builder()
                                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                                .build();
                    }

                    public synchronized ConnectionStateMonitor getInstance() {
                        if (instance == null) {
                            instance = new ConnectionStateMonitor();
                        }
                        return instance;
                    }

                    public void enable(Context context) {
                        try {
                            if (context == null) return;
                            this.context = context;
                            ConnectivityManager connectivityManager =
                                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                            connectivityManager.registerNetworkCallback(networkRequest, this);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onAvailable(Network network) {
                        Log.i(TAG, "onAvailable called " + 
                                network.toString());
                                if (isLost) {
                                isLost = false;}
                       // when network available called it
                    }


                    @Override
                    public void onLost(Network network) {
                        super.onLost(network);
                        isLost = true;
                        // when network lost called it
                        Log.i(TAG, "onLost called ");
                    }
                }

[简单的解决方案]

问题是在注册时触发的粘性广播。 为避免这种情况,我只需添加另一个参数来限制该过程。 我定义了一个静态变量

public static boolean triggerBroadcast = false;

然后延迟几秒改成注册广播后

registerReceiver(broadcastReceiverAction, intentFilter);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
triggerWifiBroadcast = true;
}
}, 3000);

然后onReceive()我比较intent.getAction和这个

if (intent.getAction().equals("android.net.wifi.WIFI_STATE_CHANGED") && triggerBroadcast ) {
//
}

然后您可以在决定注销广播接收器时将其更改为false