framework中按压power键屏幕熄灭及亮起时流程
启动优化中的一些黑科技,了解一下~启动速度优化是 android 开发中的常见需求,除了一些常规的手段之外,也有一些黑科 - 掘金
相关的类
PhoneWindowManager类实现接口WindowManagerPolicy,接口中提供相关函数如下:
startedGoingToSleep :开始睡眠操作
finishedGoingToSleep:完成睡眠操作
startedWakingUp:开始唤醒操作
finishedWakingUp:完成唤醒操作(此时屏幕已经亮起)
Android framework中屏幕熄灭及亮起时添加操作(以屏蔽按键未例)_phonewindowmanager 屏灭 收不到按键消息-CSDN博客
KeyguardViewMeditor:整个锁屏的调度类,相当于锁屏的大脑,控制着整个锁屏。
KeyguardService:负责锁屏模块和PWM(PhoneWindowManageer.java)和PMS(PowerManagerService.java)之间的沟通。
KeyguardUpdateMonitor:负责将锁屏的状态传递下去
StatusBarKeyguardViewManager:负责View的管理
KeyguardBouncer:专门负责Bouncer界面也就是安全锁界面的管理。
注意点:对于锁屏来说,灭屏时,锁屏就会进行加载,并且加载完成,之后在亮屏时进行显示。
Power灭屏关联函数
PWM中的finishedGoingToSleep()、startedGoingToSleep()方法
./frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
// Called on the PowerManager's Notifier thread.
@Override
public void startedGoingToSleep(int displayGroupId,
@PowerManager.GoToSleepReason int pmSleepReason) {
if (DEBUG_WAKEUP) {
Slog.i(TAG, "Started going to sleep... (groupId=" + displayGroupId + " why="
+ WindowManagerPolicyConstants.offReasonToString(
WindowManagerPolicyConstants.translateSleepReasonToOffReason(
pmSleepReason)) + ")");
}
if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
return;
}
mRequestedOrSleepingDefaultDisplay = true;
mIsGoingToSleepDefaultDisplay = true;
// In case startedGoingToSleep is called after screenTurnedOff (the source caller is in
// order but the methods run on different threads) and updateScreenOffSleepToken was
// skipped. Then acquire sleep token if screen was off.
if (!mDefaultDisplayPolicy.isScreenOnFully() && !mDefaultDisplayPolicy.isScreenOnEarly()
&& com.android.window.flags.Flags.skipSleepingWhenSwitchingDisplay()) {
updateScreenOffSleepToken(true /* acquire */, false /* isSwappingDisplay */);
}
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onStartedGoingToSleep(pmSleepReason);
}
}
// Called on the PowerManager's Notifier thread.
@Override
public void finishedGoingToSleep(int displayGroupId,
@PowerManager.GoToSleepReason int pmSleepReason) {
if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
return;
}
EventLogTags.writeScreenToggled(0);
if (DEBUG_WAKEUP) {
Slog.i(TAG, "Finished going to sleep... (groupId=" + displayGroupId + " why="
+ WindowManagerPolicyConstants.offReasonToString(
WindowManagerPolicyConstants.translateSleepReasonToOffReason(
pmSleepReason)) + ")");
}
MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000);
mRequestedOrSleepingDefaultDisplay = false;
mIsGoingToSleepDefaultDisplay = false;
mDefaultDisplayPolicy.setAwake(false);
// We must get this work done here because the power manager will drop
// the wake lock and let the system suspend once this function returns.
synchronized (mLock) {
updateWakeGestureListenerLp();
updateLockScreenTimeout();
}
mDefaultDisplayRotation.updateOrientationListener();
if (mKeyguardDelegate != null) {
//此处调用的是KeyguardServiceDelegate类中的onFinishedGoingToSleep方法,
// 此类中直接调用的KeyguardService中的方法,所以直接看KeyGuardSeervice.
mKeyguardDelegate.onFinishedGoingToSleep(pmSleepReason,
mCameraGestureTriggeredDuringGoingToSleep);
// Unisoc bug 2526717: adapt screen off and on quickly by power button (1/2)
if (pmSleepReason == PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON
&& !mCameraGestureTriggeredDuringGoingToSleep) {
setFinishedGoingToSleepByPowerButtonIfNeed();
}
}
if (mDisplayFoldController != null) {
mDisplayFoldController.finishedGoingToSleep();
}
mCameraGestureTriggeredDuringGoingToSleep = false;
mCameraGestureTriggered = false;
}
Power亮屏关联函数
亮屏时,KeyguardService先后会调用以下方法:onStartedWakeUp(),onScreenTurningOn(),onScreenTurnedOn(),锁屏亮屏显示布局的主要操作就在onScreenTurningOn()。
首先onScreenTurningOn在PWM中被调起,开始进行亮屏流程。
./frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
// Called on the DisplayManager's DisplayPowerController thread.
//在 DisplayManager 的 DisplayPowerController 线程上调用。
@Override
public void screenTurningOn(int displayId, final ScreenOnListener screenOnListener) {
if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turning on...");
reportScreenTurningOnToWallpaper(displayId);
if (displayId == DEFAULT_DISPLAY) {
Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn",
0 /* cookie */);
updateScreenOffSleepToken(false /* acquire */, false /* isSwappingDisplay */);
mDefaultDisplayPolicy.screenTurningOn(screenOnListener);
mBootAnimationDismissable = false;
synchronized (mLock) {
if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) {
mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);//移除掉消息队列中的绘制超时消息
mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT,
getKeyguardDrawnTimeout());//获取绘制时长后,发送绘制超时消息,完成绘制
mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);//调用KeyguardServiceDelegate.onScreenTurningOn()方法
} else {
if (DEBUG_WAKEUP) Slog.d(TAG,
"null mKeyguardDelegate: setting mKeyguardDrawComplete.");
mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE);
}
}
} else {
mScreenOnListeners.put(displayId, screenOnListener);
Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER,
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, displayId /* cookie */);
mWindowManagerInternal.waitForAllWindowsDrawn(mHandler.obtainMessage(
MSG_WINDOW_MANAGER_DRAWN_COMPLETE, displayId, 0),
WAITING_FOR_DRAWN_TIMEOUT, displayId);
}
}
// Called on the DisplayManager's DisplayPowerController thread.
@Override
public void screenTurnedOn(int displayId) {
if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turned on...");
// Unisoc: Notifies the window manager that screen is being turned On.
// SR: SR.695.001864.006623, SR.695.000988.002914.
// Bug: 2585814, 2586728 @{
mWindowManagerFuncs.screenTurnedOn(displayId);
// @}
reportScreenTurnedOnToWallpaper(displayId);
if (displayId != DEFAULT_DISPLAY) {
return;
}
synchronized (mLock) {
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onScreenTurnedOn();
}
}
mDefaultDisplayPolicy.screenTurnedOn();
reportScreenStateToVrManager(true);
}
@Override
public void screenTurningOff(int displayId, ScreenOffListener screenOffListener) {
mWindowManagerFuncs.screenTurningOff(displayId, screenOffListener);
if (displayId != DEFAULT_DISPLAY) {
return;
}
mRequestedOrSleepingDefaultDisplay = true;
synchronized (mLock) {
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onScreenTurningOff();
}
}
}
// Called on the PowerManager's Notifier thread.
@Override
public void startedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) {
if (DEBUG_WAKEUP) {
Slog.i(TAG, "Started waking up... (groupId=" + displayGroupId + " why="
+ WindowManagerPolicyConstants.onReasonToString(
WindowManagerPolicyConstants.translateWakeReasonToOnReason(
pmWakeReason)) + ")");
}
if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
return;
}
EventLogTags.writeScreenToggled(1);
mIsGoingToSleepDefaultDisplay = false;
mDefaultDisplayPolicy.setAwake(true);
// Since goToSleep performs these functions synchronously, we must
// do the same here. We cannot post this work to a handler because
// that might cause it to become reordered with respect to what
// may happen in a future call to goToSleep.
synchronized (mLock) {
updateWakeGestureListenerLp();
updateLockScreenTimeout();
}
mDefaultDisplayRotation.updateOrientationListener();
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onStartedWakingUp(pmWakeReason, mCameraGestureTriggered);
}
mCameraGestureTriggered = false;
}
// Called on the PowerManager's Notifier thread.
@Override
public void finishedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) {
if (DEBUG_WAKEUP) {
Slog.i(TAG, "Finished waking up... (groupId=" + displayGroupId + " why="
+ WindowManagerPolicyConstants.onReasonToString(
WindowManagerPolicyConstants.translateWakeReasonToOnReason(
pmWakeReason)) + ")");
}
if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
return;
}
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onFinishedWakingUp();
}
if (mDisplayFoldController != null) {
mDisplayFoldController.finishedWakingUp();
}
}
DisplayPolicy
Android系统中DisplayPolicy.java的updateSystemBarAttributes函数主要负责更新系统栏(状态栏和导航栏)的显示属性。根据搜索结果分析,该函数的主要作用包括:
- 管理系统栏的可见性:控制状态栏和导航栏的显示或隐藏状态
- 调整系统栏的颜色:设置状态栏和导航栏的背景颜色
- 适配焦点窗口变化:当窗口焦点发生变化时,更新系统栏的属性以适应新的焦点窗口
在Android系统中,DisplayPolicy是负责系统UI布局的关键组件,特别是导航栏和状态栏的布局管理。updateSystemBarAttributes函数作为其中的重要方法,确保了系统栏能够根据当前窗口状态和用户需求进行动态调整,提供更好的用户体验。
Android 12系统源码_SystemUI(七)DisplayPolicy构建状态栏和导航栏视图窗口区域坐标-CSDN博客

浙公网安备 33010602011771号