Détecter la CONNECTIVITÉ CHANGEMENT dans Android 7 et ci-dessus, lorsque l'app est tué/en arrière-plan
Problème:
Donc, le problème est que j'ai une application qui envoie une demande à notre backend chaque fois que le WiFi est connecté (connecté avec le SSID et d'autres infos) ou lorsqu'il est déconnecté (sur le réseau mobile). Cependant, avec les changements dans le Android 7/N et au-dessus, CONNECTIVITY_CHANGE et CONNECTIVITY_ACTION de ne plus fonctionner en arrière-plan. Maintenant, dans la plupart des cas, les gens à l'abus de cette émission, et je peux tout à fait comprendre pourquoi le changement a été fait. Cependant, je n'ai aucune idée de comment résoudre ce problème dans l'état actuel.
Maintenant, je ne suis pas beaucoup d'un développeur Android (c'est un plugin Cordova) donc je compte sur vous les gars!
Comportement attendu:
App est réveillé et la demande est envoyée à chaque fois que WiFi commutateurs de la connectivité, même lorsque l'application est tué/en arrière-plan.
Comportement actuel:
App n'envoie la demande lorsque l'application est au premier plan.
Essayé jusqu'à présent:
Jusqu'à présent, j'ai déplacé l'intention implicite pour écouter CONNECTIVITY_ACTION du manifeste pour enregistrer manuellement dans la partie principale de l'application (plugin). Cela permet de travailler aussi longtemps que l'application est en mémoire, mais pas sur le démarrage à froid ou de fond réelle
Déjà regardé:
La plupart des réponses à parler à l'aide de tâches planifiées pour remplacer le manque de diffusion. Je vois comment cela fonctionne pour, par exemple, une nouvelle tentative de téléchargement ou similaire, mais pas pour mon cas (mais s'il vous plaît corrigez-moi si je me trompe). Ci-dessous sont les postes que j'ai déjà regardé:
ConnectivityManager.CONNECTIVITY_ACTION obsolète
Détecter les modifier à l'aide de JobScheduler
Android O - Détecter les modifier en arrière-plan
Vous devez vous connecter pour publier un commentaire.
Nougat et au-Dessus:
Nous devons utiliser JobScheduler et JobService pour des Modifications de la Connexion.
Tout ce que je peux diviser en trois étapes.
Veuillez consulter les liens ci-dessous pour plus d'info.
https://github.com/jiteshmohite/Android-Network-Connectivity
https://github.com/evant/JobSchedulerCompat
https://github.com/googlesamples/android-JobScheduler
https://medium.com/@iiro.krankka/its-time-to-kiss-goodbye-to-your-implicit-broadcastreceivers-eefafd9f4f8a
C'est la façon dont je l'ai fait. J'ai créé un
IntentService
et dansonCreate
méthode et je me suis inscritenetworkBroadacst
à l'affût de la connexion internet.C'est mon émission de la classe
De cette façon, vous pouvez vérifier la connexion internet si votre application est au premier plan ou en arrière-plan dans le nougat.
Le meilleur moyen d'acquérir de la Connectivité de changer de système d'exploitation Android Os 7 et ci-dessus est d'enregistrer votre ConnectivityReceiver de diffusion dans la classe d'Application comme ci-dessous, Cela vous aide à obtenir des changements dans l'arrière-plan jusqu'à ce que votre application vivant.
Et puis dans le manifeste
Ici est votre ConnectivityReceiver.java
Ci-dessous est extrait de la documentation
De sorte que vous obtiendrez de cette Émission jusqu'à ce que votre contexte est valable dans Android N & au-dessus explicitement à l'enregistrement pour la même.
De Démarrage D'Achèvement:
Vous pouvez écouter
android.intent.action.BOOT_COMPLETED
de diffusionvous aurez besoin de cette autorisation pour le même.
Application Tué Scénario:
Vous n'allez pas recevoir.
Qui est très attendue et en raison de diverses raisons
Android Oreo a des limites sur les services en cours d'exécution en arrière-plan, de sorte que vous pouvez faire face à ce sur O appareils
Doze mode sur Android Guimauve partir peut provoquer cela, il va arrêter toutes les activités du réseau lui-même & emporter CPU sillage des serrures
Si Doze mode ont un mécanisme pour demander une liste blanche d'applications, cela peut être utile pour vous.
CONNECTIVITY_CHANGE
dans le manifeste pour les anciennes versions d'AndroidUne autre approche qui est plus simple et plus facile lorsque vous utilisez
registerNetworkCallback (NetworkRequest, PendingIntent)
:Qui est
SendAnyRequestService.class
est votre classe de service, et vous pouvez appeler votre API à l'intérieur.Ce code fonctionne pour Android 6.0 API (23) et au-dessus de
Document de référence est ici
Alors je suis venu avec une solution de rechange que j'ai mis en place dans mon application en utilisant Kotlin Coroutines & EventBus.
J'ai appelé cette fonction dans la classe étendant Application.
Ce code fonctionne parfaitement dans le scénario de premier plan depuis mon application est uniquement de premier plan basé. Avec quelques modification à l'aide des services ou alors, je crois qu'il peut être utilisé dans le fond aussi bien que pas sûr.
Si quelqu'un essaie en arrière-plan, puis de bien vouloir modifier cette réponse, y compris que trop.