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 に答える