【问题标题】:set multiple alarms/notifications bug/error?设置多个警报/通知错误/错误?
【发布时间】:2011-02-09 07:34:56
【问题描述】:

我正在尝试制作一个允许用户为每个任务设置任务和警报或通知的应用程序。我在下面创建了一个“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);
}

【问题讨论】:

  • 我没有看到任何明显的东西。在您的AlarmManager 中,您从calendar 对象传递了一个长值,因此这可能用于确定何时在正确的时间触发警报。我猜你的问题实际上出在 AlarmManager 某处,要么在 set() 方法中,要么在正确时间实际触发警报的方法中。
  • 我建议将 [java] 标签更改为 [android] 以引起 Android 开发者的注意。
  • @britishmutt - 你是对的。似乎当我调用 set() 方法时,它取消了先前的意图。我怎样才能避免这个问题?

标签: java android notifications alarm


【解决方案1】:

来自documentation

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

【讨论】:

    【解决方案2】:

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

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

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

    calendar.setTimeInMillis(System.currentTimeMillis());
    

    【讨论】:

    • 好吧,我不确定为什么这个问题会影响以分钟或小时为单位的警报。感谢您对冗余的提醒。我认为每次运行“setAlarm”时,alarmManager 都会以某种方式重置。
    【解决方案3】:

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

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

    谢谢各位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多