Estoy desarrollando un receptor de difusión de Android para verificar la conexión a Internet.
El problema es que mi receptor de transmisión se llama dos veces. Quiero que se llame solo cuando la red esté disponible. Si no está disponible, no quiero que me notifiquen.
Este es el receptor de transmisión
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) {
// Do something
Log.d("Network Available ", "Flag No 1");
}
}
}
Este es el manifiesto.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiverforinternetconnection"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
java
android
broadcastreceiver
android-wifi
android-networking
Nikhil Agrawal
fuente
fuente
Respuestas:
Responda a su primera pregunta : su receptor de transmisión se llama dos veces porque
Has agregado dos
<intent-filter>
Cambio en la conexión de red:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Cambio en el estado de WiFi:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Sólo tiene que utilizar uno:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.Solo responderá a una acción en lugar de dos. Ver aquí para más información.
Responda a su segunda pregunta (desea que el receptor llame solo una vez si hay conexión a Internet disponible):
Tu código es perfecto; solo notifica cuando hay internet disponible.
ACTUALIZAR
Puede usar este método para verificar su conectividad si solo desea verificar si el móvil está conectado a Internet o no.
fuente
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
registrarme pero mi receptor todavía recibe dos llamadas. No es realmente un gran problema, pero me gustaría saber por qué.ServiceManager.java
permisos:
fuente
ServiceManager extends ContextWrapper
? ¿Por qué necesitas extender ContextWrapper? ¿¡POR QUÉ!?Verificación del estado de Internet cada vez que usa Broadcast Receiver:
Código fuente completo disponible en Google Drive .
AndroidManifest.xml
BroadcastReciever
MainActivity.java
activity_main.xml
fuente
Use este método para verificar el estado de la red:
recuerde cancelar el servicio en onDestroy.
¡¡Salud!!
fuente
Este receptor de transmisión anterior solo se llamará cuando el estado de la red cambie a conectado y no desconectado.
fuente
Sé que este hilo es antiguo y está totalmente respondido, pero creo que lo siguiente podría ayudar a algunas personas.
El código en el cuerpo de la pregunta contiene un error que nadie aquí abordó. @Nikhil está verificando si el wifi / móvil está disponible y no si está conectado.
La solución está aquí:
fuente
manifiesto:
clase para el receptor:
y utilidades de clases como ejemplo:
fuente
solo para alguien que quiera registrar una transmisión de forma dinámica:
fuente
Intenta con esto
Tan pronto como se active la conexión a Internet, se cargará este (BroadcastReciever)
fuente
CONNECTIVITY_ACTION docs :
fuente
Aquí hay una manera cómoda de hacerlo por actividad, fragmento o contexto. También se anulará automáticamente el registro si lo hace por actividad / fragmento (en onDestroy), si lo desea:
Uso en fragmento:
fuente
Advertencia:
Declaring a broadcastreceiver for android.net.conn.CONNECTIVITY_CHANGE is deprecated for apps targeting N and higher. In general, apps should not rely on this broadcast and instead use JobScheduler or GCMNetworkManager.
Como
CONNECTIVITY_CHANGE
está en desuso, deberíamos usar otra forma de hacer lo mismoLo siguiente
NetworkConnectionLiveData
manejará toda la versión del sistema operativo hasta ahora y también si el SDK de destino es menor queBuild.VERSION_CODES.LOLLIPOP
entonces solo podemos usarbroadcastReceiver
La mejor parte es que esta clase usa,
LiveData
por lo que no es necesario registrar ningún uso del receptorLiveData
y manejará todas las cosasUso de LiveData en cualquier clase:
fuente
}
fuente
Agregue un receptor de transmisión que pueda escuchar el cambio de conectividad de red. Luego verifique si el dispositivo está conectado a Internet o no está utilizando ConnectivityManager. Consulte esta publicación o video para obtener una comprensión detallada. Debajo está el código:
Escribí este receptor para mostrar una notificación en la pantalla, es por eso que ves una transmisión local con el estado de la red. Aquí está el código para mostrar la notificación.
La actividad escucha la intención emitida por el receptor de la red y muestra la notificación en la pantalla.
fuente
Respuesta completa aquí
Archivo de manifiesto
Clase BroadecardReceiver
Registro de receptor en
MainActivity
¡Disfrutar!
fuente
Transmita el código del receptor para verificar el cambio de conectividad a Internet:
agregue esto en el archivo de manifiesto:
fuente
Esto solo verifica si la interfaz de red está disponible, no garantiza que un servicio de red en particular esté disponible, por ejemplo, podría haber poca señal o tiempo de inactividad del servidor
si desea realizar una conexión real para asegurarse de que su conexión pueda recopilar datos de un servidor o cualquier URL:
Esta función debe estar envuelta en un hilo de fondo:
Agregar permisos requeridos:
Agregue esta línea bajo la aplicación en el archivo de manifiesto:
Agregar receptor al archivo de manifiesto:
Registre / anule el registro de la BR en su actividad:
Esta es toda la clase Broadcast:
fuente
Es más fácil usar https://github.com/JobGetabu/DroidNet
fuente
Agregar permisos:
Crear receptor para verificar la conexión
ServiceManager.java
fuente
1) En manifiesto: - llame al receptor como el código siguiente
2) Haga una clase de receptor de transmisión amplia: - En esta clase, agregue el código de comprobación de red
3) En su Llamada de actividad a Broad Cast Receiver: -
fuente
Antes que nada haremos una clase que verificará la conectividad del estado de la red. Entonces, creemos una clase:
Ahora haga una nueva clase de receptor de difusión:
y ahora registre su receptor de transmisión en manifiesto:
fuente