当前位置: 首页 > news >正文

AlarmManagerService 时钟对齐

为什么80%的码农都做不了架构师?>>>   hot3.png

AlarmManager方法

setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);<br> 该方法用于设置重复闹钟,第1个参数表示闹钟类型,第2个参数表示闹钟首次执行时间,第3个参数表示闹钟两次执行的间隔时间,第4个参数表示执行的动作

绝对时间代表 SystemClock.elapsedRealtime() 相对时间代表 System.currentTimeMillis()

闹钟的类型

AlarmManager.ELAPSED_REALTIME <br> 使用相对时间,在手机睡眠状态下不可用

AlarmManager.ELAPSED_REALTIME_WAKEUP<br> 使用相对时间,在睡眠状态下会唤醒系统并执行提示功能

AlarmManager.RTC<br> 使用绝对时间,在睡眠状态下不可用

AlarmManager.RTC_WAKEUP<br> 使用绝对时间,在睡眠状态下会唤醒系统并执行提示功能

AlarmManager.POWER_OFF_WAKEUP<br> 使用绝对时间,在手机关机状态下也能正常进行提示

时钟对齐原理

比如有3个应用,QQ,微信,陌陌

QQ 每隔5s 就需要向服务器请求数据<br> 微信 每隔7s 就需要向服务器请求数据<br> 陌陌 每隔9s 就需要向服务器请求数据<br>

也就是系统在30s之内,就需要唤醒系统13次

了解时钟对齐<br>

比如我们设定系统每隔3s唤醒一次<br> 对齐后时间 = 3 + (重复时间 - (重复时间 % 3))<br> 系统在30s之内,只需要唤醒系统10次<br> 比如时间间隔设为每隔10s唤醒一次<br> 系统在30s之内,只需要唤醒系统3次<br>

而时钟对齐则可以减少系统唤醒次数,达到省电的目的。<br>

AlarmManagerService 时钟对齐 修改setRepeating 方法

long startTime

<!-- lang: java -->
long lstartTime = startTime;
long l1 = paramLong % 5000L;
if (l1!=0L){
    lstartTime = 5000L+ (lstartTime - l1);
}

long intervalTime

<!-- lang: java -->
long l1 = 0L, l2 = 0L;
if (type== 2) {
    l1 = System.currentTimeMillis() - SystemClock.elapsedRealtime();
} else {
    l1 = 0L;
}
l2 = (intervalTime+ l1) % 5000L;
if (l2 != 0L) {
    lintervalTime= 5000L+ (intervalTime- l2);
}

setRepeating 方法

<!-- lang: java -->
synchronized (this.mLock)
{
  Alarm localAlarm = new Alarm();
  localAlarm.type = paramInt;
  localAlarm.when = lstartTime;
  localAlarm.repeatInterval = lintervalTime;
  localAlarm.operation = paramPendingIntent;
  removeLocked(paramPendingIntent);
  if (addAlarmLocked(localAlarm) == 0)
    setLocked(localAlarm);
  return;
}

转载于:https://my.oschina.net/oldmou/blog/131513

相关文章:

  • R语言 3.0.1 源码已经提交到 Github
  • 网站站点百度再出新声明 内容始终是王道
  • c++标准库中,含有链表的类list
  • 幸福框架:可扩展的应用程序 “启动引导” 框架
  • Java多线程设计模式(5)Future模式
  • 【算法】海量数据处理:有一千万条短信,有重复,以文本形式保存,一行一条,找出重复最少的前10条...
  • hdu 3631(floyd思想的运用)
  • 用MDT 2012为企业部署windows 7(七)--创建标准操作系统部署任务序列
  • 自动化运维之 Kerberos 账号信息管理平台
  • POJ 1226 Substrings 解题报告
  • 集合元素并查集
  • PostgreSQL的总体架构
  • Web 应用程序项目 XXXX 已配置为使用 IIS。 无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站。...
  • 030、 Linux 查看CPU信息、机器型号等硬件信息
  • 用Shell脚本监控服务器并发邮件报警
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【347天】每日项目总结系列085(2018.01.18)
  • Android开源项目规范总结
  • conda常用的命令
  • javascript 总结(常用工具类的封装)
  • Making An Indicator With Pure CSS
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring-boot List转Page
  • SpringCloud集成分布式事务LCN (一)
  • text-decoration与color属性
  • Vue.js-Day01
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 力扣(LeetCode)965
  • 聊聊flink的TableFactory
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何设计一个微型分布式架构?
  • 温故知新之javascript面向对象
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 消息队列系列二(IOT中消息队列的应用)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 透过事物看本质的能力怎么培养?
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C++17) std算法之执行策略 execution
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (WSI分类)WSI分类文献小综述 2024
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (四)c52学习之旅-流水LED灯
  • (推荐)叮当——中文语音对话机器人
  • (一)VirtualBox安装增强功能
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)人的集合论——移山之道
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET Core 2.1路线图
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题