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

30

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

Ваш Ответ

5   ответов
1

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

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

Уже позаботился об этом. J1and1
59

Тебе нужно

<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);
Не могли бы вы быть немного более точным ...
Я думаю, что это только дает нам изменения соединения в адаптере WIFI. Я хочу получать уведомления, когда мобильное соединение для передачи данных изменилось.
Можем ли мы также добавить широковещательный приемник для проверки передачи данных?
Спасибо iccthedral. В качестве альтернативы строковым литералам, передаваемым в фильтры, WifiManager.WIFI_STATE_CHANGED_ACTION и WifiManager.NETWORK_STATE_CHANGED_ACTION являются эквивалентными определениями в WifiManager.class.
5

Это то, что я делаю, чтобы получать уведомления, когда соединение изменилось. Вы определяете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 Nandroid.net.conn.CONNECTIVITY_CHANGE" трансляция устарела. Документация предлагает использоватьJobScheduler или жеGCMNetworkManager
@ Николас, это не устарело. Вам просто нужно создать приемник вещания в коде, а не в файле манифеста.
1

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

Ссылка на источникВот

0

Объявите фильтр намерений для передачи широковещательному приемнику

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

    }
};

Похожие вопросы