studio programacion herramientas fundamentos con avanzado aplicaciones android android-service

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