【发布时间】:2012-05-05 08:59:42
【问题描述】:
我正在尝试制作一个应用程序,它可以让我想起每天同一时间发生的事件。为此,我使用了一个 AlarmManager。
这是我注册事件的方式:
Intent alarmIntent = new Intent(getApplicationContext(), ReminderAlarm.class);
alarmIntent.putExtra("id_bundle", cursor.getInt(0));
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), cursor.getInt(0), alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
这就是我取消注册事件的方式:
Intent alarmIntent = new Intent(getApplicationContext(), ReminderAlarm.class);
alarmIntent.putExtra("id_bundle", id);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), id, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pendingIntent);
这是我编辑事件的方式:
Intent alarmIntent = new Intent(getApplicationContext(), ReminderAlarm.class);
alarmIntent.putExtra("id_bundle", id);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), id, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pendingIntent);
Intent alarmIntentNew = new Intent(getApplicationContext(), ReminderAlarm.class);
alarmIntentNew.putExtra("id_bundle", id);
PendingIntent pendingIntentNew = PendingIntent.getActivity(getApplicationContext(), id, alarmIntentNew, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntentNew);
我尝试使用间隔为 24*3600*1000 的 setRepeating 但这似乎不起作用,所以我决定在事件触发时取消注册并再次注册。我在警报触发后启动的 ReminderAlarm 活动中执行此操作。
此外,每当我启动应用程序时,我都会使用我发布的用于注册事件的代码块再次注册所有事件。我从数据库中提取有关哪些事件以及何时注册它们的数据。
我的问题是这也不起作用。当我将事件添加到时间 T+1 分钟时,它会正确触发。但是第二天就没有了。
可能是因为我给日历实例提供了错误的数据?我有一个很长的函数,它在事件触发之后和将此日历实例发送到 AlarmManager 实例之前设置日历实例。在这个函数中,我检查新月份、新年等内容并设置日历字段(年、月、day_of_month、hour_of_day、minute)。这甚至是必要的吗? calendar.getTimeInMillis() 是否考虑所有这些字段或仅考虑 hour_of_day 和 minute?你看到什么可能是错的吗?谢谢!
【问题讨论】:
-
ReminderAlarm.class 是 Service 还是 BroadcastReceiver 类?
-
它只是一个活动,我在 PendingIntent 中使用 getActivity,而不是 getBroadcast
-
如果你想每天重复这个警报,考虑实施相同的服务
标签: android alarmmanager android-pendingintent android-alarms