定时开关机-Android4.4/6.0

本文详细介绍了Android定时开关机的工作原理,涉及到RTC寄存器、AlarmManagerService和系统层面的处理。在Android4.4和6.0中,定时开关机流程有所不同,Android6.0实现了真正的掉电关机,依靠RTC Alarm进行计时。文章还讨论了在不同Android版本间的移植策略,包括JNI层和驱动层的修改方案。
摘要由CSDN通过智能技术生成

一、寄存器介绍——RTCSA & RTCSAR

1.RTC是Real Time Clock的简称,是一个时钟芯片。它在硬件电路上单独供电,当系统关机时,CPU和其他外部硬件设备全部掉电,但是RTC仍然继续工作. RTC可以读取到RTCSR和RTCSAR寄存器中的数据。
2.HWCR (Hibernate Wakeup Control Register)是一个控制休眠唤醒的寄存器,如果我们要使用休眠状态下RTC唤醒的功能,我们需要打开它的第0位ELAM(RTC Alarm Wakeup enable),当ELAM置1时,使能ELAM功能。
3.RTCSR (RTC Second Registe)是一个32位的寄存器,它的值以1Hz的频率加1,即每秒自动加1。
4.RTCSAR (RTC Second Alarm Register)是一个以秒为单位的闹钟寄存器,我们可以将设置的格林威治时间转换成相应的秒数然后写进这个寄存器,即完成了我们设置的闹钟。我们打开HWCR中的ELAM,按power键关机,当RTC检测到RTCSR == RTCSAR的值时,RTC将会唤醒CPU,并从XBOOT开始进行开机启动。

二、定时开关机原理

1.Batch

从Android4.4开始,Alarm默认为非精准模式,除非显示指定采用精准模式。在非精准模式下,Alarm是批量提醒的,每个alarm根据其触发时间和最大触发时间的不同会被加入到不同的batch中,同一个batch的不同alarm是同时发生的,这样就无法实现精准闹钟。官方的解释是批量处理可以减少设备被唤醒次数以及节约电量,不过针对精准闹钟,官方预留的方法是setExact和setWindow。
这里写图片描述
在 AlarmManagerService 中真正设置 alarm 的函数是 setImplLocked 函数,在这个函数中把 alarm 添加到 mAlarmBatchs 中,mAlarmBatchs 会把触发时间相近的Alarm 放在同一个 batch 中,然后每个 bach 根据时间排序放在 mAlarmBatchs 中,前面的就是先要触发的 alarm。

可是仅仅把 alarm 加入到 batch 中还不行,系统还必须提供一个类似于 Looper的东西一直去遍历这个列表,一旦它发现有些 alarm 的时间已经到达就要把它取出来去执行。 AlarmThread 会一直循环的跑着,一旦有新的 alarm 触发,它就会取出一个 batch 然后逐个发送 Pendin

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值