9.0息屏流程
2019-04-28 14:41:43 0 举报
为方便学习息屏过程,此流程图记录了9.0的息屏过程。
作者其他创作
大纲/内容
首先根据wakefulness值判断了系统当前的交互状态,如果是处于Awake状态和Dream状态,则表示可交互;如果处于Doze和Asleep状态,则表示不可交互;
mStatusBarKeyguardViewManager.onScreenTurningOn();
unblockScreenOn();
if (mPowerState.getColorFadeLevel() == 0.0f)
finishScreenTurningOn();
handleNotifyScreenTurnedOn();
powerLongPress();
WindowManagerPolicy的实现是PhoneWindowManager,最后调用
powerVeryLongPress();
KeyguardViewMediator,功能上负责处理keyguard试图的事件,锁屏事件的入口:Vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
mUpdateMonitor.dispatchScreenTurnedOn();
mKeyguardService.onScreenTurningOn(new KeyguardShowDelegate(drawnListener));
finishWindowsDrawn();
WindowManagerPolicy的实现是PhoneWindowManager
notifyStartedGoingToSleep();
notifyDrawn(callback);
frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java
调用
unblockScreenOn();updatePowerState();
是,处理长按事件
wakeUpFromPowerKey(event.getDownTime());
handleEarlyInteractiveChange();
finishKeyguardDrawn();
doKeyguardLocked(null);
灭屏,松开power键
mKeyguardDelegate.onStartedWakingUp();
case KeyEvent.KEYCODE_POWER:
mKeyguardDelegate.onStartedGoingToSleep(why);
frameworks/base/services/core/java/com/android/server/power/Notifier.java
DisplayPowerController.java
onStartedWakingUp()
更新屏保信息、进入休眠
判断power键按下是否超时
否、短按消耗掉当前事件
回调PhoneWindowManager.mKeyguardDrawnCallback方法,通过handler发送MSG_KEYGUARD_DRAWN_COMPLETE消息,最终调用
PhoneWindowManager.startedGoingToSleep(int why)
mWindowManagerPolicy.screenTurnedOn();
onScreenTurnedOn()
不可交互,灭屏按下唤醒系统
boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);
第一次上电,核心走到此方法
frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
释放锁
unblockScreenOn之后会再一次updatePowerState(),调用DisplayPowerState中的相关方法设置亮度,屏幕最终亮起来
这个函数会检查所有的窗口是否都绘制完全,同时启动窗口UI刷新流程,等待绘制的窗口放在mWaitingForDrawn里面,如果内容为空则表示窗口绘制完全,否则需要继续等待,并且还会发送一个延时1秒的message,防止窗口绘制超时导致屏幕无法亮起。如果窗口都绘制完成,则会进入传过来的callback的run方法。frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
准备进入睡眠
if (mWakeAndUnlocking)
最终通过handler发送MSG_SCREEN_ON_UNBLOCKED消息,调用
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
false
Vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
blockscreenon的实质是new一个ScreenOnUnblocker对象,这个对象直到unblockscreen才会置为空,以此来实现block机制
亮屏,按下power键
handleNotifyStartedGoingToSleep();
注意这里的listener,这个listener是一个ScreenOnListener对象,ScreenOnListener类的实现在DisplayPowerController中,所以通过这个listener,phoneWindowManager把窗口绘制完成的消息由传回了DisplayPowerController
listener.onScreenOn();
如果返回true
更新屏幕状态
mWindowManagerPolicy.screenTurningOn(mPendingScreenOnUnblocker);
会调用设置屏幕状态的方法,有四种:唤醒状态(awake)、休眠状态(asleep)、屏保状态(dream)、打盹状态(doze),当前屏幕状态由wakefulness表示
frameworks/base/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
最终调用
mKeyguardViewMediator.onStartedGoingToSleep(reason);
最后是走到了WindowManagerInternal里面,WindowManagerInternal的实现类是WindowManagerService
if (interactive)
通过Intent发送Action为DELAYED_KEYGUARD_ACTION的广播,最后调用它设置锁屏
handleNotifyScreenTurningOn((IKeyguardDrawnCallback) msg.obj);
mPowerKeyHandled = true;
true
如果带有PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE的flag,则直接进入Sleep状态,不再进入Doze状态
最后调用
进入休眠
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
第二个参数:表示灭屏原因,在PowerManager中定义了一些常量值来表示;第三个参数:是一个标识,用来表示是否直接进入灭屏,一般的灭屏流程,都会先进入Doze状态,然后才会进入Sleep状态,如果将flag设置为1,则将会直接进入Sleep状态,
通过handler发送NOTIFY_SCREEN_TURNED_ON,调用
updateSuspendBlockerLocked();
frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
doKeyguardLaterLocked(timeout);
StatusBarKeyguardViewManager就是keyguard的视图管理者,包括非安全锁屏和安全锁屏
notifyScreenTurnedOn();
finishWakefulnessChangeIfNeededLocked();
设置wakefulness,再通过Notifier进行处理和通知其他系统服务wakefulness的改变,最后更新用户活动的时间,重置下次超时灭屏时间
经过sendUpdatePowerStateLocked以及handler+meesage的消息调用如下方法
第二次调节屏幕亮度、完成亮屏
回调到
更新屏幕状态、亮屏主要与此方法有关
通知息屏结束
在showBouncerOrKeyguard方法里mPhoneStatusBar.hideKeyguard()和mPhoneStatusBar.showKeyguard;控制的是非安全锁,而mBoncer.show(true)和mBoncer.hide(false)控制的是安全锁屏,也就是说非安全锁屏和安全锁屏在这里开始分别由PhoneStatusBar和KeyguardBouncer管理
blockScreenOn();
//第三个参数为亮屏原因,因此如果是power键亮屏,则log中会出现android.policy:POWER
接着走
onScreenTurningOn(IKeyguardDrawnCallback callback)
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_TURNING_ON);
notifyStartedWakingUp();
mPolicy.startedWakingUp();
startedWakingUp()
mStatusBarKeyguardViewManager.onScreenTurnedOn();
通过handler发送NOTIFY_STARTED_GOING_TO_SLEEP消息
screenTurningOn(final ScreenOnListener screenOnListener)
updatePowerStateLocked();
setReportedScreenState(REPORTED_TO_POLICY_SCREEN_ON);
handleNotifyStartedWakingUp();
ScreenOnUnblocker.onScreenOn()
默认goToSleepNoUpdateLocked()都会返回true
mPolicy.startedGoingToSleep(why);
收尾工作
对于第一次updatePowerState,屏幕还未上电,即mPowerState.getColorFadeLevel() == 0.0f结果为true
最终通过handler调用到
updatePowerState();
block的机制的存在是为了保证在屏幕亮时所有工作都已经准备好(如屏幕完成上电以及所有窗口绘制完成),所以前后需要执行两次的updatePowerState()才会使屏幕真正的亮起来,从PMS传递过来的消息会先走到MSG_UPDATE_POWER_STATE执行第一次updatePowerState()
if (ready && state != Display.STATE_OFF && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_ON)
setScreenState(Display.STATE_ON)
最后通过handler发送NOTIFY_STARTED_WAKING_UP消息调用
0 条评论
下一页