En Android N, se menciona en el sitio web oficial que "las aplicaciones destinadas a Android N no reciben transmisiones de CONNECTIVITY_ACTION". Y también se menciona que JobScheduler
se puede utilizar como alternativa. Pero JobScheduler
no proporciona exactamente el mismo comportamiento que la CONNECTIVITY_ACTION
transmisión.
En mi aplicación de Android, estaba usando esta transmisión para conocer el estado de la red del dispositivo. Quería saber si este estado era CONNECTING
o CONNECTED
con la ayuda de la CONNECTIVITY_ACTION
transmisión y era el más adecuado para mis necesidades.
Ahora que está en desuso, ¿alguien puede sugerirme el enfoque alternativo para obtener el estado actual de la red?
targetSdkVersion
a N o más tarde?BroadcastReceiver
con elandroid.net.conn.CONNECTIVITY_CHANGE
filtro de intención incluso cuando apunte a API29, solo necesita registrarloApplication.OnCreate
. Simplemente no recibirá ninguna actualización cuando la aplicación esté cerrada.Respuestas:
Lo que quedará obsoleto es la capacidad de una aplicación en segundo plano para recibir cambios de estado de conexión de red.
Como dijo David Wasser , aún puede recibir notificaciones de los cambios de conectividad si se crea una instancia del componente de la aplicación (no se destruye) y ha registrado su receptor mediante programación con su contexto, en lugar de hacerlo en el manifiesto.
O puede utilizar NetworkCallback en su lugar. En particular, deberá anular onDisponible para cambios de estado conectado.
Déjame redactar un fragmento rápidamente:
fuente
Actualizaré la
Sayem's
respuesta para solucionar los problemas de pelusa que se me muestran.Y mismo uso:
Por cierto, gracias por tu solución.
fuente
La documentación para Android N dice:
Esto significa que aún puede registrar un
BroadcastReceiver
si su aplicación se está ejecutando en primer plano, para detectar cambios en la conectividad de la red.fuente
Intent
.Verifique la primera respuesta de @Amokrane Chentir para obtener soporte para Android N.
Para aquellos que quieran brindar soporte en todos los niveles de API y observarlo en la interfaz de usuario, verifique el código a continuación.
LiveData de NetworkConnection:
observar en UI (Actividad / Fragmento):
fuente
IntentFilter
explícitamente. Así:var intentFilter = IntentFilter(CONNECTIVITY_ACTION)
intentFilter
yconnectivityManager
) no es necesario definir explícitamente su tipo (IntentFilter
yConnectivityManager
respectivamente).Me encontré con el mismo problema hace unos días y decidí usar esta biblioteca Android-Job
Esta biblioteca usa
JobSchedular
,GcmNetworkManager
yBroadcastReceiver
dependiendo de la versión de Android en la que se esté ejecutando la aplicación.Comenzar un trabajo es bastante fácil
fuente
Escribí una implementación de Kotlin que se basa en la respuesta de Sayam pero sin ella
LiveData
. Decidí invocar (en este momento) el último método de API (ConnectivityManager#registerDefaultNetworkCallback
) que apunta a Android Nougat.Uso:
o:
No olvide agregar el
ACCESS_NETWORK_STATE
permiso en su AndroidManifest.xml :Espero leer comentarios útiles y mejoras de su parte.
fuente
(context as AppCompatActivity).runOnUiThread(object: Runnable{ override fun run() { onConnectionAvailable.invoke() } })
lugar deonConnectionAvailable.invoke()
. Lo mismo paraonConnectionLost.invoke()
.Las aplicaciones destinadas a Android N (Nougat) no reciben
CONNECTIVITY_ACTION
transmisiones definidas en el manifiesto (consulte Svelte ).Soluciones posibles:
ConnectivityManager.registernetworkCallback()
una vez que la aplicación se esté ejecutando.JobScheduler
y especifique una red no medida a través desetRequiredNetworkType()
.Consulte también Android O: detectar cambios de conectividad en segundo plano
fuente
Estoy de acuerdo con la respuesta sugerida por @rds.
Tenga en cuenta que CONNECTIVITY_ACTION está obsoleto en el nivel de API 28.
Necesitas usar
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
La pregunta es que no puede usar BroadcastReceiver, entonces, ¿cómo?
Puede usar JobScheduler o mejor si WorkManager (solicitud periódica). Why Periodic porque si es una OneTimeRequest, solo podrá ejecutarse una vez y seguir escuchando mientras su aplicación está en primer plano.
La documentación dice:
Una vez que la aplicación se elimina o se elimina de la lista de aplicaciones recientes, networkCallback no podrá escuchar.
Por lo tanto, necesita trabajos periódicos para que la aplicación escuche continuamente. ¿Cuánto debe ser la duración? Eso depende de usted y depende de cada caso.
Sé que es un poco feo, pero así es. Un desafío podría ser que si el dispositivo del usuario está en modo Doze o la aplicación está en estado de espera, su trabajo podría retrasarse.
fuente
Cuando registramos una devolución de llamada de red usando el
registerNetworkCallback
método, a veces no se activa y, a veces, sí activa un falso positivo:onAvailable
método se activa.NetworkCallback
se llama nada (es muy extraño debido a la p. 1)onAvailable
se activa el método. Y creo que es un comportamiento falso positivo porque esperamos que la conexión a Internet se observe.Como puede ver en el siguiente código, la conexión a Internet predeterminada está disponible y se activa solo si cambia. Sin desencadenantes falsos positivos.
Simplemente resuma esto y esta respuesta (pero solo para API> = 21):
Cómo proporcionar las dependencias
Y como usar:
fuente
Basado en la respuesta de @ KebabKrabby:
Y usarlo casi de la misma manera que en la respuesta original (si observa desde una Actividad, por ejemplo):
fuente