重新启用Android闹钟

时间:2014-04-16 05:46:22

标签: android alarmmanager android-alarms repeatingalarm alarms

我有一个可以由用户创建的警报,并且可以被用户禁用。 当用户禁用警报时,我只需使用AlarmManager取消警报并将警报时间存储在某处。

现在,当用户重新启用警报时,我会创建警报并将存储的时间设置为警报。问题是当我用存储的时间重新创建警报时,会立即调用onReceive()警报广播方法。

我将警报设置如下:

alarmManager.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY,
    PendingIntent.getBroadcast(
        this, alarmUniqueCode, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));

当用户点击禁用时,我如何禁用闹钟:

sender = PendingIntent.getBroadcast(this, 1, intent, 0);
alarmManager.cancel(sender);

我在清单文件中添加了警报接收器,如下所示:

<receiver
    android:name="com.sign.android.myscheduler.app.AlarmReceiver"
    android:enabled="true"
    android:exported="true" >
</receiver>

还有一个问题:当我禁用闹钟时,我会调用cancel方法。我是否还需要取消注册广播接收器?如果是,那么如果我有两个不同的警报呢?如何仅针对一个警报取消注册广播接收器?

1 个答案:

答案 0 :(得分:0)

对于您的问题,如果您在过去设置时间,将立即触发警报

来自AlarmManager API documentation

  

如果声明的触发时间是过去的,则会触发警报   立即,报警数量取决于过去的距离   触发时间相对于重复间隔。

在这种情况下,您必须先检查存储的时间是否过去。如果是,则必须添加间隔,直到将来为止。

尝试将代码更改为:

long now = new Date().getTime();
while (time < now) {
    time += AlarmManager.INTERVAL_DAY;
}
alarmManager.setRepeating(AlarmManager.RTC, time,
    AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(this,
    alarmUniqueCode, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));

关于你的第二个问题,我无法回答。然而,根据我的自我经验,即使我离开接收器,我也没有任何问题。