多个警报,几个工作,几个没有

时间:2015-05-02 06:25:16

标签: android alarmmanager android-pendingintent

遇到了

的问题
  

AlarmManager

我开发了一种方法,可以在AlarmManager Array中添加两个警报。下面给出的方法是按下按钮,每次点击AlarmManager Array两次就会增加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个警报创建了一些作品而有些则没有! 以下信息在此上下文中可能会有所帮助

  1. AlarmOne 1047Hrs正常工作
  2. AlarmTwo 1048Hrs工作
  3. AlarmThree 1049Hrs不起作用
  4. AlarmFour 1050Hrs工作两次
  5. AlarmFive 1051Hrs不起作用
  6. AlarmSix 1052Hrs不起作用
  7. AlarmSeven 1053Hrs三次工作
  8. AlarmEight 1054Hrs正常工作
  9. AlarmNine 1055Hrs不起作用
  10. AlarmTen 1056Hrs工作两次
  11. 我的Calendar,Intent,PendingIntent和AlarmManagerArray的声明

    //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];
    

    任何帮助都将受到高度赞赏,提前感谢

1 个答案:

答案 0 :(得分:1)

允许操作系统批量警报。

AlarmManager.set州的文档:

  

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

这就是为什么有些时候会跳过,然后在一分钟之后再发出一声警报。

我怀疑它们越远,系统批处理的可能性就越小,但你仍然无法保证报警时间。

继续:

  

使用新的批处理政策,交付订单保证不像以前那么强大。如果应用程序设置了多个警报,则这些警报可能会发出警报。实际交货订单可能与其请求的交货时间顺序不符。如果您的应用程序具有强大的订购要求,则可以使用其他API来获取必要的行为;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。

因此请使用setWindowsetExact。但请注意setExact

  

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