Android - Holen Sie sich alle zehn 10 Minuten Lichtniveau
Frage
Meine App muss einen aktualisierten Lichtwert (eine Verzögerung von 10 bis 15 Minuten in Ordnung oder so) (dies ist keine kommerzielle App) innerhalb seines Hintergrunddienstes ....
Ich weiß, wie man den Lichtwert mit einem SensorEventListener und dem Sensormanager abholt, aber in den API -Dokumenten heißt es ausdrücklich, dass wenn Sie den Hörer nicht nicht registrieren, wenn Sie ihn nicht benötigen, Ihre Batterie in wenigen Stunden abtropfen lässt.
Jetzt ist meine Frage ... wie kann ich den Hörer zusammen mit dem Sensormanager alle 10-15 Minuten einen Lichtpegelwert abrufen?
Könnte ich so etwas wie das unten mit einem Timer verwenden, der diese Aufgabe alle 10-15 Minuten ausführt?
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);
}
}
}
};
Der SensorEventListener macht nichts anderes als Folgendes:
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) {
}
};
Ich bin mir nicht einmal sicher, ob Sie Thread.Sleep in einer Timer -Aufgabe verwenden können. Aber ich habe bereit, dass TimerTasks schnell fertig werden müssen, da sie sonst angegriffen werden.
Gibt es eine sauberere Lösung für so etwas?
Vielen Dank
Grüße, Andreas
Lösung
Sie sollten einen Alarm verwenden, der einen ServiceIntent aufruft.
Starten Sie den Alarm alle 15 Minuten:
AlarmManager mgr=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(this, YourService.class);
PendingIntent pi=PendingIntent.getService(this, 0, i, 0);
mgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pi);
Und Ihr Service sieht so aus:
public class YourServiceextends IntentService {
public YourService() {
super("YourService");
}
@Override
protected void onHandleIntent(Intent intent) {
//do something
}
}