我的应用需要在其后台服务中有更新的亮度值(延迟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需要快速完成,否则他们会批处理。
这样的事情是否有更清洁的解决方案?
由于
此致 安德烈亚斯
答案 0 :(得分: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
}
}