2010-12-11 14 views
3

Je programme maintenant un programme qui collecte des données de capteur, par ex. valeurs d'acclerometer pour une journée entière.Un collecteur de données de capteur de fond sous Android

Courant J'utilise simplement une activité et j'exécute l'activité pendant une journée entière (j'éteins l'écran automatiquement en noir), et ne fais pas de messages courts ni d'appels téléphoniques pendant la journée.

J'ai entendu dire que je peux faire en sorte que ce type de collecteur de données fonctionne en arrière-plan en utilisant Service. Mais après avoir vérifié le podomètre au http://code.google.com/p/pedometer/. J'ai trouvé que, lorsque l'écran s'éteint, le podomètre ne fonctionne pas. (Mais une application comme Predometer devrait fonctionner dans tous les cas aussi longtemps que l'alimentation est allumée.)

Bien que je ne me soucie pas du problème d'alimentation de toujours détecter les accleromètres, Je veux noircir l'écran pour enregistrer la puissance dans l'écran pour enregistrer plus de points de données d'acclerometer.

Je pense à deux façons:

1.Using un service, cependant, que l'application de pédomètre a montré. Quand l'écran s'éteint, le service semble arrêté aussi! Peut-être que le code a des bugs.

2. Mon application est toujours une activité. Mais je change la lumière scrren en 0 ou totalement noir pour économiser l'énergie.

Ma question est la suivante: pour 1) un service a-t-il l'abalité d'être toujours en cours d'exécution même lorsque l'écran s'éteint pendant une longue période; Pour 2, comment changer la lumière de l'écran?

Merci!

Répondre

6

concernant 1 - de ce que vous avez besoin est un service à distance. c'est un service presque similaire à un service «local» (utilisé dans l'exemple du podomètre) mais qui peut fonctionner même si aucune activité n'y est liée, en arrière-plan. vous pouvez éteindre l'écran et même l'activité peut planter (dans un mauvais cas;)) mais le service continue de fonctionner si vous l'avez démarré avec startService (...) au lieu de bindService (...).

essayez de passer à travers this et voir si cela aide.

concernant 2 - vous devez vraiment utiliser (1);)

+0

noter qu'un service d'arrière-plan la collecte des données de capteurs toute la journée sera vider votre batterie. vous devriez vous assurer que le service ne fonctionne pas sans intention (peut-être avec une petite notification dans la barre des tâches) – mad

2

Vous n'avez pas besoin d'un service à distance - cela peut être fait avec un Service local.

utiliser le motif de commande au lieu du motif de liaison pour le service à-dire utiliser startService()/stopService() plutôt que bind()/unbind().

Dans votre méthode onStartCommand() de service, renvoyez Service.START_REDELIVER_INTENT ou quelque chose de similaire, de sorte que le service dure plus longtemps que le Activity.

Maintenant l'astuce: pour garder le traitement de service correctement lorsque le téléphone se met en veille, vous devez travailler avec un PowerManager.WakeLock. Ce sont assez difficiles à obtenir, et je ne pense pas qu'une explication complète soit nécessaire dans cette réponse.

Voici quelques informations supplémentaires:


Toutes mes excuses pour la réponse sommaire, mais votre question est assez large en termes qu'il touche à certains sujets avancés.

0

Le service d'arrière-plan peut être implémenté avec IntentService pour la plupart des scénarios.

Assurez-vous que le service d'arrière-plan fonctionne dans la version Android récente et antérieure comme 2.3 ou 2.2.

La conception des opérations d'arrière-plan est différente à partir d'Android 4.0.

Best Practices for Background Jobs

Performing Network Operations

+0

Je ne pense pas qu'un service d'intention est une bonne idée dans ce cas. –