4

我需要设置一些每周重复的警报,以便在用户上某个课程(这是一个学术应用程序)时自动将手机置于振动状态,然后在课程结束时重置音量。

我已经创建了警报,但如果用户禁用此功能,我必须有办法停用所有警报。我也知道我必须通过向 AlarmManager.cancel() 方法传递和意图相同的参数来做到这一点,但这里的问题是:

用户可以取消课程并注册课程(但不能直接在应用程序中),这会更新并反映在数据库中,只保留当前课程。因此,如果我为一个不再存在的类设置了警报,如果我无法复制 PendingIntent,我该如何取消它?

我在这里看到的一个解决方案是创建一个数据库表来跟踪当前警报,然后我可以完全控制它们,另一种方法是在更新类列表时取消并重置所有警报,但这样做需要公平时间,第三个但不太友好的选择是简单地等待用户启动手机,并在重置警报时设置我需要的警报(如果我在这个启动行为上错了,请纠正)。我是否应该尝试第四个选项,或者如果足够好,可以选择其中一个?

4

1 回答 1

4

首先,您不需要设置多个警报。只需设置下一个警报,然后当该警报触发时,设置新的下一个警报。这也使得在手机重新启动时警报丢失时再次设置警报变得容易,因为您只需要考虑一个警报。

我用这个小程序来设置我的闹钟。该Set参数的值决定了报警是设置还是取消。

public static void SetMyAlarm(Context c, long AlarmTime, Boolean Set) {
    Intent intent = new Intent(c, AlarmReceiver.class); // The broadcast receiver that will handle my alarm 

    int UniqueID =8192; // id for this specific alarm, use a different id for each separate alarm

    PendingIntent sender = PendingIntent.getBroadcast(c, UniqueID, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager am = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
    if (Set) {
        am.set(AlarmManager.RTC_WAKEUP, AlarmTime, sender);
    } else {
        am.cancel(sender);
    }
}
于 2012-05-02T14:31:48.983 回答