电池电量10时启动/取消定时器

时间:2013-04-11 05:25:56

标签: blackberry timer timertask recurring

我正在开发一款BlackBerry App,可在电池电量达到10%时向服务器发送消息。这是通过在getBatteryStatus()执行以下操作的构造函数中调用getBatteryStatus()方法来实现的:

public static void getBatteryStatus() {

      timerBattery = new Timer(); 
      taskBattery = new TimerTask() {
          public void run() {
              UiApplication.getUiApplication().invokeLater(new Runnable() {
                  public void run() {
                      if (DeviceInfo.getBatteryLevel()==10) {
                         try{
                            String freeText="Battery level at 10%";
                            sendBatteryStatus(freeText);
                         }catch(Exception e){}
                      }
                  }
              });
          }
      };

      timerBattery.scheduleAtFixedRate(taskBattery, 0, 20000);
}

sendBatteryStatus将消息发送到服务器并取消定时器。这实际上已根据请求将消息一次发送到服务器。

但是,如果用户开始按照原来的那样运行手机(没有再次调用构造函数),该怎么办?定时器如何重启?我怎样才能在下次再次将消息发送到服务器?

防止以10%发送多个电池电量信息的最佳机制是什么?实际上只发送一次信息,然后在下次电池电量为10%时再次发送信息?

如果在发送邮件后我没有取消计时器,则会多次向服务器发送邮件。

1 个答案:

答案 0 :(得分:3)

我实际上认为如果你完全摆脱你的计时器会更好。我认为计时器不会有效地为你提供你想要的一切。

幸运的是,BlackBerry拥有SystemListener界面。像这样实现它:

public final class BatteryListener implements SystemListener {

    /** the last battery level we were notified of */
    private int _lastLevel = 0;
    /** the battery percentage at which we send an event */
    private int _threshold = 10;

    public BatteryListener() {
        Application.getApplication().addSystemListener(this);
    }

    public void setThreshold(int value) {
        _threshold = value;
    }

    /** call this to stop listening for battery status */
    public void stopListening() {
        Application.getApplication().removeSystemListener(this);
    }

    private boolean levelChanged(int status) {
        return (status & DeviceInfo.BSTAT_LEVEL_CHANGED) == DeviceInfo.BSTAT_LEVEL_CHANGED;
    }

    public void batteryStatusChange(int status) {
        if (levelChanged(status)) {
            int newLevel = DeviceInfo.getBatteryLevel();
            if (newLevel <= _threshold && _lastLevel > _threshold) {
                // we have just crossed the threshold, with battery draining
                sendBatteryStatus("Battery level at " +
                                  new Integer(newLevel) + "%!");
            }
            _lastLevel = newLevel;
        }
    }

    public void batteryGood() { /** nothing to do */ }      
    public void batteryLow() { /** nothing to do */ }       
    public void powerOff() { /** nothing to do */ }     
    public void powerUp() { /** nothing to do */ }  
}

然后,只要您希望应用开始为您监控电池,您就可以创建并保留此类的一个实例。如果电池电量下降到10%,它将发送一条消息。如果用户稍后再次开始充电,然后停止充电,再次消耗10%,则会发送另一条服务器消息。

private BatteryListener listener;

listener = new BatteryListener();   // start monitoring

显然,在上面的类中,您要么必须将sendBatteryStatus()方法添加到类中,要么将该类传递给实现sendBatteryStatus()方法的对象。

注意:我还建议你在主线程上向服务器发送通知。您没有显示sendBatteryStatus()的实现,所以也许您已经是。{但如果没有,请使用后台线程通知您的服务器,因此UI不会被冻结。