powermanagerservice分析

来源:互联网 发布:北大青鸟陈璇java视频 编辑:程序博客网 时间:2024/06/01 03:57

PowerManagerService分析:

Pms负责处理设备是否唤醒,外部接口和内部逻辑相对简单一些,下面是系统结构:

对应应用层,pms开放出去的接口,以powemanager为接口类,提供如下操作:

Wakelock:提供锁操作。

PreventScreenOn:屏幕暗屏,5s后点亮。

userActivity:设置超时。

Gotosleeepjni调用。

内部实现上,在pms内部有两个变量mWakelockStatemUserState决定暗灭,锁机制影响mWakelockState变量,userActivity接口影响mUswerState变量。

pms中有个locklist,当调用wakelock.acquireWakeLock时,生成一个wakelock,加入到locklist中,然后取locklist锁的集合生成mWakeLockState


屏幕逐渐变暗是通过内部一个timeout实现的,调用setTimeOutLocked设置超时,在timeoutTask中执行超时处理。间隔值通过serScreenOffTimeOutsLocked刷新。

锁有两个附加属性,ON_AFTER_RELEASE 是在release wake时,会再调用userActivity刷新超时;ACQUIRE_CAUSES_WAKEUP是在获取锁时,会激活原先失活的锁,这个激活操作在useractivity中也有。与激活对应的失活操作在gotosleep中,这个接口在按power键时调用,这个后面会讲到。

外部交互:

power键,亮屏时,inputreader从驱动取得事件后,inputdispatch会调用策略器做过滤,在策略器PhoneWindowManagerinterceptkeybeforequeueing中处理结果会是ACTON_GO_TO_SLEEP,当inputdispatch判断处理结果是ACTION_GO_TO_SLEEP时,会从jni层调用pmsgotosleep方法。 如果是灭屏情况下,在PhoneWindowManagerinterceptbeforequeueing的方法中会调用mKeyguardMediator.onWakekeyWhenkeyguardShowTq,这个因为涉及到锁屏的东西,我们暂时不跟,不过现在可以了解一下它里面是锁机制实现。

Pmsams的交互:

setPowerState中,会根据当前亮灭屏发送notification,处理notification时,会调用amsgoingtosleep/wakeingup

Pmskeyguard的交互:

keyguard处理show/hide时,会调用pmsenableUserActivity,这个方法会控制pms的内部变量mUserActivityAllowed,由其名得其意,后者是用于控制userActivity操作是否可以进行。


原创粉丝点击