Android 安卓-每10分钟获得一次光照
我的应用程序需要在其后台服务中有一个更新的亮度值(10-15分钟的延迟是可以的,或者别的什么)(这不是一个商业应用程序) 我知道如何使用SensorEventListener和SensorManager检索light值,但在API文档中明确指出,如果您不在不需要的时候注销侦听器,它将在几个小时内耗尽电池电量 现在我的问题是……我如何使用监听器和传感器管理器每10-15分钟检索一次光照值Android 安卓-每10分钟获得一次光照,android,timer,listener,sensors,light,Android,Timer,Listener,Sensors,Light,我的应用程序需要在其后台服务中有一个更新的亮度值(10-15分钟的延迟是可以的,或者别的什么)(这不是一个商业应用程序) 我知道如何使用SensorEventListener和SensorManager检索light值,但在API文档中明确指出,如果您不在不需要的时候注销侦听器,它将在几个小时内耗尽电池电量 现在我的问题是……我如何使用监听器和传感器管理器每10-15分钟检索一次光照值 private TimerTask lightSensorTimer = new TimerTask
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);
}
}
}
};
我是否可以使用下面这样的计时器,每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。但我已经准备好了,时间任务需要很快完成,否则它们会成批出现
像这样的事情有没有更干净的解决方案
谢谢
问候,,
Andreas您应该使用调用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
}
}
您应该使用调用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
}
}
我已经有了前台服务。所以我不需要每15分钟唤醒一次设备。那么你是说在我的前台服务中使用报警管理器?不。不要使用前台服务,只有在需要时才通过报警启动服务。嗯,我真的不知道你的服务是做什么的。我认为你应该使用一个警报来达到目的,为了保持它的整洁,为什么不为这个任务做一个单独的服务呢。我想,如果其他东西也在运行,这并不重要。所以我认为上面的代码还是不错的。把你的东西放在手提行李上就行了。(嗯,@falmari更快:D..但那;)@falmari但这不是我要问的。@Nanne,好吧,如果我做一个单独的服务,每15分钟调用一次……onSensorChanged函数可能不会在服务完成之前调用。这就是我在问题中想表达的观点,我已经有了一个服务作为前台服务。所以我不需要每15分钟唤醒一次设备。那么你是说在我的前台服务中使用报警管理器?不。不要使用前台服务,只有在需要时才通过报警启动服务。嗯,我真的不知道你的服务是做什么的。我认为你应该使用一个警报来达到目的,为了保持它的整洁,为什么不为这个任务做一个单独的服务呢。我想,如果其他东西也在运行,这并不重要。所以我认为上面的代码还是不错的。把你的东西放在手提行李上就行了。(嗯,@falmari更快:D..但那;)@falmari但这不是我要问的。@Nanne,好吧,如果我做一个单独的服务,每15分钟调用一次……onSensorChanged函数可能不会在服务完成之前调用。这就是我想在这个问题上提出的观点