J'ai une application Android qui doit être synchronisée sur Internet, mais dès que le téléphone se couche, je ne peux pas accéder à Internet. Il ne se produit que lorsque l'utilisateur utilise le "mode batterie", lorsqu'il désactive les données après 15 minutes. J'ai écrit une application de test et son activation des données, mais elle se connecte toujours au serveur.
ce que j'ai essayé: strong> p> Testé sur Motorola Atrix Android 2.3.3. Je ne peux pas compter sur le wifi. Dans la vie réelle, il se synchronisera chaque semaine. Comment pouvons-nous rendre cela possible? P> AlarmManager: strong> p> alarmreceur: strong> p > androidmanifest.xml strud> p>
3 Réponses :
Je suggérerai de changer un peu cette approche, ce qui n'est pas mauvais du tout, c'est même bien de vous assurer que vous êtes toujours synchronisé, avec le seul problème que vous ne donnez pas à l'utilisateur la possibilité de décider, car Si je, en tant qu'utilisateur, décidez d'éteindre mes données, je ne veux tout simplement pas que quelqu'un puisse l'activer. Il pourrait y avoir plusieurs raisons pour cela, et l'un d'entre eux devrait être suffisant, mais dire que vous sortez du pays et que vous n'avez aucun plan de données international et par accident ou par défaut, vous avez activé des données activées. Si je découvrais que certaines applications ont transformé mes données sur et dépensé une somme sensible, je serais assez énervé, et je serai personnel. P>
Une approche plus appropriée et une solution droite plus appropriée serait également de faire une synchronisation dure / complète de temps en temps chaque fois que l'utilisateur ouvre votre application ou a accès à une connexion WiFi (ConnectivityManager est votre ami ) en fonction de conditions faciles (la dernière fois synchronisation de la dernière semaine, des données sauvegardées obsolètes, des incohérences, etc.) et de faire un doux. Synchroniser (mettre à jour les données en arrière-plan) dans le reste des cas. P>
Synchronisation d'ailleurs signifie périodiquement signifie gaspiller des données utilisateur au cas où l'utilisateur n'utilise pas l'application. En fin de compte, cela transforme votre application en un candidat parfait pour être éteint par le système de temps en temps. P>
J'espère que cela aide. Gardez-nous mis à jour avec vos progrès. P>
Lecture associée: optimiser les téléchargements pour un accès réseau efficace P>
Bon point. En outre, examinez les articles ici sur la rédaction d'applications optimisées utilisant le réseau. Il y a des morceaux sur le regroupant les transferts de réseau et la manipulation de connexions multiples. développeur.att.com/developer/forward.jsp?passeditemid=7200042
Tout d'abord, vous devez obtenir ce Deuxièmement, étant donné le Troisième, Supprimer Maintenant, compte tenu de tout cela, dans votre httpport code> hors du Broadcastreceur code> et dans un Intitifservice code>. jamais strong> E / S réseau sur le thread d'applications principale, et Onreceive () code> est appelé sur le thread d'applications principale. Par exemple, si vous prenez trop de temps, Android terminera votre code à travers l'opération Internet. P>
intitifservice code>, vous devez utiliser un wakelock code>. Cela peut vous diriger d'utiliser Mon wakefulinterService code> , qui gère les deux problèmes . Ou, utilisez wavefulbroadcastreceiver code> a >, qui a le même but. p>
Turnoninet () code> et getmobiledaAenabled () code>. Vous n'en avez pas besoin, ils sont peu fiables, et en particulier Turnoninet () code> est utilisateur-hostile - si l'utilisateur souhaitait des données mobiles sur, ils l'auraient activés. P>
erhandleintent () code> de votre intiveservice () code> (ou votre dowoucewwork () code> de votre < Code> wakefulintentsservice code>), si vous n'avez pas de connexion Internet immédiatement, en tant que solution de contournement temporaire, systemclock.sleep () code> pour une seconde et réessayez, répétez quelques fois à une fois boucler. Si vous constatez que vous obtenez un accès Internet après un peu, vous pouvez envisager de devenir plus sophistiqué (par exemple, une écoute des émissions de changement de connectivité plutôt que des émissions de changement de connectivité plutôt que de sondages, bien que cela vous éloigne de WakefulintTaleService Code> et dans un Service code> régulier code> avec votre propre fil d'arrière-plan et une machine à états pour wakelock code> gestion). Ou, il suffit de rester avec le dormir () code> - il est peu probable que vous soyez la fin du monde si vous attachez ce fil de fond pendant quelques secondes. Si vous ne recevez pas la connectivité après une quantité modeste de temps, veuillez ne pas continuer à essayer indéfiniment, car il y a un certain nombre de raisons pour lesquelles vous n'avez peut-être pas de connexion, y compris la gestion de la bande passante axée sur l'utilisateur sur Android 4.0 +. p>
Je me débats depuis des semaines maintenant. Des idées Pourquoi utiliser votre wakefulintentservices code> correctement ne donne toujours pas à mon service d'arrière-plan Internet lorsqu'il est réveillé de dormir profond malgré plusieurs fois de vous connecter avec les couches? Je planifie le service avec le gestionnaire d'alarme et je sais que je devrais planifier une diffusion qui commence ensuite le service, peu importe que je voie le feu de service à l'heure, mais l'appareil n'a tout simplement pas d'Internet (Pinging Google) . Je suis vraiment à perte.
@Cordrehn: Mode Doze, peut-être. Ou, si le périphérique n'a pas de données mobiles, il faut du temps pour établir une connexion WiFi.
Merci pour votre temps, je vais faire des recherches en mode Doze maintenant. J'ai été généreux donnant au dispositif 3 minutes à Ping Google avec succès avec 10 secondes et de 3 secondes intervalles. Je ne pense pas que la solution ne soit que "attendre plus longtemps"?
@Cordrehn: Probablement pas. Mais avec le mode DOZE et l'application en attente, simplement parce que votre application peut fonctionner (occasionnellement) ne signifie pas que vous avez accès à Internet à ces moments.
Ah cela a du sens et la recherche en mode Doze plus semble de plus en plus comme ce qui se passe. Mes alarmes sont exactes et non répétées car elles sont sensibles au temps. Je pense que la seule solution réelle ici est d'offrir à WhitElist mon application aux utilisateurs et à avertir des inconvénients si elles ne le font pas. Comment ça sonne?
@Cordrehn: D'accord. Juste Soyez prudent avec "l'offre à Whitelist mon application à Utilisateurs "Partie .
Pas une réponse exacte - mais cette approche ruinerait absolument la durée de vie de la batterie. Le point de sommeil entier consiste à économiser la batterie et cette application ne ferait rien de plus que d'être une gêne pour les clients, peu importe la manière dont les fonctionnalités sont utiles. p>
Ce que je veux suggérer, c'est que s'il est absolument nécessaire de vous connecter à Internet pendant que l'application n'est pas utilisée - définissez une gâchette pour le moment où le téléphone se réveille. Si ce n'est pas complètement nécessaire, il serait probablement préférable de simplement vous reconnecter à Internet chaque fois que l'application est ouverte. P>
S'il vous plaît ne tuez pas la batterie de vos utilisateurs.
Dans "vraie vie", il sera synchronisé chaque semaine
Avez-vous essayé d'utiliser le drapeau RTC au lieu de RTC_WAKEUP? Étant donné que le réveil n'est pas forcé, peut-être cadre basculera sur le réseau. Puisque vous utilisez Sync une fois par semaine, vous n'avez pas besoin de drapeau de réveil
Quand il ne se réveillera pas quand il est endormi. Je voudrais garder le "timing".
Et si l'utilisateur éteint le téléphone pendant deux semaines (telles que des vacances étrangères), votre "timing" est cassé.
Stackoverflow.com/a/4304110/726863