Rozwijam odbiornik transmisji dla systemu Android do sprawdzania połączenia internetowego.
Problem polega na tym, że mój odbiornik jest wywoływany dwa razy. Chcę, aby został wywołany tylko wtedy, gdy sieć jest dostępna. Jeśli jest niedostępny, nie chcę otrzymywać powiadomień.
To jest odbiornik transmisji
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");
}
}
}
To jest plik 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
źródło
źródło
Odpowiedzi:
Odpowiedz na pierwsze pytanie : Twój odbiornik jest wywoływany dwa razy, ponieważ
Dodałeś dwa
<intent-filter>
Zmiana połączenia sieciowego:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Zmiana stanu WiFi:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Wystarczy użyć jednego:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.Będzie reagować tylko na jedną akcję zamiast dwóch. Zobacz tutaj, aby uzyskać więcej informacji.
Odpowiedz na drugie pytanie (jeśli chcesz, aby odbiorca zadzwonił tylko raz, jeśli jest dostępne połączenie internetowe):
Twój kod jest idealny; powiadamiasz tylko wtedy, gdy internet jest dostępny.
AKTUALIZACJA
Możesz użyć tej metody do sprawdzenia łączności, jeśli chcesz po prostu sprawdzić, czy telefon komórkowy jest połączony z Internetem, czy nie.
źródło
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
zarejestrowałem, ale mój odbiornik wciąż dzwoni dwukrotnie. Nie jest to naprawdę duży problem, ale chciałbym wiedzieć, dlaczego.ServiceManager.java
uprawnienia:
źródło
ServiceManager extends ContextWrapper
? Dlaczego musisz rozszerzyć ContextWrapper? CZEMU!?Sprawdzanie statusu Internetu za każdym razem za pomocą Odbiornika transmisji:
Pełny kod źródłowy dostępny na Dysku Google .
AndroidManifest.xml
BroadcastReciever
MainActivity.java
Activity_main.xml
źródło
Użyj tej metody, aby sprawdzić stan sieci:
pamiętaj, aby wyrejestrować usługę w usłudze onDestroy.
Twoje zdrowie!!
źródło
Powyższy odbiornik zostanie wywołany tylko wtedy, gdy stan sieci zmieni się na podłączony, a nie po rozłączeniu.
źródło
Wiem, że ten wątek jest stary i zawiera pełną odpowiedź, ale uważam, że następujące osoby mogą pomóc niektórym ludziom.
Kod w treści pytania zawiera błąd, którego nikt tutaj nie rozwiązał. @Nikhil sprawdza, czy wifi / telefon komórkowy jest dostępny, a nie, jeśli jest podłączony.
Poprawka jest tutaj:
źródło
oczywisty:
klasa dla odbiorcy:
i narzędzia takie jak przykład:
źródło
tylko dla kogoś, kto chce dynamicznie zarejestrować transmisję:
źródło
Spróbuj tego
Gdy tylko połączenie z Internetem zostanie wyzwolone, ten (BroadcastReciever) zostanie załadowany
źródło
Dokumenty CONNECTIVITY_ACTION :
źródło
Oto wygodny sposób na zrobienie tego dla aktywności, fragmentu lub kontekstu. Wyrejestruje się również automatycznie, jeśli zrobisz to dla aktywności / fragmentu (w onDestroy), jeśli chcesz:
Zastosowanie we fragmencie:
źródło
Ostrzeżenie:
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.
Ponieważ
CONNECTIVITY_CHANGE
jest to przestarzałe, powinniśmy użyć innego sposobu robienia tych samych rzeczyPoniższe
NetworkConnectionLiveData
obsłuży całą wersję systemu operacyjnego do tej pory, a także jeśli docelowy zestaw SDK jest mniejszy niżBuild.VERSION_CODES.LOLLIPOP
tylko wtedy możemy użyćbroadcastReceiver
Najlepsze jest to, że ta klasa używa,
LiveData
więc nie trzeba rejestrować żadnego użycia odbiornikaLiveData
i będzie on obsługiwał wszystkie rzeczyWykorzystanie LiveData do dowolnej klasy:
źródło
}
źródło
Dodaj odbiornik rozgłoszeniowy, który może nasłuchiwać zmiany połączenia sieciowego. Następnie sprawdź, czy urządzenie jest podłączone do Internetu lub nie korzysta z ConnectivityManager. Szczegółowe informacje można znaleźć w tym poście lub filmie . Poniżej znajduje się kod:
Napisałem ten odbiornik, aby wyświetlał powiadomienie na ekranie, dlatego widzisz lokalną transmisję ze statusem sieci. Oto kod pokazujący powiadomienie.
Aktywność nasłuchuje zamiarów nadawanych przez odbiornik sieciowy i wyświetla powiadomienie na ekranie.
źródło
Pełna odpowiedź tutaj
Plik menifestu
Klasa BroadecardReceiver
Rejestrowanie odbiornika w
MainActivity
Cieszyć się!
źródło
Nadaj kod odbiorcy, aby sprawdzić zmianę połączenia internetowego:
dodaj to do pliku manifestu:
źródło
To sprawdza tylko, czy interfejs sieciowy jest dostępny, nie gwarantuje, że dana usługa sieciowa jest dostępna, na przykład może wystąpić niski sygnał lub przestój serwera
jeśli chcesz nawiązać prawdziwe połączenie, aby upewnić się, że Twoje połączenie może gromadzić dane z serwera lub dowolnego adresu URL:
Ta funkcja musi być owinięta w wątek tła:
Dodaj wymagane uprawnienia:
Dodaj ten wiersz w aplikacji w pliku manifestu:
Dodaj odbiorcę do pliku manifestu:
Zarejestruj / Wyrejestruj BR w tobie Aktywność:
to jest cała klasa Broadcast:
źródło
Łatwiej jest korzystać z https://github.com/JobGetabu/DroidNet
źródło
Dodaj uprawnienia:
Utwórz odbiornik, aby sprawdzić połączenie
ServiceManager.java
źródło
1) W oczywisty sposób: - zadzwoń do odbiornika jak poniżej
2) Utwórz jedną klasę odbiornika Broad Cast: - W tej klasie dodaj kod kontroli sieci
3) W swoim połączeniu z aktywnym odbiornikiem Broadcast: -
źródło
Przede wszystkim stworzymy klasę, która sprawdzi łączność stanu sieci. Stwórzmy więc klasę:
Teraz stwórz nową klasę odbiorników Broadcast:
i teraz zarejestruj swój odbiornik na manifeście:
źródło