Я получаю «android.net.wifi.WIFI_STATE_CHANGED» сразу после регистрации BroadcastReceiver - PullRequest
0 голосов
/ 15 ноября 2018

Я регистрирую трансляцию в время выполнения , чтобы получить "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);

Issue : Это получает действие трансляции, как толькокак регистрация получателя.Я получил это на Android API 26 и выше , который я не могу объявить "android.net.wifi.WIFI_STATE_CHANGED" в манифесте.(Больше не поддерживается системой Android)

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

[ Простое решение ]

Проблема в Sticky Broadcasts, которые запускаются в момент регистрации. Чтобы избежать этого, я просто добавляю еще один параметр, чтобы ограничить процесс. Я определил статическую переменную

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 всякий раз, когда решите отменить регистрацию вещательного приемника.

0 голосов
/ 15 ноября 2018

Чтобы проверить состояние подключения к сети, вы можете сделать это программно. Он поддерживает 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 ");
                    }
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...