Подтвердить что ты не робот

BroadcastReceiver при изменении состояния сети Wi-Fi или 3g

У меня есть приложение, которое обновляет базу данных всякий раз, когда телефон подключен к WiFi. Я внедрил Service и BroadcastReceiver которые будут запускать Service (она скажет мне, какая сеть используется), но проблема в том, что я не знаю, что добавить в файл manifest чтобы запустить BroadcastReceiver при изменении состояния сети или когда он подключается к какой-то сети

4b9b3361

Ответ 1

Тебе нужно

<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>

В тэге receiver.

Или, если вы хотите больше контролировать его, прежде чем регистрировать BroadcastReceiver установите:

final IntentFilter filters = new IntentFilter();
filters.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filters.addAction("android.net.wifi.STATE_CHANGE");
super.registerReceiver(yourReceiver, filters);

WIFI_STATE_CHANGED

Broadcast <intent-action> указывающее, что Wi-Fi включен, отключен, включен, отключен или неизвестен. Один дополнительный параметр обеспечивает это состояние как int. Другая дополнительная опция обеспечивает предыдущее состояние, если оно доступно.

STATE_CHANGE

Broadcast <intent-action> указывающее, что состояние подключения Wi-Fi изменилось. Один дополнительный параметр предоставляет новое состояние в виде объекта NetworkInfo. Если новое состояние подключено, дополнительные опции могут предоставлять BSSID и WifiInfo точки доступа. как строка

Кроме того, вам нужно указать правильные разрешения внутри тега manifest:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Чтобы проверить подключение, вы можете использовать ConnectivityManager поскольку он сообщает вам, какой тип соединения доступен.

ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE);
android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

Ответ 2

Это то, что я делаю, чтобы получить уведомление, когда соединение изменилось. Вы определяете BroadCastReceiver для получения широковещательной передачи.

public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() ||
            mobile != null && mobile.isConnectedOrConnecting();
        if (isConnected) {
            Log.d("Network Available ", "YES");
        } else {
            Log.d("Network Available ", "NO");
        }
    }
}

Вы также должны определить, что BroadcastReceiver в вашем файле манифеста и фильтровать по ConnectivityChange.

<receiver android:name=".NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>

Источник здесь

Ответ 4

В дополнение к @Dantalian ответ. Начиная с Android Nougat, вы не должны объявлять свой приемник на манифесте, потому что он не получит трансляцию CONNECTIVITY_ACTION. Вместо этого вы должны зарегистрировать приемник с помощью метода Context.registerReceiver(Receiver, Intent).

Ссылка на источник здесь

Ответ 5

Объявите фильтр намерения для передачи в трансляционный приемник

IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);

В широковещательном приемнике проверьте EXTRA_WIFI_STATE;

private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        switch (action)
        {
            case WifiManager.WIFI_STATE_CHANGED_ACTION:
                int extra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0);
                if(extra==WifiManager.WIFI_STATE_ENABLED)
                {

                }//...else WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLING
                break;
        }

    }
};