今天用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()获取到的都是绝对时间。

AlarmManager定时不准确相关推荐

  1. android alarmmanager 收不到广播,关于安卓AlarmManager定时会失效的问题,请指点

    网上查了N多资料,基本都是讲解AlarmManager要怎么用,但基本没怎么说什么情况会失效或被安卓系统杀掉.都说AlarmManager是系统级的服务,手机睡眠后都能唤醒CPU执行.但本人测试在手机 ...

  2. 使用AlarmManager定时更换壁纸

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 更换壁纸要用到WallpaperManager,它提供了clear()方法清除壁纸,还提供了如下方法设置系统的 ...

  3. AlarmManager定时开关业务

    AlarmManagerUtils.setAlarmOpen(context, 1, Integer.valueOf(a1), Integer.valueOf(a2), 0, 1, 0, " ...

  4. Android定时器AlarmManager(定时发送广播)

    参考 1.MainActivity.java AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); Calendar cal ...

  5. 使用AlarmManager定时更换壁纸----之二

    import java.io.IOException; import android.app.Service; import android.app.WallpaperManager; import ...

  6. STM32F1 高级定时器TIM1定时不准确

    问题: 配置:使用高级定时器TIM1设置定时器 5ms进入一次中断  实现LED1s闪烁. 根据公式可求出频率:72000000/(7199+1)/(49+1) = 200Hz ~ 5ms; 理论上是 ...

  7. android定时循环,Android AlarmManager实现定时循环后台任务

    这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...

  8. android alarmmanager后台,Android AlarmManager实现定时循环后台任务

    这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...

  9. Android定时相关

    执行定时任务的方法: 1.使用Timer package com.hjqjl.whdemo.feature.feature0.ui.activity;import android.content.Co ...

最新文章

  1. 嵌入式Linux的特点
  2. 交换机定时自动备份配置文件的方法
  3. 012_原始值和引用值
  4. 干货 | 算法工程师入门第二期——穆黎森讲增强学习(一) 本文作者:大牛讲堂 编辑:刘芳平 2017-07-19 11:38 导语:地平线大牛讲堂算法工程师入门第二期来啦!本期地平线资深算法工程师、增
  5. MaxCompute Spark 资源使用优化祥解
  6. 怎么取消自动格式化_iPhone自动扣费怎么取消?App Store、微信、支付宝关闭自动扣费教程...
  7. vb子程序未定义怎么改怎么办_vb中子程序或者函数未定义!求教解决方案,
  8. 简述直方图和柱形图的区别_如何区分直方图与柱形图
  9. 福昕pdf虚拟打印机_福昕扫描王将取代扫描仪,OCR文字识别应用办公标配
  10. ps 转换透明 背景图
  11. 国内视频监控芯片方案分析
  12. python饼图 立体_【Python基础】惊叹,Pyecharts绘制饼图原来可以如此漂亮!
  13. uva 11538 Chess Queen
  14. (HTML)浏览器将多个空格压缩为一个空格
  15. 【微信退款】Java实现微信APP退款和JSAPI退款流程
  16. 用Q-learning算法实现自动走迷宫机器人
  17. 关于Java单例模式的思考
  18. python 视频字幕合并_怎么把字幕和视频合并(教你两者合并方法)
  19. #程序员健康 如何解救你的鼠标手
  20. 以Listener和Talker为例ROS1和ROS2代码对比

热门文章

  1. 微软Bing泄露多达6.5TB用户数据:包含搜索记录和位置
  2. windows远程连接服务器命令
  3. 分享下天酬汇怎么做才好上手
  4. 为什么域名根服务器只能有13台呢?
  5. 写了一个管理桌面图标的小工具
  6. 装饰大楼,备用钥匙,IOIOI卡片占卜总结
  7. 关于String str1 = “123“ 和 String str2 = new String(“123“)内存分析
  8. 解决找不到GL/gl.h的问题
  9. 内存空间管理---连续
  10. Silverlight框架