0

我正在尝试制作一个允许用户为每个任务设置任务和警报或通知的应用程序。我在下面创建了一个“setAlarm”方法。但是,我有一个错误,每当我设置多个带有警报的任务时,以前的所有任务都会以某种方式被取消,只有最近设置的警报才会响起。你知道什么问题吗?我的猜测是,每次我调用“setAlarm”时,“日历”实例都会重置。我怎么能解决这个问题?

  public void setAlarm() {
      Intent intent1 = new Intent(NewGoal.this, SingleAlarm.class);
      PendingIntent sender = PendingIntent.getBroadcast(NewGoal.this,
              0, intent1, 0);

      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());

      if (alarm_time == 10) {
          calendar.add(Calendar.SECOND, alarm_time);
      } else if (alarm_time == 30 {
          calendar.add(Calendar.SECOND, alarm_time)
      }

      AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
      am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
      Log.i(TEST, "In setAlarm method");
      Log.i(TEST, "calendar=" + calendar.MILLISECOND);
}
4

3 回答 3

1

文档中:

如果已经为同一个 IntentSender 安排了警报,它将首先被取消。

于 2011-02-08T08:44:16.073 回答
0

可能是因为您使用的是毫秒粒度,而在 Java 中这些不能保证是准确的。以下来自JavaDoc。可能您应该使用 System.nanoTime() 但这仅在 Java 5 之后才可用。请在 SO 上阅读此线程:System.currentTimeMillis vs System.nanoTime

以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

此外,您的代码中的以下语句是多余的

calendar.setTimeInMillis(System.currentTimeMillis());
于 2011-02-08T02:43:13.003 回答
0

@dave.c 谢谢,我也在文档中找到了这个。这是我解决它的方法。

  final int intent_id= (int) System.currentTimeMillis();

  Intent intent1 = new Intent(NewGoal.this, AlarmBroadcastReceiver.class);
  PendingIntent sender = PendingIntent.getBroadcast(NewGoal.this, intent_id, intent1, 0); 

如果有多个同名意图,则最近的意图取消前一个意图。要解决此问题,请使用当前时间使每个意图不同。

多谢你们。

于 2011-02-08T23:34:56.300 回答