【问题标题】:Alarm Manager Firing Immediately after real time has been passed警报管理器在实时时间过后立即触发
【发布时间】:2016-04-27 20:06:50
【问题描述】:

我想设置和取消特定时间的闹钟。我正在使用以下代码使用 TimePicker 做同样的事情。

public void setRecurringAlarm(int randomTimer,long mills, int i){
        Intent intent = new Intent(CreateAlarmActivity.this, AlarmReceiver.class);
        intent.setData(Uri.parse("timer:" + i));
        PendingIntent pendingIntent = PendingIntent.getBroadcast(CreateAlarmActivity.this, 1253, intent, PendingIntent.FLAG_CANCEL_CURRENT|  Intent.FILL_IN_DATA);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarmManager.set(AlarmManager.RTC_WAKEUP,mills,
                pendingIntent);
        Toast.makeText(CreateAlarmActivity.this, "Alarm "+i+" isSet", Toast.LENGTH_LONG).show();
    }

注意:-假设我将闹钟设置为晚上 10:00。它在晚上 10:00 工作正常。但是当我再次运行相同的代码时(晚上 10 点之后),即一旦设置闹钟的时间过去了,我回忆起那个代码(重置闹钟),它立即开始运行。为什么会这样?我无法找到我错的地方。

【问题讨论】:

    标签: android alarmmanager android-pendingintent


    【解决方案1】:

    您可以检查闹钟时间是否早于当前时间。如果是这样,则将警报时间设置为第二天(如果您想至少发出一次警报,或者想设置重复警报)。

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, hour);
    cal.set(Calendar.MINUTE, minute);
    cal.set(Calendar.SECOND, 0);
    if (System.currentTimeMillis() > cal.getTimeInMillis()) {
        calendar.add(Calendar.DATE, 1);
    }
    
    alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
    

    【讨论】:

      【解决方案2】:
      public void scheduleAlarm() {
          // time at which alarm will be scheduled here alarm is scheduled at 1
          // day from current time,
          // we fetch the current time in milliseconds and added 1 day time
          // i.e. 24*60*60*1000= 86,400,000 milliseconds in a day
          // Long time = new GregorianCalendar().getTimeInMillis()+24*60*60*1000;
      
          Calendar cal = Calendar.getInstance();
      
          cal.add(Calendar.HOUR_OF_DAY, 20);
          cal.add(Calendar.MINUTE, 00);
          cal.add(Calendar.SECOND, 00);
      
          Intent intent = new Intent(CreateAlarmActivity.this, AlarmReceiver.class);
      
          // create the object
          AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
      
          // set the alarm for particular time
          alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                  PendingIntent.getBroadcast(this, 1, intentAlarm,
                          PendingIntent.FLAG_UPDATE_CURRENT));
          Toast.makeText(this, "Alarm Scheduled ", Toast.LENGTH_LONG)
                  .show();
      
      
      
      }
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        两件事:

        1. 如果您通过使用 mills 参数的相同值调用 setRecurringAlarm(randomTimer, mills, i) 来“调用该代码”,则警报的时间将是过去的时间,它将立即触发(如果您计划过去触发时间的警报,警报立即触发)。

        2. 请从对PendingIntent.getBroadcast() 的调用中删除| Intent.FILL_IN_DATA。它不属于那里,因为此参数应仅包含 PendingIntent 标志,并且可能会造成一些损害。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多