Android - le Meilleur moyen de mettre en œuvre: LocationListener à travers de multiples activités
J'ai été coincé sur ce problème depuis un certain temps. Je suis en train de travailler sur une application qui utilise emplacement assez largement dans plusieurs Activités différentes. Tous les exemples que j'ai trouvé utilise un autre: LocationListener dans chaque Activité. Ce n'est pas possible dans ma situation.
Je me demande quel est le moyen le plus efficace pour garder une trace de l'emplacement de l'utilisateur à travers plusieurs activités. Droit maintenant, j'ai créé un service qui met en œuvre: LocationListener et utilise une diffusion statique de la mise à jour lat et long champs dans une base de l'Activité de la classe. Cela signifie que le service est toujours en cours d'exécution, ce qui n'est pas l'idéal. Mais si j'ai arrêté le service et de le redémarrer que lorsque j'en ai besoin, il faut du temps pour obtenir un bon emplacement. J'ai besoin de l'emplacement des données dans l'Activité de onCreate(). Il en va de même si j'essaie de la mettre en œuvre dans l'activité de la classe de base. Si je ne cesse de vous inscrire à l'auditeur dans onResume/onCreate et annuler l'inscription dans onPause(), ça prend trop de temps pour commencer à recevoir des mises à jour. J'ai aussi essayé de créer un service que j'ai pu lier, afin qu'elle ne commence que lorsque j'ai besoin d'un endroit. Mais j'ai le même problème, ça prend trop de temps à se lier pour le service et obtenir des mises à jour.
Le service que j'utilise fonctionne maintenant, mais de tout ce que j'ai lu, je ne devrais pas être constamment à l'aide d'un service en cours d'exécution pour des futilités de ce genre. Mais le point de l'ensemble de l'application est de fournir des données pertinentes en fonction de l'utilisateur de l'emplacement actuel. J'ai donc un service qui fonctionne dans le fond et fournit des mises à jour périodiquement. L'un des grands problèmes qui m'ont poussé à revoir le design est à ce moment que j'ai découvert récemment que onProviderEnabled() n'est pas appelée si l'utilisateur démarre l'application sans GPS activé, puis par la suite le permet. Dans ce scénario, l'application dispose d'aucun moyen de reconnaître que le GPS est activé de sorte qu'il peut commencer à l'écoute pour les mises à jour.
J'ai cru comprendre LocationManager et: LocationListener en regardant les exemples, mais je n'arrive pas à l'appliquer à cette situation, où j'ai besoin de l'emplacement des données dans de multiples Activités. De l'aide ou des conseils seraient grandement appréciés.
Vous devez vous connecter pour publier un commentaire.
La façon dont je voudrais généralement de mettre en œuvre cette exigence est à l'aide d'un bond mise en œuvre des Services, comme celui de la Le Service Local De L'Échantillon dans la Documentation du kit de développement. Évidemment, vous êtes familier avec l'avantage de la Service vous permettant de créer tous les emplacement code qu'une seule fois.
De l'accès au Service par le biais de Liaisons permet au Service de démarrer et d'arrêter lui-même de sorte qu'il n'est pas en cours d'exécution lorsque votre application n'est pas au premier plan (il va mourir dès que pas plus les Activités sont liées). La clé, de l'OMI, à la réalisation de ce travail, c'est de LIER le service en
onStart()
et SÉPARER enonStop()
, parce que ces deux appels se chevauchent lorsque vous passez d'une Activité à l'autre (Deuxième Activité Commence avant la Première on s'Arrête). Cela permet de maintenir le Service de mourir quand on se déplace à l'intérieur de l'application, et ne laisse passer que le service de mourir lorsque l'ensemble de l'application (ou au moins une partie intéressée dans l'emplacement) les feuilles au premier plan.Avec Fixations, vous n'avez pas à passer à l'Emplacement des données dans une émission de Radiodiffusion, car l'Activité peut appeler des méthodes directement sur le Service pour obtenir la dernière position. Cependant, une Diffusion encore être avantageuse en tant que méthode d'indiquer QUAND une nouvelle mise à jour est disponible...mais ce serait juste de devenir l'auteur d'une notification à l'Activité d'écoute et d'appeler le
getLocation()
méthode sur le Service.Mon de 0,02$. Espérons que ça Aide!
BroadcastReceiver
pourIntent.ACTION_SCREEN_ON
etIntent.ACTION_SCREEN_OFF
pour désactiver les composants lourds comme le GPS. Déplacer le mécanisme de liaison dans onPause()/onResume() provoque le service peut-être arrêter/redémarrer souvent tout au long de l'utilisation de l'application, car ces rappels ne se chevauchent, laissant le service de tomber dans un état non lié fréquemment.bindService(intent, mServiceConn, BIND_AUTO_CREATE )
, quelqu'un peut confirmer?J'ai eu le même problème et j'ai essayé de le résoudre avec la bonne réponse de Devunwired, mais j'ai eu quelques ennuis. Je ne pouvais pas trouver un moyen d'arrêter le service et quand j'ai fini mon appli GPS-module est toujours en cours d'exécution. J'ai donc trouvé un autre moyen:
J'ai écrit un GPS.java catégorie:
Cette classe est utilisée dans toutes les Activités qui doit les coordonnées GPS. Chaque Activité doit implémenter l'Interface suivante (nécessaire pour la communication):
Maintenant mon Activité principale ressemble à ça:
et un deuxième comme ça:
Il n'est pas aussi belle que la solution de Devunwired, mais cela fonctionne pour moi.
acy
Vous pourriez avoir votre service de la rédaction de votre lat & long coords à une db sqlite sur le changement de cette façon, vous n'avez pas le service de liaison de la surcharge et de vos coordonnées seront accessibles dans toutes vos activités.
Peut-être dans votre activité principale, vous pouvez vérifier l'état du GPS et si elle est désactivée, vous pouvez demander à l'utilisateur de l'activer. Une fois que le GPS est activé votre service.
Ici est très simple et simple façon de le faire:
Dans votre activité principale:
Cela ne fera que supprimer les mises à jour écoute si vous appuyez sur la touche de Retour dans votre activité principale, mais sinon rester sur.
C'est pas la meilleure façon de le faire, mais c'est un simple copier-coller de la solution.
Assurez-vous de ne pas appeler à l'emplacement d'écoute si c'est déjà en cours d'exécution (par exemple sur la rotation de l'écran), sinon vous vous retrouverez avec des auditeurs multiples cours d'exécution en arrière-plan.