No Android N, é mencionado no site oficial que "Aplicativos direcionados ao Android N não recebem transmissões de CONNECTIVITY_ACTION". E também é mencionado que JobScheduler
pode ser usado como alternativa. Mas o JobScheduler
não fornece exatamente o mesmo comportamento que o CONNECTIVITY_ACTION
broadcast.
Em meu aplicativo Android, usei essa transmissão para saber o estado da rede do dispositivo. Eu queria saber se esse estado era CONNECTING
ou CONNECTED
com a ajuda de CONNECTIVITY_ACTION
transmissão e era o mais adequado para minhas necessidades.
Agora que está obsoleto, alguém pode me sugerir uma abordagem alternativa para obter o estado atual da rede?
targetSdkVersion
para N ou mais tarde?BroadcastReceiver
com oandroid.net.conn.CONNECTIVITY_CHANGE
filtro de intent, mesmo ao direcionar a API29, você só precisa registrá-lo noApplication.OnCreate
. Você simplesmente não receberá nenhuma atualização quando o aplicativo for fechado.Respostas:
O que será preterido é a capacidade de um aplicativo em segundo plano receber alterações de estado de conexão de rede.
Como David Wasser disse, você ainda pode ser notificado sobre mudanças de conectividade se o componente do aplicativo for instanciado (não destruído) e você tiver registrado seu receptor programaticamente com seu contexto, em vez de fazer isso no manifesto.
Ou você pode usar NetworkCallback . Em particular, você precisará substituir onAvailable para alterações de estado conectado.
Deixe-me esboçar um snippet rapidamente:
fonte
Vou atualizar a
Sayem's
resposta para corrigir problemas de lint que está mostrando para mim.E mesmo uso:
Btw obrigado sayem por sua solução.
fonte
A documentação do Android N afirma:
Isso significa que você ainda pode registrar um
BroadcastReceiver
se seu aplicativo estiver sendo executado em primeiro plano, a fim de detectar alterações na conectividade de rede.fonte
Intent
.Verifique primeiro a resposta de @Amokrane Chentir para obter suporte para Android N.
Para quem deseja dar suporte em todos os níveis da API e observar na interface do usuário, verifique o código abaixo.
LiveData de NetworkConnection:
observar na IU (Atividade / Fragmento):
fonte
IntentFilter
explicitamente. Assim:var intentFilter = IntentFilter(CONNECTIVITY_ACTION)
intentFilter
econnectivityManager
) você não precisa definir explicitamente seu tipo (IntentFilter
eConnectivityManager
respectivamente).Eu tive o mesmo problema alguns dias atrás e decidi usar esta biblioteca Android-Job
Esta biblioteca usa e
JobSchedular
, dependendo de qual versão do Android o aplicativo está sendo executado.GcmNetworkManager
BroadcastReceiver
Começar um trabalho é bastante fácil
fonte
Escrevi uma implementação do Kotlin baseada na resposta de Sayam, mas sem
LiveData
. Decidi invocar (neste momento) o método de API mais recente (ConnectivityManager#registerDefaultNetworkCallback
) que tem como alvo o Android Nougat.Uso:
ou:
Não se esqueça de adicionar a
ACCESS_NETWORK_STATE
permissão em seu AndroidManifest.xml :Estou ansioso para ler comentários úteis e melhorias de você.
fonte
(context as AppCompatActivity).runOnUiThread(object: Runnable{ override fun run() { onConnectionAvailable.invoke() } })
vez deonConnectionAvailable.invoke()
. O mesmo paraonConnectionLost.invoke()
.Aplicativos direcionados ao Android N (Nougat) não recebem
CONNECTIVITY_ACTION
transmissões definidas no manifesto (consulte Svelte ).Soluções possíveis:
ConnectivityManager.registernetworkCallback()
assim que o aplicativo estiver em execução.JobScheduler
ae especifique uma rede ilimitada viasetRequiredNetworkType()
.Consulte também Android O - Detectar mudança de conectividade em segundo plano
fonte
Concordo com a resposta sugerida por @rds.
Lembre-se de que CONNECTIVITY_ACTION foi descontinuado no nível 28 da API.
Você precisa usar
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
A questão é que você não pode usar BroadcastReceiver, então como então?
Você pode usar JobScheduler ou melhor se WorkManager (Solicitação Periódica). Por que Periódico porque se for um OneTimeRequest, ele só poderá ser executado uma vez e continuar ouvindo enquanto seu aplicativo está em primeiro plano.
A documentação diz:
Depois que o aplicativo é encerrado ou removido da lista de aplicativos recentes, networkCallback não será capaz de escutar.
Então, você precisa de tais trabalhos periódicos para fazer o aplicativo ouvir continuamente. Qual deve ser a duração? Isso depende de você e depende de cada caso.
Eu sei que é um jeito meio feio, mas é assim que é. Um desafio pode ser que se o dispositivo do usuário estiver no modo Soneca ou o aplicativo estiver no estado de espera, seu trabalho pode ser atrasado.
fonte
Quando registramos um retorno de chamada de rede usando o
registerNetworkCallback
método, às vezes ele não dispara e às vezes dispara falso-positivo:onAvailable
método será acionado.NetworkCallback
é chamado (é muito estranho por causa da p. 1)onAvailable
gatilhos de método de conexão à Internet . E acho que é um comportamento falso-positivo porque esperamos observar a conexão com a Internet.Como você pode ver no código abaixo, por padrão, a conexão com a Internet está disponível e dispara somente se mudar. Sem gatilhos falso-positivos.
Resuma esta e esta respostas (mas apenas para API> = 21):
Como fornecer as dependências
E como usar:
fonte
Com base na resposta de @KebabKrabby:
E usando quase o mesmo que na resposta original (se observar de uma atividade, por exemplo):
fonte