AndroidN DisplayManagerService源码简析,亮屏流程分析

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屏幕开始启动。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值