2014-06-08 2 views
0

J'ai une application qui utilise le GPS pour les mises à jour régulières. Auparavant, lorsque l'appareil était mis en veille (l'écran était éteint, le délai d'attente de l'écran, etc.), les mises à jour de l'emplacement continuaient à arriver. C'était sur un HTC Desire fonctionnant 2.2.Problème de mise en veille avec les mises à jour de localisation GPS sur certains appareils

J'ai besoin de ce comportement pour diverses raisons. Cependant, maintenant en cours de test sur un HTC Desire S fonctionnant sous 4.0.4, et ce qui semble se produire est que les mises à jour continuent (1/sec) pendant environ 5 secondes après être entré en mode veille, mais ensuite s'arrêter. Cependant, exactement le même code fonctionne sur un Google Nexus 7 fonctionnant en version 4.4.2, et les mises à jour continuent à arriver. Le cycle de vie de l'activité semble faire toutes les bonnes choses (onPause en entrant en veille, onResume en quittant le sommeil), mais sur le Desire S, les mises à jour de localisation s'arrêtent.

Alors qu'il est sans doute plus économe en énergie pour les éteindre, j'en ai besoin. Le comportement semble dépendant du système d'exploitation et/ou du périphérique. Comment puis-je y parvenir? Edit: en fait, j'ai trouvé que les mises à jour de localisation continuent à venir, beaucoup moins fréquemment que demandé.

+0

Avez-vous l'auditeur dans votre activité? Lorsque vous désinscrivez l'écouteur? – greywolf82

+0

Il n'est pas enregistré dans onStop(), pas onPause(). Donc, autant que je peux voir, avec l'écran se coucher, ne devrait pas être affecté. – nmw01223

+0

J'ai le même problème avec HTC One m7 et m8 ... avez-vous trouvé une solution à ce problème? – pdiddy

Répondre

0

En fait, la manière la plus simple de faire cela semble être un verrouillage de sillage partiel.

+0

Bien. Puis-je vous demander si vous avez tout votre flux d'exécution dans onLocationChange()? Je veux dire: utilisez-vous un autre thread pour faire l'élaboration?Je vous demande cette chose parce que j'ai vu le code source du système d'exploitation et j'ai vu que locationManager possède un wakelock jusqu'à ce que onLocationChange() renvoie ou le récepteur de diffusion reçoit l'intention (pour la version d'intention de l'interface). C'est intéressant qu'avec ce téléphone ça ne marche pas, peut-être un changement de HTC. – greywolf82

+0

Je lis sur un autre fil que c'est une caractéristique de HTC Desire. Pour un comportement "normal", vous devez désactiver le "mode d'économie d'énergie" dans les réglages. – greywolf82

+0

Aucun autre thread, il ne fait pas beaucoup. Je l'ai contourné en saisissant un verrou de réveil partiel lors de la demande de mises à jour de localisation, en le relâchant lors de l'annulation. Utilise beaucoup plus de batterie, à peu près la même chose que l'ancien Desire qui ne laisse jamais dormir le GPS en premier lieu. Donc, je pense que c'est une amélioration de l'économie d'énergie sur le S. Je ne trouve rien dans les paramètres qui me permet de le contrôler. Même sur Google nexus 7. En fait, l'ancien Desire a un GPS plus fiable. – nmw01223

0

Tout d'abord, seul onPause() est appelé avec 100% de probabilité par OS, onStop() et onDestroy() ne peut pas être appelé par OS. Vous devez vous désinscrire dans onPause(), de plus la conception est erronée parce que vous avez deux options:

1) Utilisez une intention en attente avec un récepteur/service d'intention de diffusion pour gérer la position;

2) Utilisez un service de premier plan pour installer un écouteur d'emplacement.

Activité ce n'est pas le bon endroit pour faire cette chose.

+0

Le fait est que je dois rester en cours de mise à jour des emplacements lorsque l'écran se met en veille. C'est à ce moment que onPause() est appelé ainsi, l'annulation de l'enregistrement ne fonctionnerait pas. Je ne vois donc pas comment l'enregistrement d'un auditeur d'emplacement à partir d'un service par opposition à une activité ferait une réelle différence, même si je l'ai considéré. Le système d'exploitation peut également faire exploser le service s'il le veut - c'est moins probable. – nmw01223

+0

Les activités sont les composants du système d'exploitation utilisés pour la présentation et non pour le traitement en arrière-plan. Vous devez supprimer tout écouteur dans onPause(). Peut-être que le problème est que le système d'exploitation appelle votre onStop(). Bien sûr, ce n'est pas ce que vous voulez parce que vous voulez courir quand l'écran est éteint, en effet je vous ai suggéré d'utiliser le service à la place. Même si cela ne devrait pas être nécessaire, vous pouvez garder un wakelock partiel pour être sûr que le processeur reste éveillé. – greywolf82

+0

Le système d'exploitation n'appelle pas onStop(), j'ai vérifié tout le flux. Il appelle simplement onPause(), puis onResume() à la sortie du sommeil, comme je m'y attendais. Je prends votre point de vue ci-dessus, mais ne pense pas que c'est le problème ici. Plutôt le système semble décider de mettre le GPS dans un mode de faible puissance quand il dort, sans aucun doute, il économise de l'énergie, mais ne m'aide pas. Comme je l'ai dit, le HTC Desire fonctionnant 2.2.2 ne le fait pas. Il est intéressant de noter que cet appareil, même s'il ne voit jamais autant de satellites, produit également une meilleure précision, jusqu'à 2m, alors que le Desire S ou le Nexus 7 n'atteint jamais les 4-5m. – nmw01223

Questions connexes