具有不同时序的Android-Multiple Alarms会在错误的时间触发

时间:2015-10-09 10:59:41

标签: android android-intent alarmmanager android-alarms repeatingalarm

我的应用程序中有四个Repeating Alarms,每个24 hrs在不同的时间点击以执行一些重要任务。 他们是

  1. 闹钟1 - 12:30 AM
  2. 闹钟2 - 01:00 AM
  3. 闹钟3 - 06:00 AM
  4. 闹钟4 - 12:15 PM
  5. 每个警报都没有问题。每个警报的时间间隔为Alarm Set Time Actual Firing Time Alarm 1 12:30 AM 06:31 AM Alarm 2 01:00 AM 06:01 AM Alarm 3 06:00 AM 06:01 AM Alarm 4 12:15 PM Still not fired 4 hours after that time。但是每个人都在随机时间开火。

    Intent myIntent=new Intent(MainPage.this,db_restore.class); PendingIntent pi=PendingIntent.getBroadcast(MainPage.this,1,myIntent,0); AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, 1); calendar.set(Calendar.HOUR_OF_DAY, 12); calendar.set(Calendar.MINUTE, 30); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.AM_PM,Calendar.AM); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),1000*60*60*24,pi);

    我的代码是

    警报1

    Intent mor_flag=new Intent(MainPage.this,MorningFlag.class);
    
    PendingIntent mor_intent=PendingIntent.getBroadcast(MainPage.this,3,mor_flag,0);
    
    AlarmManager mor_alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
    
    Calendar calendar=Calendar.getInstance();
    
    calendar.add(Calendar.DATE, 1);
    calendar.set(Calendar.HOUR_OF_DAY, 1);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND,0);
    calendar.set(Calendar.AM_PM,Calendar.AM);
    
    mor_alarm.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),1000*60*60*24,mor_intent);
    

    警报2

    Intent late_start1=new Intent(MainPage.this,late_start.class);
    
    PendingIntent piLate=PendingIntent.getBroadcast(MainPage.this,2,late_start1,0);
    
    AlarmManager alarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
    
    Calendar calendar=Calendar.getInstance();
    
    calendar.add(Calendar.DATE, 1);
    calendar.set(Calendar.HOUR_OF_DAY, 6);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND,0);
    calendar.set(Calendar.AM_PM,Calendar.AM);
    
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000*60*60*24, piLate);
    
    Toast.makeText(MainPage.this,"Alarm Service started for Late Start monitoring",Toast.LENGTH_LONG).show();
    

    警报3

    Intent eve_flag=new Intent(MainPage.this,EveningFlag.class);
    
    PendingIntent eve_intent=PendingIntent.getBroadcast(MainPage.this,4,eve_flag,0);
    
    AlarmManager eve_alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
    
    Calendar calendar=Calendar.getInstance();
    
    calendar.add(Calendar.DATE, 1);
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 12);
    calendar.set(Calendar.MINUTE, 15);
    calendar.set(Calendar.SECOND,0);
    calendar.set(Calendar.AM_PM, Calendar.PM);
    
    eve_alarm.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),1000*60*60*24,eve_intent);
    

    警报4

    API Level 19

    我不知道自己做错了什么。请看看并帮助我。感谢。

    注意:我在Android 4.4.4 private void btnPrint_Click(object sender, EventArgs e) { PrintDialog.Document.PrintPage += (pSender, pE) => PrintEvent(pSender, pE, PrintInfo); PrintDialog.Document.Print(); } 中检查此内容,最低为14。

2 个答案:

答案 0 :(得分:1)

尝试使用AlarmManager.setExact()并为this post

提供一些代表
  

对于低于19的api级别,您应该使用AlarmManager.setRepeating(),并且您的警报将在指定时间准确触发。在api级别19及以上,这将不再有效。 android中有变化,所有重复警报都是不准确的。因此,如果您想要实现精确的重复警报,您应该使用AlarmManager.setExact()安排警报,然后在下周警报触发时再进行警报,依此类推。

答案 1 :(得分:1)

来自API DOCS(https://developer.android.com/training/scheduling/alarms.html

从Android 4.4(API级别19)开始,所有重复警报都不准确。这意味着Android会同步来自多个应用的​​重复警报并同时触发它们。

因此,如果您想要一个确切的闹钟,请使用闹钟管理器

setExact (int type, long triggerAtMillis, PendingIntent operation)

方法。 如果你想要精确计时重复报警,那么你必须写一个逻辑,你将设置一个警报(不是一个重复的警报),当这个警报响起时,为下一个间隔设置另一个警报。

相关问题