gpt4 book ai didi

Android AlarmManager setExact() 不准确

转载 作者:IT王子 更新时间:2023-10-28 23:34:35 26 4
gpt4 key购买 nike

我需要每 10 分钟计划一次计划任务。

由于在 Lollipop 和更高版本中 setRepeating() 不准确,我使用 setExact() 并且(在触发警报时)我在 10 分钟内设置了新的准确警报。

private void setAlarm(long triggerTime, PendingIntent pendingIntent) {
int ALARM_TYPE = AlarmManager.ELAPSED_REALTIME_WAKEUP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(ALARM_TYPE, triggerTime, pendingIntent);
} else {
alarmManager.set(ALARM_TYPE, triggerTime, pendingIntent);
}
}

triggerTime是计算出来的SystemClock.elapsedRealtime() + 600_000;

当警报响起时,我首先计划一个新的,然后才运行我计划的任务。

setAlarm();
mySheduledTask;

我的 list 中确实有 WAKE_LOCK 权限。

当我在 Android 4 上进行测试时,它运行良好(偏差可能是 12-15 毫秒)。

但是当我在小米红米 Note 3 Pro (5.1.1) 上运行应用程序时 - 偏差可能高达 15 秒!

例如,我在日志文件中看到:第一次运行是在 1467119934477(RTC 时间),第二次运行是在 1467120541683。差异是 607_206 毫秒,而不是 600_000 ,正如它所计划的那样!

我错过了什么?什么是模拟系统警报行为的方法(这是可以描述我的策略的最接近的用例)?

PS. 我将 IntentService 用于 PendingIntent = PendingIntent.getService(context, 0, myIntent, 0);

最佳答案

操作系统会根据您指定的时间来选择警报的工作方式。因此,当手机进入“半 sleep ”模式时,它不需要在您希望的时间使用资源。基本上,它会等待操作系统为其打开的“窗口”,然后才会运行您要运行的警报,这就是您遇到时间间隔的原因。

这是在 Marshmallow OS 上引入的,并将继续在 Nougat OS 上继续,作为 Google 尝试改进设备电池的一部分。

事情是这样的,你有两个选择:

  1. 接受时间延迟(但可以考虑使用更推荐的 JobScheduler,这样可以节省电池电量)。
  2. 使用 setExactAndAllowWhileIdle这可能会导致您的电池问题(请谨慎使用,过多的警报对您的电池不利)。此方法不会重复,因此您必须声明要在 pendingIntent 打开的服务上运行的下一个作业。

如果您选择选项 2,请从这里开始:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
int ALARM_TYPE = AlarmManager.RTC_WAKEUP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
am.setExactAndAllowWhileIdle(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
am.setExact(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);
else
am.set(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);

关于Android AlarmManager setExact() 不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38094420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com