AlarmManager定时不准确
【AlarmManager定时不准确】今天用AlarmManager做定时功能期间,粗心大意之下, 踩了个坑,在此记录一下,提醒自己的同时希望能帮到其他小伙伴。首先申明一下,本文所要讲的时间不准确问题不是系统省电模式引起的问题,至于本人解决省电导致的定时时间不准确的方案,在此就不加以复述,为啥?因为我是做系统开发,不用考虑省电,并且我懒,直接改底层,大部分小伙伴们采用不了!
主要表现就是:明明自己定好了一定时间后的pendingIntent,但到了自认为的时间后,并没有被触发。
AlarmManger主要提供了5个设置定时功能的方法:
set(int type, long triggerAtMillis, PendingIntent operation);
setRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation);
setInexactRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation);
setExact(int type, long triggerAtMillis, PendingIntent operation);
setWindow(int type, long triggerAtMillis, long windowLengthMillis,PendingIntent operation);
注意啦,这五个API的前两个参数都是type和triggerAtMillis,而关键的坑就在这里,type一共有四种类型,如下:
AlarmManager.ELAPSED_REALTIME; //相对时间!设备睡眠状态下不可用。 AlarmManager.ELAPSED_REALTIME_WAKEUP; //相对时间!设备睡眠状态下可用。 AlarmManager.RTC_WAKEUP; //绝对时间!设备睡眠状态下不可用。 AlarmManager.RTC; //绝对时间!设备睡眠状态下不可用。 看到注解没,相对时间和绝对时间!对,问题就在这里!千万注意,如果是相对时间,那么计算triggerAtMillis就需要使用SystemClock.elapsedRealtime();如果是绝对时间,那么计算triggerAtMillis时使用System.currentTimeMillis()或者calendar.getTimeInMillis()。
如果没讲明白的话,举个例子,当前时间是08:00,需要设定一个5小时后执行的操作:在type为相对时间,triggerAtMillis=SystemClock.elapsedRealtime()+5*60*60*1000;在type为绝对时间, triggerAtMillis=System.currentTimeMillis()+5*60*60*1000。
最后解释一下相对时间和绝对时间:
相对时间——设备boot后到当前经历的时间,SystemClock.elapsedRealtime()获取到的是相对时间。
绝对时间——1970年1月1日到当前经历的时间,System.currentTimeMillis()和Calendar.getTimeInMillis()获取到的都是绝对时间。
推荐阅读
- linux定时任务contab
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- STM32F4|STM32F4 TIM6 TIM7 基本定时器
- 无聊时
- 20180305|20180305 小确幸
- 闭包-定时器-BOM
- Scrapy定时爬虫总结&Docker/K8s部署
- js生成固定时间间隔的时间值-每秒递增-分钟递增-分小时递增
- 全志A33开发板Linux内核定时器编程
- javascript|javascript--21--定时器