- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我需要每 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 尝试改进设备电池的一部分。
事情是这样的,你有两个选择:
JobScheduler
,这样可以节省电池电量)。 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/
我正在使用警报管理器和广播接收器设置通知。我尝试使用警报管理器的 setInexactRepeating 方法,但它不会在 API 19 以上的确切时间发出警报。 所以我得到了使用 setExact
setExact 方法不适用于我的项目 Log.d("Alarm","Fire"); AlarmManagerBroadcastReceiver 中的内容 1 分钟后未显示! public c
场景:生产线 worker 在特定时间间隔进行检查。在我的应用程序中,用户将此时间间隔输入到文本框中。有日期和时间选择器,以便用户可以选择进程何时开始。我试图在下一次检查到期前 5 分钟发出警报。 例
我正在使用警报管理器和广播接收器设置通知。我尝试使用警报管理器的 setInexactRepeating 方法,但它不会在 API 19 以上的确切时间发出警报。 所以我得到了使用 setExact
我试图在每天的特定时间触发一次警报。但与所有其他人一样,我使用的是 setExact() 而不是 setRepeating()。警报在正确的时间触发。但是一旦它触发,它就会每 5 秒重复一次。我怎样才
我有以下行 alarm.setExact(AlarmManager.RTC_WAKEUP,10000,pintent); 据我所知,我应该在 10 秒后收到从 AlarmManager 到我的广播接收
我计划在 5 秒内发送 pendingIntent,但它在 23 秒后开始。 API=19 (AlarmManager.setExact(...)): 10-23 16:43:44.638 1190
我需要每 10 分钟计划一次计划任务。 由于在 Lollipop 和更高版本中 setRepeating() 不准确,我使用 setExact() 并且(在触发警报时)我在 10 分钟内设置了新的准确
我在将来使用警报管理器触发待处理 Intent 时遇到问题。我已经研究了几个小时,但不明白我做错了什么。任何帮助将不胜感激。 这有效,立即发送广播: _context.startService(not
我正在尝试测试 Android 应用程序在操作系统进入打瞌睡模式时的行为。我正在使用运行 Android API 25 的 gennymotion 模拟器。应用程序使用 RTC_WAKEUP 类型的
我正在尝试使用 AlarmManager 为通知设置警报。警报是在用户选择列表项时设置的,因此我每次都尝试设置一个单独的警报(将唯一 ID 传递到 pendingIntent)选择一个列表项。 用于设
在我应该在指定时间触发警报的应用程序中,警报的目的是通过 Notification 通知用户,我对获得不精确的结果感到绝望。闹钟响了,但不是在指定的时间。当警报设置和它应该响起的时间之间的时间很长时,
我正在开发一款应每 60 秒执行一次特定任务的应用。由于 Android 4.4+ 中的警报存在一些准确性问题,其中所有警报都不准确,我选择了链接模型:BroadcastReceiver 触发第一个警
使用 Android 19+ setExact 与 WakefulBroadcastReceiver 结合使用有时不会按时触发(可能会延迟几秒左右)。我的意思是大多数时候都是这样。大概 50 次中有
这几天我一直在与 AlarmManager.setExact() 作斗争。我的应用程序需要准确的警报,并且可以在带有 AlarmManager.setRepeating() 的旧版 Android 上
来自 Optimizing for Doze and App Standby : Doze is particularly likely to affect activities that Alarm
我在我的代码中设置了一个在特定时间响起的闹钟。 警报机制在 SDK 回调在服务中运行一个方法(当警报应该触发时它仍然存在,注意它没有启动)。 这整个东西是一个在我的应用程序中使用的库,我在那里以相同
我是一名优秀的程序员,十分优秀!