Estou desenvolvendo um receptor de transmissão Android para verificar a conexão à Internet.
O problema é que meu receptor de transmissão está sendo chamado duas vezes. Quero que ele seja chamado apenas quando a rede estiver disponível. Se não estiver disponível, não quero ser notificado.
Este é o receptor de transmissão
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 é o manifest.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
fonte
fonte
Respostas:
Responda à sua primeira pergunta : Seu receptor de transmissão está sendo chamado duas vezes porque
Você adicionou dois
<intent-filter>
Mudança na conexão de rede:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Mudança no estado do WiFi:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Basta usar um:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.Ele responderá a apenas uma ação em vez de duas. Veja aqui para mais informações.
Responda à sua segunda pergunta (você deseja que o receptor ligue apenas uma vez se houver conexão à Internet disponível):
Seu código é perfeito; você notifica apenas quando a Internet está disponível.
ATUALIZAR
Você pode usar esse método para verificar sua conectividade se quiser apenas verificar se o celular está conectado à Internet ou não.
fonte
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
registrar, mas meu receptor ainda é chamado duas vezes. Não é realmente um grande problema, mas eu gostaria de saber o porquê.ServiceManager.java
permissões:
fonte
ServiceManager extends ContextWrapper
? Por que você precisa estender o ContextWrapper? PORQUE!?Verificando o status da Internet toda vez usando o Broadcast Receiver:
Código fonte completo disponível no Google Drive .
AndroidManifest.xml
BroadcastReciever
MainActivity.java
activity_main.xml
fonte
Use este método para verificar o estado da rede:
lembre-se de cancelar o registro do serviço no onDestroy.
Felicidades!!
fonte
O receptor de transmissão acima será chamado apenas quando o estado da rede mudar para conectado e não desconectado.
fonte
Sei que este tópico é antigo e totalmente respondido, mas acho que o seguinte pode ajudar algumas pessoas.
O código no corpo da pergunta contém um bug que ninguém aqui abordou. @Nikhil está verificando se o wifi / celular está disponível e não se está conectado.
A correção está aqui:
fonte
manifesto:
classe para o receptor:
e classes utils como exemplo:
fonte
apenas para alguém que deseja registrar uma transmissão dinamicamente:
fonte
Tente com isso
Assim que a conexão à Internet disparar, este (BroadcastReciever) será carregado
fonte
Documentos de CONNECTIVITY_ACTION :
fonte
Aqui está uma maneira confortável de fazer isso por atividade, fragmento ou contexto. Ele também cancelará o registro automaticamente se você fizer isso para atividade / fragmento (em onDestroy), se desejar:
Uso no fragmento:
fonte
Aviso:
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á obsoleto, devemos usar outra maneira de fazer as mesmas coisasA seguir
NetworkConnectionLiveData
, lidamos com toda a versão do sistema operacional até agora e também se o SDK de destino for menor do queBuild.VERSION_CODES.LOLLIPOP
então, somente podemos usarbroadcastReceiver
A melhor parte é que essa classe usa,
LiveData
portanto, não é necessário registrar o uso de nenhum receptorLiveData
e ele vai lidar com todas as coisasUso do LiveData em qualquer classe:
fonte
}
fonte
Adicione um receptor de transmissão que possa ouvir as alterações na conectividade da rede. Em seguida, verifique se o dispositivo está conectado à Internet ou não usando o ConnectivityManager. Consulte esta postagem ou vídeo para obter informações detalhadas. Abaixo está o código:
Eu escrevi este receptor para mostrar uma notificação na tela, é por isso que você vê uma transmissão local com o status da rede. Aqui está o código para mostrar a notificação.
A atividade escuta a intenção transmitida pelo receptor da rede e mostra a notificação na tela.
fonte
Resposta completa aqui
Arquivo Menifest
Classe BroadecardReceiver
Registar receptor em
MainActivity
Aproveitar!
fonte
Código do receptor de transmissão para verificar a alteração da conectividade com a Internet:
adicione isso no arquivo manifesto:
fonte
Isso verifica apenas se a interface de rede está disponível, não garante que um serviço de rede específico esteja disponível, por exemplo, pode haver baixo sinal ou tempo de inatividade do servidor
se você deseja fazer uma conexão real para garantir que sua conexão possa coletar dados de um servidor ou de qualquer URL:
Essa função precisa ser agrupada em um thread de segundo plano:
Adicione as permissões necessárias:
Adicione esta linha em aplicativo no arquivo de manifesto:
Adicione o receptor ao arquivo de manifesto:
Registrar / cancelar o registro do BR em sua atividade:
esta é toda a classe de transmissão:
fonte
É mais fácil usar https://github.com/JobGetabu/DroidNet
fonte
Adicionar permissões:
Criar receptor para verificar a conexão
ServiceManager.java
fonte
1) No manifesto: - ligue para o receptor como no código abaixo
2) Faça uma classe Broad Broad Receiver: - Nesta classe, adicione o código de Network Check
3) Na sua atividade, ligue para o Broad Cast Receiver: -
fonte
Antes de tudo, faremos uma classe que verificará a conectividade do estado da rede. Então, vamos criar uma classe:
Agora faça uma nova classe de receptor Broadcast:
e agora registre seu receptor de transmissão no manifesto:
fonte