android - programacion - BroadcastReceiver cuando el estado de la red wifi o 3g cambió
manual de android en pdf (5)
Debería crear un BroadcastReceiver
que se activará cuando el estado de conectividad haya cambiado:
Aquí La misma pregunta ¿Cómo verificar la conexión a Internet periódicamente en toda la aplicación?
Tengo una aplicación que actualiza la base de datos cada vez que el teléfono está conectado a WiFi. Implementé un Service
y BroadcastReceiver
que ejecutará el Service
(me dirá qué red está en uso), pero el problema es que no sé qué agregar en el archivo de manifest
para iniciar BroadcastReceiver
cuando el estado de la red cambia o cuando se conecta a algún tipo de red
Declara el filtro de intención para pasar al receptor de difusión
IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);
En el receptor de difusión, verifique 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;
}
}
};
Esto es lo que hago para recibir una notificación cuando la conexión ha cambiado. Usted define un BroadCastReceiver
para recibir la transmisión.
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");
}
}
}
También debe definir ese BroadcastReceiver
en su archivo de manifiesto y filtrar por ConnectivityChange
.
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Fuente here
Necesitas
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
En tu etiqueta de receiver
.
O si desea tener más control sobre él, antes de registrar BroadcastReceiver
configure esto:
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
Transmita <intent-action>
que indique que Wi-Fi se ha habilitado, deshabilitado, habilitado, deshabilitado o desconocido. Uno adicional proporciona este estado como int. Otro extra proporciona el estado anterior, si está disponible.
STATE_CHANGE
Transmita <intent-action>
que indique que el estado de la conectividad Wi-Fi ha cambiado. Uno adicional proporciona el nuevo estado en forma de un objeto NetworkInfo. Si el nuevo estado está CONECTADO, los extras adicionales pueden proporcionar el BSSID y WifiInfo del punto de acceso. como una cadena
Además, deberá especificar los permisos correctos dentro de la etiqueta de manifest
:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Para verificar la conectividad, puede usar ConnectivityManager
ya que le indica qué tipo de conexión está disponible.
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);
Para complementar la respuesta de @ Dantalian. Comenzando con Android Nougat no debe declarar su receptor en su Manifiesto porque no recibirá la transmisión CONNECTIVITY_ACTION
. En su lugar, debe registrar su receptor utilizando el Context.registerReceiver(Receiver, Intent)
.
Enlace a la fuente here