【发布时间】:2014-12-15 05:51:10
【问题描述】:
我试图通过在广播中收到它的那一刻手动将闹钟设置为第二天,以精确的方式设置重复闹钟。但是,我可能会遗漏一些东西,并且不知何故它不起作用。 逻辑:
- 当我从时间选择器中选择时间时,我会为给定的时间设置一个准确的警报,并启动一个挂起的 Intent,它在时间到时调用 MyBroadCastReceiver.java(扩展 BroadcastReceiver)。然后,我将带有另一个待处理意图的意图转发给 AlarmFireActivity。 (AlarmFireActivity 也有 snooze,它只是将一个 pendingIntent 设置为自身,在 5 分钟后触发。)
- MyBroadCastReceiver 组件因此只接收实际的警报(而不是贪睡)。它的功能是: a) 获取非重复的未决意图取消它,然后从该意图创建另一个未决意图,然后将其设置为同时设置为第二天的毫秒。 b) 启动 AlarmFireActivity 并显示警报。
在 AddAlarmActivity
Intent intent = new Intent(context, MyBroadcastReceiver.class);
intent.putExtra(DBHelper.COLUMN_ID,alarm.getId());
AlarmManager alarmManager = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, reminder.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, reminder.getHourOfDay());
calendar.set(Calendar.MINUTE, reminder.getMinuteOfHour());
calendar.set(Calendar.SECOND,0);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
pendingIntent);
BLog("Pending intent added at " + new SimpleDateFormat(utilFunctions.timeFormat).format(calendar.getTime()));
}
Snippet MyBroadCastReceiver.java TaskOne
逻辑
获取 MyBroadCastReceiver 接收的意图。在新的 PendingIntent 集中重复使用相同的 Intent 设置为下一天的同一时间。
代码
AlarmManager alarmManager = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
PendingIntent p1 = PendingIntent.getBroadcast(context, alarmCurrent.getReminderId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
if(p1!=null){
alarmManager.cancel(p1);
}
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, alarmCurrent.getReminderId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
//for test
calendar.add(Calendar.MINUTE,1);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
pendingIntent1);
}
MyBroadCastReceiver.java TaskTwo
逻辑
如果设置警报的时间晚于警报到期时间,则不要将待处理的 Intent 转发到 AlarmFireActivity。 否则将其转发到 AlarmFireActivity,它会显示关闭/暂停警报的屏幕。
代码
Calendar timeSet = alarmCurrent.getAlarmReminderSetTime();
Calendar alarmTime = Calendar.getInstance();
if(timeSet!=null && alarmTime.getTimeInMillis() > timeSet.getTimeInMillis()){
Intent intent1 = new Intent(context, AlarmFireActivity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtra(DBHelper.COLUMN_ID,id);
String ext = extras.getString(DBHelper.TASK_TITLE);
if(ext!=null){
intent1.putExtra(DBHelper.TASK_TITLE,ext);
}
context.startActivity(intent1);
}else{
}
BroadCastReceiver 正在完成第二个任务。但是,不是任务一。它不会重复/重置新的待处理意图。我猜我一定在某处搞砸了意图/pendingIntent。我不知道是哪个。请帮忙/
【问题讨论】:
-
为什么不用alarmManager.setRepeating(...) 而不是每次都设置一个闹钟?
-
是的。但是可以在这里看到developer.android.com/reference/android/app/AlarmManager.html .SetRepeating 默认情况下是 inExact ,这意味着它不会在一分钟的第二个 0 处触发。但在 40 左右。并不理想。
-
请在此处粘贴您如何在广播接收器中创建意图。还请使用 SimpleDateFormat 注销 (BLog) 日历时间。请注意,如果您在设置后再次使用它,则不必取消它。它将自动更新。
-
@Blehi:感谢您的关注。它现在可以工作了。
标签: android android-intent android-pendingintent