【问题标题】:Multiple Alarms, Few Works and Few does not多个警报,很少工作,很少没有
【发布时间】:2015-05-02 06:25:16
【问题描述】:

陷入与

的问题

报警管理器

我开发了一种将两个警报添加到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 1047 小时有效
  2. AlarmTwo 1048 小时有效
  3. AlarmThree 1049Hrs 不起作用
  4. AlarmFour 1050Hrs 工作两次
  5. AlarmFive 1051Hrs 不起作用
  6. AlarmSix 1052Hrs 不起作用
  7. AlarmSeven 1053Hrs 工作三次
  8. AlarmEight 1054 小时有效
  9. AlarmNine 1055Hrs 不起作用
  10. AlarmTen 1056Hrs 工作两次

我对 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];

任何帮助将不胜感激,在此先感谢

【问题讨论】:

    标签: android alarmmanager android-pendingintent


    【解决方案1】:

    操作系统允许批量报警。

    AlarmManager.set 状态的文档:

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

    这就是为什么会跳过一些时间,然后在一分钟后触发另一个警报。

    我怀疑它们之间的距离越远,系统对它们进行批处理的可能性就越小,但你仍然不能保证闹钟时间。

    继续:

    使用新的批量政策,交货订购保证不像以前那么强大。如果应用程序设置了多个警报,则这些警报的实际交货顺序可能与其请求的交货时间顺序不匹配。如果您的应用程序有严格的排序要求,那么您可以使用其他 API 来获得必要的行为;参见 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。

    所以使用setWindowsetExact。但请注意setExact:

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

    【讨论】:

    • 我错过了你提到的部分,非常感谢。它工作得很好。想要投票,但由于声誉限制而无法投票。
    猜你喜欢
    • 2021-06-30
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多