Android Alarm Manager工作,但延迟了

S.M*_*ian 9 android alarmmanager

我想为用户做一个延迟(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); 
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但我的报警经理有延迟.例如:

setAlarm(.....,int 10);
Run Code Online (Sandbox Code Playgroud)

它有一个延迟:00:10:03秒或00:10:10 00秒:10:20秒!

我哪里错了?

Ass*_*iel 21

正如你在这里看到的:

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

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

targetSdkVersion在API 19之前的应用程序将继续获得先前的警报行为:所有计划的警报将被视为准确.

如果警报非常重要,请使用setExact(当设备的SDK为19或更高时).


小智 5

使系统有延迟然后在确切指定时间发出警报的最简单方法是使用 setExact(),代码可以是这样的。

am.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + (time_you_want_to_delay_in_milliseconds) ,pi);
Run Code Online (Sandbox Code Playgroud)