遇到了
的问题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个警报创建了一些作品而有些则没有! 以下信息在此上下文中可能会有所帮助
我的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];
任何帮助都将受到高度赞赏,提前感谢
答案 0 :(得分:1)
允许操作系统批量警报。
AlarmManager.set州的文档:
注意:从API 19开始,传递给此方法的触发时间被视为不精确:警报将不会在此时间之前传递,但可能会延迟并在稍后传递。操作系统将使用此策略以便批量处理"在整个系统中一起报警,最大限度地减少设备需要“唤醒”的次数。并尽量减少电池使用。一般而言,只要将来安排的警报很长,就不会推迟在不久的将来安排的警报。
这就是为什么有些时候会跳过,然后在一分钟之后再发出一声警报。
我怀疑它们越远,系统批处理的可能性就越小,但你仍然无法保证报警时间。
继续:
使用新的批处理政策,交付订单保证不像以前那么强大。如果应用程序设置了多个警报,则这些警报可能会发出警报。实际交货订单可能与其请求的交货时间顺序不符。如果您的应用程序具有强大的订购要求,则可以使用其他API来获取必要的行为;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。
因此请使用setWindow
或setExact
。但请注意setExact
:
注意:只有对确切时间交付有强烈需求的警报(例如在请求的时间响铃的闹钟)才应安排准确。强烈建议不要使用精确报警,因为它们会降低操作系统最大限度地减少电池使用的能力。