Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 启动_已完成并已从AlarmManager执行警报_Java_Android_Android Intent - Fatal编程技术网

Java 启动_已完成并已从AlarmManager执行警报

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的重复警报,每天早上7点触发。根据文档,有一种称为跳过警报的东西,一旦看到它落后于计划,它就会立即执行

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日警报。您的逻辑保持不变,因此校准集将来自首选项,当任何警报触发时,它将保存当前日历。