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

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

5 ответов

Решение

Тебе нужно

<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);

Это то, что я делаю, чтобы получать уведомления, когда соединение изменилось. Вы определяете 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>

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

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

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

Объявите фильтр намерения, чтобы передать вещательному получателю

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;
        }

    }
};

Вы должны сделать BroadcastReceiver это будет вызвано, когда статус подключения изменился:

Здесь тот же вопрос Как периодически проверять подключение к Интернету во всем приложении?

Другие вопросы по тегам