2010-11-08 46 views
0

Je crois qu'il est en raison d'une option d'économie d'énergie ou autre chose, mais je ne peux pas le débugger car il échoue seulement quand il est sur la batterieandroid: le service se comportait differnat sans être connecté à un PC

J'ai un service qui vérifie sur une page Web toutes les 60 secondes J'utilise un asyncTask dans le service pour le faire et je le fais Thread.thisThread.sleep (60000); avant de vérifier

Est-ce que je fais quelque chose de mal? la fonction de veille pourrait-elle arrêter le serveur par android?

+0

Quelle version d'Android? D'après ce que j'entends, les versions ci-dessous 2.0 aimaient à tuer vos services même si vous spécifiez qu'ils courent pour toujours. La solution ici consiste à utiliser une notification de barre d'état pour maintenir le processus ouvert. –

+0

son actualy 2.1: s – Mars

+0

Je suppose que ce que vous entendez par échec, c'est qu'il arrête de vérifier une fois que l'appareil se met complètement en veille. Changer votre code comme CommonsWare recommandé résoudra ce problème. Vous devriez probablement penser davantage à combien de fois il faut vraiment le faire et regarder les options push. (http://code.google.com/android/c2dm/) Une connexion réseau toutes les 60 secondes permet de drainer une batterie TRES rapidement. – cistearns

Répondre

5

J'ai un service qui vérifie sur une page Web toutes les 60 secondes que j'utilise un AsyncTask au service de le faire et je le rendre Thread.thisThread.sleep (60000); avant de vérifier

Veuillez ne pas faire cela.

D'abord, rendez la période configurable, y compris une option «ne faites pas cela, jamais». Les utilisateurs n'aiment vraiment pas quand les développeurs écrivent des applications dont le but principal semble être d'utiliser une tonne de vie de la batterie. Garder l'appareil éveillé et interroger un serveur Web chaque minute va consommer une tonne de batterie. C'est un comportement comme celui-ci qui amène les utilisateurs à exécuter tous les tueur de tâches qu'ils peuvent trouver. Deuxièmement, en particulier pour les périodes supérieures à une minute, veuillez utiliser AlarmManager et [WakefulIntentService] [1]. Planifiez le AlarmManager pour appeler votre application à la période choisie par l'utilisateur (idéalement via setInexactRepeating()). Avoir le WakefulIntentService sonder votre page Web. Si vous suivez la recette documentée WakefulIntentService, l'appareil restera éveillé suffisamment longtemps pour que vous puissiez obtenir vos données, puis retombera endormi. Votre service ne restera pas en mémoire tout le temps. Vous obtenez votre fonctionnalité, et l'utilisateur obtient de meilleures performances de l'appareil.

+0

merci je ne savais pas que je pouvais le faire avec AlarmManager même si c'est une application privée pour moi-même, donc je ne suis pas préoccupé par la batterie – Mars