Android 多个警报,很少工作,很少不工作

Android 多个警报,很少工作,很少不工作,android,alarmmanager,android-pendingintent,Android,Alarmmanager,Android Pendingintent,陷入了一个问题 报警管理器 我开发了一种方法,将两个报警添加到AlarmManager数组中。下面给出的方法只需点击一次按钮,即可在AlarmManager数组中添加多达10个报警 我的方法代码如下所示 public void stupidAlarm() { stupidPendingIntentOne = PendingIntent.getBroadcast(context, listItemClickedPosition, stupidIntentOne, PendingInte

陷入了一个问题

报警管理器

我开发了一种方法,将两个报警添加到
AlarmManager数组中。下面给出的方法只需点击一次按钮,即可在
AlarmManager数组中添加多达10个报警

我的方法代码如下所示

public void stupidAlarm()
{

    stupidPendingIntentOne  = PendingIntent.getBroadcast(context, listItemClickedPosition, stupidIntentOne, PendingIntent.FLAG_UPDATE_CURRENT);
    stupidPendingIntentTwo  = PendingIntent.getBroadcast(context, listItemClickedPosition+5, stupidIntentTwo, PendingIntent.FLAG_UPDATE_CURRENT);


    stupidAlarm[listItemClickedPosition]= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    stupidAlarm[listItemClickedPosition+5]= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    alarmOneTime    = settings.getString(AlarmOneTime, null);
    alarmTwoTime    = settings.getString(AlarmTwoTime, null);

    try
    {
        OneHr   = Integer.parseInt(muteTime.substring(0, 2));
        OneMin = Integer.parseInt(muteTime.substring(2, 4));
        TwoHr   = Integer.parseInt(ringerTime.substring(0, 2));
        TwoMin = Integer.parseInt(ringerTime.substring(2, 4));
    }
    catch(Exception ex)
    {
        Toast.makeText(context, ex.getMessage(), Toast.LENGTH_SHORT).show();
    }

    stupidCalOne.set(2015, Calendar.MAY, 2);
    stupidCalOne.set(Calendar.HOUR_OF_DAY, OneHr);
    stupidCalOne.set(Calendar.MINUTE, OneMin);
    stupidCalOne.set(Calendar.SECOND, 0);
    stupidCalOne.set(Calendar.MILLISECOND, 0);

    stupidCalTwo.set(2015, Calendar.MAY, 2);
    stupidCalTwo.set(Calendar.HOUR_OF_DAY, TwoHr);
    stupidCalTwo.set(Calendar.MINUTE, TwoMin);
    stupidCalTwo.set(Calendar.SECOND, 0);
    stupidCalTwo.set(Calendar.MILLISECOND, 0);



    stupidAlarm[listItemClickedPosition].set(AlarmManager.RTC_WAKEUP, stupidCalOne.getTimeInMillis(), stupidPendingIntentOne);
    stupidAlarm[listItemClickedPosition+5].set(AlarmManager.RTC_WAKEUP, stupidCalTwo.getTimeInMillis(), stupidPendingIntentTwo);
}
但问题是,10个警报中有一些是有效的,而有些不是! 在这种情况下,以下信息可能会有所帮助

  • AlarmOne 1047小时有效
  • 报警两个1048Hrs工作
  • 警报三个1049小时不工作
  • AlarmFour 1050小时工作两次
  • 报警五1051小时不工作
  • AlarmSix 1052小时不工作
  • AlarmSeven 1053HS工作三次
  • AlarmEight 1054hs工作正常
  • AlarmNine 1055小时不工作
  • 报警1056小时工作两次
  • 我的日历、意图、悬而未决和警报管理声明

    //for stupid alarm
    public Calendar stupidCalOne;
    public Calendar stupidCalTwo;
    public Intent stupidIntentOne;
    public Intent stupidIntentTwo;
    public PendingIntent stupidPendingIntentOne;
    public PendingIntent stupidPendingIntentTwo;
    public AlarmManager[] stupidAlarm;
    
    我在onCreate方法中的作业

    //for stupid alarm
        stupidCalOne        = new GregorianCalendar();
        stupidCalTwo        = new GregorianCalendar();
        stupidIntentOne     = new Intent(context, OneAlarmReceiver.class);
        stupidIntentTwo     = new Intent(context, TwoAlarmReceiver.class);
        stupidAlarm         = new AlarmManager[10];
    

    非常感谢您的帮助,请提前感谢操作系统允许批量报警

    州政府的文件:

    注意:从API 19开始,传递给此方法的触发时间被视为不精确:在此时间之前不会发出警报,但可能会延迟并在一段时间后发出。操作系统将使用此策略,以便在整个系统中一起“批量”报警,最大限度地减少设备需要“唤醒”的次数,并最大限度地减少电池的使用。一般来说,只要警报安排在遥远的将来,在不久的将来安排的警报不会延迟

    这就是为什么有些时候会被跳过,然后在一分钟后发出另一个警报

    我怀疑它们之间的距离越远,系统对它们进行批处理的可能性就越小,但你仍然无法保证使用此功能的报警时间

    它继续说:

    在新的批处理策略下,交货订单保证不像以前那样强大。如果应用程序设置了多个警报,则这些警报的实际交付顺序可能与其请求的交付时间顺序不匹配。如果您的应用程序有很强的排序需求,那么您可以使用其他API来获得必要的行为;请参见设置窗口(int,long,long,pendingent)和设置精确窗口(int,long,pendingent)

    所以使用or。但请注意,
    setExact

    注意:只有对准确时间交付有强烈需求的报警(如在请求的时间闹钟响)才应按准确时间安排。强烈建议应用程序不要不必要地使用精确警报,因为它们会降低操作系统最小化电池使用的能力


    你提到的我错过的部分,非常感谢。它工作得很好。想要升级投票,但由于声誉限制而无法升级。