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

War es hilfreich?

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
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top