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_WAKEUP; //相对时间!设备睡眠状态下可用。
看到注解没,相对时间和绝对时间!对,问题就在这里!千万注意,如果是相对时间,那么计算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定时不准确相关推荐
- android alarmmanager 收不到广播,关于安卓AlarmManager定时会失效的问题,请指点
网上查了N多资料,基本都是讲解AlarmManager要怎么用,但基本没怎么说什么情况会失效或被安卓系统杀掉.都说AlarmManager是系统级的服务,手机睡眠后都能唤醒CPU执行.但本人测试在手机 ...
- 使用AlarmManager定时更换壁纸
随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 更换壁纸要用到WallpaperManager,它提供了clear()方法清除壁纸,还提供了如下方法设置系统的 ...
- AlarmManager定时开关业务
AlarmManagerUtils.setAlarmOpen(context, 1, Integer.valueOf(a1), Integer.valueOf(a2), 0, 1, 0, " ...
- Android定时器AlarmManager(定时发送广播)
参考 1.MainActivity.java AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); Calendar cal ...
- 使用AlarmManager定时更换壁纸----之二
import java.io.IOException; import android.app.Service; import android.app.WallpaperManager; import ...
- STM32F1 高级定时器TIM1定时不准确
问题: 配置:使用高级定时器TIM1设置定时器 5ms进入一次中断 实现LED1s闪烁. 根据公式可求出频率:72000000/(7199+1)/(49+1) = 200Hz ~ 5ms; 理论上是 ...
- android定时循环,Android AlarmManager实现定时循环后台任务
这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...
- android alarmmanager后台,Android AlarmManager实现定时循环后台任务
这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...
- Android定时相关
执行定时任务的方法: 1.使用Timer package com.hjqjl.whdemo.feature.feature0.ui.activity;import android.content.Co ...
最新文章
- 基于相交线的双目平面SLAM
- django安装mysql_django+mysql安装和设置
- 低压抽屉柜常见故障处理方法_电磁流量计的常见故障及处理方法
- 比特币这么火热,看看这篇比特币初学者指南
- 64 oracle client,64bit oracle and oracle client.
- MySQL字段类型与Java数据类型的对应关系
- nbiot模块WH-NB73 UDP透传和透传云使用说明
- S/4HANA extension field search的SQL语句是在什么地方生成的
- linux 命令 find -exec 操作的问题
- 细数Android开发者的艰辛历程,已拿offer附真题解析
- 35-46集 中心极限定理、置信区间
- Android 应用开发---API Level对应Android版本一览表
- 腾讯广告犀牛鸟专项研究计划即日启动,开启2020新征程
- rest-framework框架的基本组件
- (转)EBWin格式辞典的安装使用
- Android权限管理原理
- ArcGIS矢量数据重分类
- macos双系统 wintogo_aigo固态硬盘,轻松实现macOS运行Windows双系统
- 总结了Mybatis,原来知识点也没多少嘛
- 概率论与数理统计——重复抽样与不重复抽样的判定