当前位置: 首页 > news >正文

framework中按压power键屏幕熄灭及亮起时流程

启动优化中的一些黑科技,了解一下~启动速度优化是 android 开发中的常见需求,除了一些常规的手段之外,也有一些黑科 - 掘金

安卓锁屏灭屏流程解析-CSDN博客

安卓锁屏亮屏流程解析-CSDN博客

相关的类

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.@Overridepublic 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.@Overridepublic 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 线程上调用。@Overridepublic 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.@Overridepublic 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);}@Overridepublic 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.@Overridepublic 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.@Overridepublic 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函数主要负责更新系统栏(状态栏和导航栏)的显示属性。根据搜索结果分析,该函数的主要作用包括:

  1. 管理系统栏的可见性:控制状态栏和导航栏的显示或隐藏状态
  2. 调整系统栏的颜色:设置状态栏和导航栏的背景颜色
  3. 适配焦点窗口变化:当窗口焦点发生变化时,更新系统栏的属性以适应新的焦点窗口
    在Android系统中,DisplayPolicy是负责系统UI布局的关键组件,特别是导航栏和状态栏的布局管理。updateSystemBarAttributes函数作为其中的重要方法,确保了系统栏能够根据当前窗口状态和用户需求进行动态调整,提供更好的用户体验。

Android 12系统源码_SystemUI(七)DisplayPolicy构建状态栏和导航栏视图窗口区域坐标-CSDN博客

http://www.hskmm.com/?act=detail&tid=1591

相关文章:

  • 标书智能体(二)——生成标书提纲代码+提示词
  • 易客云会员系统相关介绍
  • 线段树模版
  • 设计模式-责任链模式
  • Linux开机启动设置全攻略
  • 实用指南:Grafana - 监控磁盘使用率Variables使用
  • iphone可以用windows系统吗
  • iphone怎么变windows系统
  • P4694 [PA 2013] Raper
  • 共享内存使用举例
  • 【QML】解决 Qt C++ 正则表达式中文匹配问题
  • 产品包装盒这样制作,再也不用到处求人啦!超简单的上手方法分享!
  • FunctionAI 图像生成:简化从灵感到 API 调用的每一步
  • ​​电力系统的“慧眼”:深入解析电流互感器的核心用途​​
  • C# 内存泄漏
  • 2025.9记录
  • AQS
  • TVBox中的Python接口解读
  • 一、CPU的功能和基本结构
  • DevOps时代的知识管理革命:如何构建智能化的研发决策中枢
  • P1099 [NOIP 2007 提高组] 树网的核
  • [GenAI] 外接DeepSeek
  • 一个简单美观的文件时间修改器
  • 暗黑类游戏属性系统程序设计思路3.0
  • 完整教程:毕设课题:基于Node.js+Express框架+Mysql数据库的助农农产品销售商城设计与实现
  • 经典的混合加密传输协议—PGP
  • 2025年互联网行业专业工艺认证发展指南
  • 基本数据类型转换
  • C# Avalonia 13- MoreDrawing - VisualLayer
  • Linux 设置nginx 以及java jar自启动