Je développe un récepteur de diffusion Android pour vérifier la connexion Internet.
Le problème est que mon récepteur de diffusion est appelé deux fois. Je veux qu'il soit appelé uniquement lorsque le réseau est disponible. S'il n'est pas disponible, je ne veux pas être averti.
Ceci est le récepteur de diffusion
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");
}
}
}
Ceci est le 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
la source
la source
Réponses:
Réponse à votre première question : votre récepteur de diffusion est appelé deux fois car
Vous en avez ajouté deux
<intent-filter>
Changement de connexion réseau:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Changement d'état WiFi:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Il suffit d' utiliser un:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.Il répondra à une seule action au lieu de deux. Voir ici pour plus d'informations.
Répondez à votre deuxième question (vous souhaitez que le destinataire appelle une seule fois si la connexion Internet est disponible):
Votre code est parfait; vous ne notifiez que lorsque Internet est disponible.
METTRE À JOUR
Vous pouvez utiliser cette méthode pour vérifier votre connectivité si vous voulez simplement vérifier si le mobile est connecté à Internet ou non.
la source
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
m'inscrire, mais mon récepteur est toujours appelé deux fois. Ce n'est pas vraiment un gros problème mais j'aimerais savoir pourquoi.ServiceManager.java
autorisations:
la source
ServiceManager extends ContextWrapper
? Pourquoi avez-vous besoin d'étendre ContextWrapper? POURQUOI!?Vérification de l'état d'Internet à chaque fois à l'aide du récepteur de diffusion:
Code source complet disponible sur Google Drive .
AndroidManifest.xml
BroadcastReciever
MainActivity.java
activity_main.xml
la source
Utilisez cette méthode pour vérifier l'état du réseau:
n'oubliez pas de désenregistrer le service dans onDestroy.
À votre santé!!
la source
Ce récepteur de diffusion ci-dessus sera appelé uniquement lorsque l'état du réseau passe à connecté et non pas déconnecté.
la source
Je sais que ce fil est ancien et entièrement répondu, mais je pense que ce qui suit pourrait aider certaines personnes.
Le code dans le corps de la question contient un bogue que personne n'a abordé ici. @Nikhil vérifie si le wifi / mobile est disponible et non s'il est connecté.
Le correctif est ici:
la source
manifeste:
classe pour récepteur:
et classe des utilitaires comme exemple:
la source
juste pour quelqu'un d'autre qui veut enregistrer une émission de manière dynamique:
la source
Essayez avec ça
Dès que la connexion Internet se déclenche, ce (BroadcastReciever) sera chargé
la source
Documents CONNECTIVITY_ACTION :
la source
Voici une façon confortable de le faire pour une activité, un fragment ou un contexte. Il se désinscrira également automatiquement si vous le faites pour une activité / un fragment (dans onDestroy), si vous le souhaitez:
Utilisation en fragment:
la source
Avertissement:
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.
Comme
CONNECTIVITY_CHANGE
est déconseillé, nous devrions utiliser une autre façon de faire les mêmes chosesCe qui suit
NetworkConnectionLiveData
gérera toute la version du système d'exploitation jusqu'à présent et également si le SDK cible est inférieur àBuild.VERSION_CODES.LOLLIPOP
alors seulement nous pouvons utiliserbroadcastReceiver
La meilleure partie est que cette classe utilise
LiveData
donc pas besoin d'enregistrer une utilisation du récepteurLiveData
et elle gérera toutes les chosesUtilisation du LiveData dans n'importe quelle classe:
la source
}
la source
Ajoutez un récepteur de diffusion qui peut écouter le changement de connectivité réseau. Vérifiez ensuite si l'appareil est connecté à Internet ou n'utilise pas ConnectivityManager. Reportez-vous à ce post ou à cette vidéo pour une compréhension détaillée. Voici le code:
J'ai écrit ce récepteur pour afficher une notification sur l'écran, c'est pourquoi vous voyez une diffusion locale avec l'état du réseau. Voici le code pour afficher la notification.
L'activité écoute l'intention diffusée par le récepteur réseau et affiche la notification à l'écran.
la source
Réponse complète ici
Fichier de manifeste
Classe BroadecardReceiver
Enregistrement du récepteur dans
MainActivity
Prendre plaisir!
la source
Code du récepteur de diffusion pour vérifier le changement de connectivité Internet:
ajoutez ceci dans le fichier manifeste:
la source
Cela vérifie uniquement si l'interface réseau est disponible, ne garantit pas qu'un service réseau particulier est disponible, par exemple, il peut y avoir un faible signal ou un temps d'arrêt du serveur
si vous souhaitez établir une véritable connexion pour vous assurer que votre connexion peut collecter des données à partir d'un serveur ou de n'importe quelle URL:
Cette fonction doit être enveloppée dans un thread d'arrière-plan:
Ajoutez les autorisations requises:
Ajoutez cette ligne sous application dans le fichier manifeste:
Ajouter un récepteur au fichier manifeste:
Enregistrer / désinscrire le BR dans votre activité:
c'est toute la classe Broadcast:
la source
Il est plus facile d'utiliser https://github.com/JobGetabu/DroidNet
la source
Ajouter des autorisations:
Créer un récepteur pour vérifier la connexion
ServiceManager.java
la source
1) En manifeste: - appelez le récepteur comme le code ci-dessous
2) Créez une classe de récepteur à diffusion large: - Dans cette classe, ajoutez le code de vérification du réseau
3) Dans votre appel d'activité vers Broad Cast Receiver: -
la source
Tout d'abord, nous allons créer une classe qui vérifiera la connectivité de l'état du réseau. Permet donc de créer une classe:
Créez maintenant une nouvelle classe de récepteur de diffusion:
et maintenant enregistrez votre récepteur de diffusion sur le manifeste:
la source