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
это будет вызвано, когда статус подключения изменился:
Здесь тот же вопрос Как периодически проверять подключение к Интернету во всем приложении?