2011-03-18 2 views
0

Mon application doit avoir une valeur de niveau de lumière mise à jour (un délai de 10-15 minutes est bien ou quelque chose) (ce n'est pas une application commerciale) dans son service de fond .... Je sais comment récupérer la valeur de la lumière à l'aide d'un SensorEventListener et du SensorManager, mais dans les documents API, il est dit explicitement que si vous ne désinscrivez pas l'écouteur lorsque vous n'en avez pas besoin, votre batterie sera déchargée quelques heures.Android - obtenir le niveau de lumière toutes les 10 minutes

maintenant ma question est .... comment puis-je utiliser l'auditeur avec le gestionnaire de capteur pour récupérer une valeur de niveau de lumière toutes les 10-15 minutes? Puis-je utiliser quelque chose comme le ci-dessous avec un minuteur qui exécute cette tâche toutes les 10-15 minutes?

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); 
      } 
     } 

    } 

}; 

Le sensoreventlistener ne fait rien que ceci:

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) { 

    } 

}; 

Je ne suis même pas sûr si vous pouvez utiliser Thread.sleep dans une tâche de minuterie. Mais je suis prêt à ce que les TimerTasks aient besoin de finir rapidement, sinon ils se regroupent.

Existe-t-il une solution plus propre pour quelque chose comme ça?

Merci

Cordialement, Andreas

Répondre

5

Vous devez utiliser une alarme qui appelle une serviceIntent.

Démarrer l'alarme toutes les 15 minutes:

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); 

et votre service ressemble à ceci:

public class YourServiceextends IntentService { 
    public YourService() { 
     super("YourService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     //do something 
    } 
} 
+0

Je possède déjà un service en tant que service de premier plan. Donc, je n'ai pas besoin de réveiller l'appareil toutes les 15 minutes. donc vous dites d'utiliser le gestionnaire d'alarme dans mon service d'avant-plan? – kkudi

+0

Non. N'utilisez pas un service de premier plan et ne démarrez votre service que lorsque vous en avez besoin via une alarme. – Falmarri

+0

Eh bien, je ne sais pas vraiment ce que votre service fait. Je pense que vous devriez utiliser une alarme pour une intention, et pour garder tout net, pourquoi ne pas faire un service distinct pour cette tâche. Peu importe si quelque chose d'autre est également en cours d'exécution, je suppose. Donc je pense que le code ci-dessus serait toujours bon. Gérez simplement vos affaires dans le onHandleIntent. (hmm, @falmarri était plus rapide: D .. mais ça;)) – Nanne

Questions connexes