У меня есть приложение, которое обновляет базу данных всякий раз, когда телефон подключен к WiFi. Я внедрил Service
и BroadcastReceiver
которые будут запускать Service
(она скажет мне, какая сеть используется), но проблема в том, что я не знаю, что добавить в файл manifest
чтобы запустить BroadcastReceiver
при изменении состояния сети или когда он подключается к какой-то сети
BroadcastReceiver при изменении состояния сети Wi-Fi или 3g
Ответ 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>
Источник здесь
Ответ 3
Вы должны сделать BroadcastReceiver
, который будет срабатывать при изменении состояния подключения:
Здесь Тот же вопрос Как периодически проверять подключение к Интернету в целом приложении?
Ответ 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;
}
}
};