我想为用户延迟(10分钟),然后用户可以编辑某些内容。
要做到这一点,我创建了一个setAlarm
函数:
public void setAlarm(Context context,int user,int time) {
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, sef_time.class);
intent.putExtra(ONE_TIME, Boolean.FALSE);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.set(AlarmManager.RTC, 1000*60*time , pi);
}
一切正常,但我的闹钟管理员有延迟。 例如:
setAlarm(.....,int 10);
有延迟:00: 10 : 03 秒或00: 10 : 10 秒00 : 10 : 20 秒!
我哪里错了?
答案 0 :(得分:20)
正如您所见here:
从API 19开始,处理传递给此方法的触发时间 如不准确:闹钟将不会在此时间之前发送,但可能会 推迟一段时间后交付。操作系统将使用此策略 为了在整个系统中“批处理”警报, 最小化设备需要“唤醒”的次数和 减少电池使用。一般来说,警报安排在附近 只要警报安排在远期,将来不会推迟 将来
使用新的批处理政策,交货订单保证不是 他们以前很强大。如果应用程序设置多个 警报,这些警报的实际交付顺序可能是 不符合他们要求的交货时间的顺序。如果你的 应用程序具有强大的排序要求,还有其他API 你可以用来获得必要的行为;见setWindow(int,long, long,PendingIntent)和setExact(int,long,PendingIntent)。
targetSdkVersion在API 19之前的应用程序将继续 得到以前的警报行为:他们所有的预定警报都将是 确切地对待。
如果警报非常重要,请使用setExact(当设备的SDK为19或更高时)。
答案 1 :(得分:4)
使系统有一个延迟然后在确切的指定时间发出警报的最简单方法是使用setExact(),代码可以是这样的。
am.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + (time_you_want_to_delay_in_milliseconds) ,pi);