以power键为例,power键按下灭屏的 reason为PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,flag为0.
实际是通过binder服务调用PowerManagerService.java的goToSleep(),接口:
PowerManager各种接口内部执行时,很多情况下是执行一些XXXNoUpdateLocked()改变PM状态变量,还会通知WMS等模块PM状态变化。但是PM真正执行唤醒,休眠,亮灭屏等电源相关操作是updatePowerStateLocked().
具体到goToSleep接口就是先调用goToSleepNoUpdatedLocked()设置PM状态变量,然后调用updatePowerStateLocked()更新真正的电源相关逻辑。
goToSleepNOUpdataLocked的核心逻辑是setWakefulnessLocked()函数。先设置状态为DOZING.
PM系统当前状态共有四种定义:
WAKEFULNESS_ASLEEP:表示系统当前处于休眠状态,只能被wakeUp()调用唤醒。
WAKEFULNESS_AWAKE:表示系统目前处于正常运行状态。
WAKEFULNESS_DREAMING:表示系统当前正处于屏保的状态。
WAKEFULNESS_DOZING:表示系统正处于“doze”状态。这种状态下只有低耗电的“屏保”可以运行,其他应用进程都被挂起。
这个Dozing和DeviceIdle模块中的DOZE不是概念哈!