PowerManagerService源码分析 :http://blog.csdn.net/king1425/article/details/70224476
Android的亮屏流程从android系统结构层次来分可以分为三个流程。App应用唤醒源;Framework层Power结合Display,Light服务做亮屏绘制准备工作;底层驱动点亮背光灯。这里重点分析一下Framework层亮屏的一系列准备工作流程。
唤醒源
通过了解PowerManagerService的工作流程可以发现android的唤醒屏幕的唤醒源总共有四种:
1.应用直接调用 PowerManager的WakeUp接口。
2.应用在申请wakelock时候,添加ACQUIRE_CAUSES_WAKEUP的flag。
3.应 用Activity在创建时候,带有WindowManager的FLAG_TURN_SCREEN_ON的flag(本质调用到 PowerManagerService的WakeUp操作)。
4.Power键唤醒是通过Input事件调用到PhoneWindowManager中 的按键事件处理函数interceptKeyBeforeQueueing中去调用PowerManager的wakeup接口。
这里先简单介绍一下较为较为特殊的第二,三种类型的唤醒源,后面关于wakeup的流程会详细的说明。
1.应用申请wakelock带有ACQUIRE_CAUSES_WAKEUP标志:当应用在申请wakelok时候,会在 PowerManagerService的中去执行updatePowerStateLocked更新电源状态操作,熟悉 PowerManagerService的人会清楚updatePowerStateLocked是整个PowerManagerService的核心函 数,只要系统接收到与Power相关的事件(如:申请wakelock,开机,设置改变,用户操作等等)之后会第一时间去执行 updatePowerStateLocked更新电源状态。但是在申请wakelock时候,在acquireWakeLockInternal中会调用applyWakeLockFlagsOnAcquireLocked函数去判断wakelock是否带有ACQUIRE_CAUSES_WAKEUP,如果带有该标志会直接跳入wakeUpNoUpdateLocked函数内,该函数是便是WakeUp唤醒系统的必须要走的调用函数。
2. Activity创建带有FLAG_TURN_SCREEN_ON标志:以IncallActivity为例
1).电话来电时首先。会在IncallActivity中的onCreate方法中设置一个FLAG_TURN_SCREEN_ON的flag值。
2).应用会调用到PhoneWindow的addWindow方法时,会调用到WindowManagerService–>relayoutVisibleWindow, 将win的mTurnOnScreen设置为true。
3).最终在最终在WindowSurfacePlacer的
performSurfacePlacement 函数中调用wakeUp:
1. if (mTurnOnScreen) {
2. if (mAllowTheaterModeWakeFromLayout
3. || Settings.Global.getInt(mContext.getContentResolver(),
4. Settings.Global.THEATER_MODE_ON, 0) == 0) {
5. if (DEBUG_VISIBILITY || DEBUG_POWER) {
6. Slog.v(TAG, "Turning screen on after layout!");
7. }
8. mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.server.wm:TURN_ON");
9. }
10. mTurnOnScreen = false;
11. }
唤醒流程
Wakeup流程分两个流程:1.是windowManager绘制屏幕动画;2.是点亮屏幕背光灯;两个流程是两条调用的路线在并行执行;
绘制屏幕动画流程如下:
1)调用到PowerManagerService的wakeup,到WakeupInternal中,到wakeUpNoUpdateLocked函 数,在wakeUpNoUpdateLocked函数中调用setWakefulnessLocked函数,设置mWakeFullness为 WAKEFULLNESS_AWAKE。
2).前面执行wakeup函数执行过程中会调用到setWakefulnessLocked将mWakefulness置成 WAKEFULLNESS_AWAKE,同时调用到mNotifier中的onWakefulnessChangeStarted,在此函数中做三了三件 事:1.通知AMS状态变为wakefulness;2.通知IntputManager状态变为InterActive可交互状态;3.通过 handleEarlyInteractiveChange调用到PhoneWindowManager的startedWakingUp函数,来通知到 PhoneWindowManager屏幕开始启动。