frameworks/base/services/java/com/android/server/PowerManagerService.java
0.
当没有外部事件时,过了一段时间小机会自动进入熄屏或休眠。所以只要有用户操作屏幕和键盘等事件,就要重新设定自动休眠的定时器。
frameworks\base \services\java\com\android\server\WindowManagerService.java
WindowManagerService会把用户的点击屏幕,按键等作为user activity事件来调用userActivity函数.
1. userActivity()
userActivity()根据当前状态决定要如何处理,如:
a. 如果之前屏幕是暗的,则可能需要亮屏; 如果只按了音量键BUTTON, 则不需要亮屏。
b. 要重新设置进入熄屏(SCREEN_DIM)或休眠(SCREEN_OFF)的超时时间
2. setTimeoutLocked(long now, final long originalTimeoutOverride, int nextState)
setTimeoutLocked()计算下一个状态nextState的超时时间when,使用TimeoutTask在when时间到达时执行TimeoutTask.
originalTimeoutOverride参数用于指定SCREEN_OFF的时间,若为-1则使用每个状态的默认超时时间。
3. TimeoutTask
TimeoutTask首先调用setPowerState()设置当前系统电源状态,然后根据刚刚设置的状态来计算下一个状态,状态变化过程为:
SCREEN_BRIGHT -> SCREEN_DIM -> SCREEN_OFF
最后使用定时器setTimeoutLocked来定时进入下一个状态。
4. setPowerState()
调整背光亮度,设置系统状态(休眠/唤醒)
setScreenStateLocked() -> Power.setScreenState() 写 /sys/power/state, 休眠,唤醒