Android闹钟管理器工作,但延迟

13

我想为用户添加一个延迟时间(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秒!

我的错误在哪里?


在调用 am.set(...) 时,尝试使用 AlarmManager.RTC_WAKEUP 作为闹钟类型。 - Squonk
嘿,我的回答有帮到你吗?解决了问题吗? - Assaf Gamliel
不,现在我正在使用TimerTask。 - S.M_Emamian
2个回答

24

如你所见 此处:

从API 19开始,传递给此方法的触发时间将被视为不精确:警报将在此时间之前不会发送,但可能会被延迟并稍后发送。操作系统将使用此策略来跨整个系统“批处理”闹钟,最小化设备需要“唤醒”的次数并最小化电池使用。通常,计划在不久的将来的闹钟不会被推迟,就像计划在将来较远的闹钟一样。

通过新的批处理策略,交付顺序保证不像以前那么强。如果应用程序设置了多个闹钟,则这些闹钟的实际交付顺序可能与其请求的交付时间顺序不符。如果您的应用程序具有强制排序要求,则可以使用其他API来获得必要的行为;请参见 setWindow(int,long,long,PendingIntent)和 setExact(int,long,PendingIntent)。

目标sdk版本低于API 19的应用程序将继续获得先前的闹钟行为:它们所有预定的闹钟都将被视为精确。

如果闹钟非常重要,请使用setExact(当设备的SDK为19或以上时)。


首先,感谢您!它按预期工作。作为一个中级开发人员,我对Android有些不理解。当我或任何开发人员想要设置闹钟时,“显然”我希望闹钟是“精确”的,而不是像设置闹钟后2分钟才响起。还有一些其他关于Android的事情,这些事情有时会让我感到困惑。 - Alex
嘿@Alex,Android上设置闹钟会导致它“唤醒”您的进程并获得CPU时间和电池电量,这促使Android开发团队决定更改set的默认实现为“批处理”,这意味着如果某些东西唤醒设备并且CPU已经在执行其他任务,则“让我们做所有其他接近当前时间的闹钟”。我同意这不是最好的方法(“破坏”API),但我想他们觉得他们必须这样做来节省电池电量(很多用户都在抱怨)。 - Assaf Gamliel
谢谢!我升级到新的目标API后,一直无法弄清楚延迟问题。现在我明白了。 - AdeelMufti
这是我在 Android 中见过的最愚蠢的事情。他们至少应该提供一个标志,让你可以设置以启用精确交付时间或优先级或其他什么东西。当事情不能按照预期工作并且被延迟时,“节省电池”有什么意义呢?完全愚蠢。 - sudoExclaimationExclaimation
1
完全同意@PranoyC,我正在处理VOIP来电。如果有延迟,那还有什么意义呢?看起来很糟糕。我收到通知说有来电,然后将其传递给alarmmanager进行广播,然后显示UI,但是alarmamanger需要5秒钟的延迟才能广播它。 - Alex

5

使用setExact()是让系统在指定的时间延迟后发出警报的最简单方法,示例代码如下。

am.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + (time_you_want_to_delay_in_milliseconds) ,pi);

我已经检查过了,在我的情况下它的工作方式与设置相同。我安排了一个1秒延迟的闹钟,但是它在5秒后才被触发... - LLL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接