我需要设置每周重复一次的多个警报,以在用户上某堂课(这是一个学术应用程序)时自动使手机振动,然后在上课结束后重置音量.
我已经创建了警报,但是如果用户禁用了此功能,则必须有一种停用所有警报的方法.我也知道我必须通过向AlarmManager.cancel()方法传递和意图使用相同的参数来执行此操作,但是这里的问题是:
用户可以取消课程并注册课程(但不能直接在应用程序中注册),并且该信息已更新并反映在数据库中,仅保留当前课程.因此,如果我对不再存在的类设置了警报,那么如果我无法复制PendingIntent,该如何取消它?
我在这里看到的一个解决方案是创建一个db表来跟踪当前警报,然后对它们进行完全控制,另一种方法是在更新类列表时取消并重置所有警报,但是这样做很公平.时间,第三个但不太友好的选择是简单地等待用户启动电话,并且在重置警报时,只需设置我需要的警报即可(如果我在此启动行为上有误,请更正).我应该尝试第四种选择吗?如果足够好,可以选择其中一种?
解决方法:
首先,您不需要设置多个警报.只需设置NEXT警报,然后在该警报触发时,设置新的下一个警报.如果重新启动电话,丢失的警报也会很容易再次设置,因为您只需要考虑一个警报.
我使用这个小例程来设置警报. 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);
}
}