Android 安卓-每10分钟获得一次光照

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

我的应用程序需要在其后台服务中有一个更新的亮度值(10-15分钟的延迟是可以的,或者别的什么)(这不是一个商业应用程序)

我知道如何使用SensorEventListener和SensorManager检索light值,但在API文档中明确指出,如果您不在不需要的时候注销侦听器,它将在几个小时内耗尽电池电量

现在我的问题是……我如何使用监听器和传感器管理器每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);
            }
        }

    }

};
我是否可以使用下面这样的计时器,每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函数可能不会在服务完成之前调用。这就是我想在这个问题上提出的观点