0

我正在创建一个具有闹钟功能的时钟应用程序。时间显示正确,我也正确设置了多个警报。

我正在使用不同的 id 创建多个警报,并将其保存到数据库中,以便我可以在列表视图中查看警报列表。现在我正在尝试为我的闹钟设置 ON 和 OFF 功能。我那里有问题。

在 itemclick 上,如果警报打开,它会在以下帮助下关闭:

    Intent intent = new Intent(Main.this,TaskRecieverForAlarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(Main.this,  Integer.parseInt(cont[0]), intent, 0);
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.cancel(pi);

上面的代码很好地取消了警报。

要打开我正在使用的警报:

Intent intent = new Intent(Main.this, TaskRecieverForAlarm.class);
intent.putExtra("AlarmDate", cont[1]);
intent.putExtra("key", Integer.parseInt(cont[0]));
PendingIntent sender = PendingIntent.getBroadcast(Main.this, Integer.parseInt(cont[0]) , intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);

if(type.equalsIgnoreCase("daily"))
{
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1440*60000 ,sender);
 }
 else if(type.equalsIgnoreCase("weekly"))
{ 
  am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);                 am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 7*1440*60000 ,sender);
 }

现在,只要我单击 OFF 到 ON,警报就会触发并调用 TASKReceiverFORAlarm(广播接收器),即使警报时间距当前时间还有 4 或 5 小时。我不确定我哪里出错了?

有人可以帮帮我吗?

谢谢!

4

1 回答 1

0

我想我在这里找到了答案:

public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)

Added in API level 1
Schedule a repeating alarm. Note: for timing operations (ticks, timeouts, etc) it is easier and much more efficient to use Handler. If there is already an alarm scheduled for the same IntentSender, it will first be canceled.

Like set(int, long, PendingIntent), except you can also supply a rate at which the alarm will repeat. This alarm continues repeating until explicitly removed with cancel(PendingIntent). If the time occurs in the past, the alarm will be triggered immediately, with an alarm count depending on how far in the past the trigger time is relative to the repeat interval.

If an alarm is delayed (by system sleep, for example, for non _WAKEUP alarm types), a skipped repeat will be delivered as soon as possible. After that, future alarms will be delivered according to the original schedule; they do not drift over time. For example, if you have set a recurring alarm for the top of every hour but the phone was asleep from 7:45 until 8:45, an alarm will be sent as soon as the phone awakens, then the next alarm will be sent at 9:00.

If your application wants to allow the delivery times to drift in order to guarantee that at least a certain time interval always elapses between alarms, then the approach to take is to use one-time alarms, scheduling the next one yourself when handling each alarm delivery.

Parameters
type    One of ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP}, RTC or RTC_WAKEUP.
triggerAtMillis time in milliseconds that the alarm should first go off, using the appropriate clock (depending on the alarm type).
intervalMillis  interval in milliseconds between subsequent repeats of the alarm.
operation   Action to perform when the alarm goes off; typically comes from IntentSender.getBroadcast().

您使用该功能的方式是:

am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1440*60000 ,sender);

试试这个:

//The only variable here is the desired hour of the alarm, which
// has to be obtained in milliseconds
long alarmSetAt = // The hour of the Alarm for the current date in milliseconds
long time = cal.getTimeInMillis() - alarmSetAt;

if(time > 0){

  time = -time + cal.getTimeInMillis();
}
else{
  time = time + cal.getTimeInMillis() + 1440*60000;
}

am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1440*60000 ,sender);
于 2013-07-12T12:10:55.087 回答