Mon application doit avoir une valeur de niveau de lumière mise à jour (un délai de 10-15 minutes est bien ou quelque chose) (ce n'est pas une application commerciale) dans son service de fond .... Je sais comment récupérer la valeur de la lumière à l'aide d'un SensorEventListener et du SensorManager, mais dans les documents API, il est dit explicitement que si vous ne désinscrivez pas l'écouteur lorsque vous n'en avez pas besoin, votre batterie sera déchargée quelques heures.Android - obtenir le niveau de lumière toutes les 10 minutes
maintenant ma question est .... comment puis-je utiliser l'auditeur avec le gestionnaire de capteur pour récupérer une valeur de niveau de lumière toutes les 10-15 minutes? Puis-je utiliser quelque chose comme le ci-dessous avec un minuteur qui exécute cette tâche toutes les 10-15 minutes?
private TimerTask lightSensorTimer = new TimerTask() {
@Override
public void run() {
if (sensorManager != null) {
Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
if (lightSensor != null) {
sensorManager.registerListener(sensorListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
while (newLightLevel == lightLevel) {
try {
**Thread.sleep(1000);**
} catch (InterruptedException e) {
Log.e(TAG, "Interrupted exception in lightsensor timer: " + e.getMessage());
}
}
PhoneEvents.this.lightLevel = PhoneEvents.this.newLightLevel;
sensorManager.unregisterListener(sensorListener, lightSensor);
}
}
}
};
Le sensoreventlistener ne fait rien que ceci:
private SensorEventListener sensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
PhoneEvents.this.newLightLevel = event.values[0];
}
}
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
};
Je ne suis même pas sûr si vous pouvez utiliser Thread.sleep dans une tâche de minuterie. Mais je suis prêt à ce que les TimerTasks aient besoin de finir rapidement, sinon ils se regroupent.
Existe-t-il une solution plus propre pour quelque chose comme ça?
Merci
Cordialement, Andreas
Je possède déjà un service en tant que service de premier plan. Donc, je n'ai pas besoin de réveiller l'appareil toutes les 15 minutes. donc vous dites d'utiliser le gestionnaire d'alarme dans mon service d'avant-plan? – kkudi
Non. N'utilisez pas un service de premier plan et ne démarrez votre service que lorsque vous en avez besoin via une alarme. – Falmarri
Eh bien, je ne sais pas vraiment ce que votre service fait. Je pense que vous devriez utiliser une alarme pour une intention, et pour garder tout net, pourquoi ne pas faire un service distinct pour cette tâche. Peu importe si quelque chose d'autre est également en cours d'exécution, je suppose. Donc je pense que le code ci-dessus serait toujours bon. Gérez simplement vos affaires dans le onHandleIntent. (hmm, @falmarri était plus rapide: D .. mais ça;)) – Nanne