Android - уровень освещенности каждые десять 10 минут - PullRequest
0 голосов
/ 18 марта 2011

Мое приложение должно иметь обновленное значение уровня освещенности (задержка 10-15 минут или что-то в этом роде) (это не коммерческое приложение) в фоновом сервисе ....

Я знаю, как получить значение освещенности, используя SensorEventListener и SensorManager, но в документации API прямо говорится, что если вы не отмените регистрацию слушателя, когда вам это не нужно, это разрядит вашу батарею всего за несколько ч.

теперь мой вопрос ... как я могу использовать слушателя вместе с менеджером датчиков для получения значения уровня освещенности каждые 10-15 минут?

Могу ли я использовать что-то подобное ниже с таймером, который запускает эту задачу каждые 10-15 минут?

    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);
            }
        }

    }

};

Sensoreventlistener ничего не делает, кроме этого:

    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) {

    }

};

Я даже не уверен, что вы можете использовать Thread.sleep в рамках задачи таймера. Но я уже готов, что TimerTasks нужно быстро завершить, иначе они сгруппируются.

Есть ли более чистое решение для чего-то подобного?

Спасибо

С уважением, Andreas

1 Ответ

5 голосов
/ 18 марта 2011

Вы должны использовать будильник, который вызывает serviceIntent.

Запускайте будильник каждые 15 минут:

    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);

и ваш сервис выглядит так:

public class YourServiceextends IntentService {
    public YourService() {
        super("YourService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
         //do something
    }
}
...