0

我的应用程序需要在其后台服务中具有更新的亮度值(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 需要快速完成,否则它们会成批。

对于这样的事情有更清洁的解决方案吗?

谢谢

问候, 安德烈亚斯

4

1 回答 1

5

您应该使用调用 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
    }
}
于 2011-03-18T20:37:20.367 回答