In Android N wird auf der offiziellen Website erwähnt, dass "Apps für Android N keine CONNECTIVITY_ACTION-Sendungen empfangen". Und es wird auch erwähnt, dass JobScheduler
als Alternative verwendet werden kann. Aber das JobScheduler
bietet nicht genau das gleiche Verhalten wie CONNECTIVITY_ACTION
Broadcast.
In meiner Android-Anwendung habe ich diese Übertragung verwendet, um den Netzwerkstatus des Geräts zu ermitteln. Ich wollte wissen, ob dieser Zustand war CONNECTING
oder CONNECTED
mit Hilfe von CONNECTIVITY_ACTION
Rundfunk und es war am besten für meine Anforderung geeignet.
Kann mir jetzt, da es veraltet ist, jemand einen alternativen Ansatz vorschlagen, um den aktuellen Netzwerkstatus zu erhalten?
targetSdkVersion
auf N oder später erfordert ?BroadcastReceiver
denandroid.net.conn.CONNECTIVITY_CHANGE
Filter mit Absicht auch dann verwenden, wenn Sie auf API29 abzielen. Sie müssen ihn nur registrierenApplication.OnCreate
. Sie erhalten nur keine Updates, wenn die App geschlossen wird.Antworten:
Was veraltet ist, ist die Fähigkeit einer Hintergrundanwendung, Änderungen des Netzwerkverbindungsstatus zu empfangen.
Wie David Wasser sagte, können Sie immer noch über Konnektivitätsänderungen benachrichtigt werden, wenn die App-Komponente instanziiert (nicht zerstört) wird und Sie Ihren Empfänger programmgesteuert mit seinem Kontext registriert haben , anstatt dies im Manifest zu tun.
Oder Sie können stattdessen NetworkCallback verwenden. Insbesondere müssen Sie onAvailable für Änderungen des Verbindungsstatus überschreiben .
Lassen Sie mich schnell einen Ausschnitt entwerfen:
quelle
Ich werde die
Sayem's
Antwort auf Probleme mit festen Flusen aktualisieren , die mir angezeigt werden.Und gleiche Verwendung:
Übrigens, danke sayem für deine Lösung.
quelle
In der Dokumentation für Android N heißt es:
Dies bedeutet, dass Sie weiterhin eine registrieren können,
BroadcastReceiver
wenn Ihre App im Vordergrund ausgeführt wird, um Änderungen in der Netzwerkkonnektivität zu erkennen.quelle
Intent
.Bitte überprüfen Sie zuerst die Antwort von @Amokrane Chentir auf Android N-Unterstützung.
Für diejenigen, die in allen API-Levels unterstützen und es in der Benutzeroberfläche beobachten möchten, überprüfen Sie bitte den folgenden Code.
LiveData von NetworkConnection:
Beobachten Sie in der Benutzeroberfläche (Aktivität / Fragment):
quelle
IntentFilter
explizit definieren . Wie so:var intentFilter = IntentFilter(CONNECTIVITY_ACTION)
intentFilter
undconnectivityManager
) nicht explizit benötigen , um ihre Art zu definieren (IntentFilter
undConnectivityManager
jeweils).Ich bin vor ein paar Tagen auf dasselbe Problem gestoßen und habe mich für diese Bibliothek Android-Job entschieden
Diese Bibliothek verwendet
JobSchedular
,GcmNetworkManager
undBroadcastReceiver
je nachdem , welche Android - Version der App läuft.Einen Job zu beginnen ist ziemlich einfach
quelle
Ich habe eine Kotlin-Implementierung geschrieben, die auf Sayams Antwort basiert , aber ohne
LiveData
. Ich habe beschlossen, die (zu diesem Zeitpunkt) neueste API-Methode (ConnectivityManager#registerDefaultNetworkCallback
) aufzurufen, die auf Android Nougat abzielt.Verwendung:
oder:
Vergessen Sie nicht, die
ACCESS_NETWORK_STATE
Berechtigung in Ihre AndroidManifest.xml aufzunehmen :Ich freue mich darauf, hilfreiche Kommentare und Verbesserungen von Ihnen zu lesen.
quelle
(context as AppCompatActivity).runOnUiThread(object: Runnable{ override fun run() { onConnectionAvailable.invoke() } })
stattonConnectionAvailable.invoke()
. Das gleiche gilt füronConnectionLost.invoke()
.Apps für Android N (Nougat) empfangen keine
CONNECTIVITY_ACTION
im Manifest definierten Sendungen (siehe Svelte ).Mögliche Lösungen:
ConnectivityManager.registernetworkCallback()
sobald die Anwendung ausgeführt wird.JobScheduler
und geben Sie ein nicht gemessenes Netzwerk über ansetRequiredNetworkType()
.Siehe auch Android O - Konnektivitätsänderung im Hintergrund erkennen
quelle
Ich stimme der Antwort von @rds zu.
Beachten Sie, dass CONNECTIVITY_ACTION in API-Level 28 veraltet ist.
Sie müssen verwenden
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
Die Frage ist, dass Sie BroadcastReceiver nicht verwenden können. Wie also?
Sie können entweder JobScheduler oder besser WorkManager (Periodic Request) verwenden. Warum periodisch, denn wenn es sich um eine OneTimeRequest handelt, kann sie nur einmal ausgeführt werden und weiterhören, während sich Ihre App im Vordergrund befindet.
Die Dokumentation sagt:
Sobald die App beendet oder aus der Liste der zuletzt verwendeten Apps entfernt wurde, kann networkCallback nicht mehr zuhören.
Sie benötigen also solche regelmäßigen Jobs, damit die App kontinuierlich zuhört. Wie lang sollte die Dauer sein? Das liegt bei Ihnen und hängt von Fall zu Fall ab.
Ich weiß, dass es ein bisschen hässlich ist, aber so ist es. Eine Herausforderung könnte sein, dass sich Ihr Auftrag verzögert, wenn sich das Gerät des Benutzers im Doze-Modus befindet oder sich die App im Standby-Status befindet.
quelle
Wenn wir einen Netzwerkrückruf mit der
registerNetworkCallback
Methode registrieren, wird er manchmal nicht und manchmal falsch positiv ausgelöst:onAvailable
Methode ausgelöst.NetworkCallback
aufgerufen (dies ist aufgrund von S. 1 sehr seltsam).onAvailable
Methode auslöst. Und ich denke, es ist ein falsch positives Verhalten, weil wir erwarten, dass die Internetverbindung beobachtet wird.Wie Sie unten sehen, ist standardmäßig eine Internetverbindung verfügbar, die nur ausgelöst wird, wenn sie sich ändert. Keine falsch positiven Auslöser.
Fassen Sie einfach diese und diese Antworten zusammen (aber nur für API> = 21):
So stellen Sie die Abhängigkeiten bereit
Und wie man es benutzt:
quelle
Basierend auf der Antwort von @ KebabKrabby:
Und verwenden Sie es fast genauso wie in der ursprünglichen Antwort (wenn Sie zum Beispiel von einer Aktivität aus beobachten):
quelle