Java 启动_已完成并已从AlarmManager执行警报
我有一个来自AlarmManager的重复警报,每天早上7点触发。根据文档,有一种称为跳过警报的东西,一旦看到它落后于计划,它就会立即执行Java 启动_已完成并已从AlarmManager执行警报,java,android,android-intent,Java,Android,Android Intent,我有一个来自AlarmManager的重复警报,每天早上7点触发。根据文档,有一种称为跳过警报的东西,一旦看到它落后于计划,它就会立即执行 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 我有一个完整的启动接收器,可以启动我的alarmS
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
pendingIntent);
我有一个完整的启动接收器,可以启动我的alarmService,主要问题是在早上7:00(因为会执行报警)之后,设备会在早上9:00或早上7:00以后的任何时间重新启动,第二次触发报警。尽管alarm manager正在做它应该做的事情,但是,这并不是我所期望的
一种可能的解决方案是将最后一天的执行保存到首选项中,并在触发报警通知之前进行检查
克服这种模式的可能途径是什么?虽然我建议,但我不认为,这是标准的黑客攻击,我很确定,你们中的大多数人都面临过类似的问题 您可以使用Calendar.compare方法检查时间是否已过,然后您可以启动服务。您可以尝试以下操作: 代码:
Calendar current = Calendar.getInstance();
Calendar calSet = Calendar.getInstance();
calSet.set(Calendar.HOUR_OF_DAY, 7);
calSet.set(Calendar.MINUTE, 0);
calSet.set(Calendar.SECOND, 0);
if(calSet.compareTo(current) <= 0){
//If time passed add for tomo
calSet.add(Calendar.DATE, 1);
}
setAlarm(calSet);
}};
private void setAlarm(Calendar cal){
Intent intent = new Intent(getBaseContext(), CustomReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 1, intent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
pendingIntent);
}
Calendar current=Calendar.getInstance();
Calendar calSet=Calendar.getInstance();
calSet.set(日历小时/天,7);
calSet.set(日历分钟,0);
calSet.set(日历秒,0);
如果(calSet.compareTo)(当前)此链接可能会帮助您
那边有一个小问题,警报将错过通知。如果任何时候设备全天关闭,晚上9:00打开。因此,更好的解决方案是,添加您的宝贵建议,将上次执行的日历时间保存到首选项,并将其与当前时间进行比较。因此,如果上次执行的是昨天11月11日上午13:00,设备在11月14日晚上9:00打开。将不会跳过11月14日警报。您的逻辑保持不变,因此校准集将来自首选项,当任何警报触发时,它将保存当前日历。