尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

framework中按压power键屏幕熄灭及亮起时流程
📅 发布时间:2026/6/19 9:19:04

启动优化中的一些黑科技,了解一下~启动速度优化是 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博客

相关新闻

  • 易客云会员系统相关介绍
  • FunctionAI 图像生成:简化从灵感到 API 调用的每一步
  • AQS

最新新闻

  • 深入解析CAN控制器:从寄存器位到消息调度与滤波机制
  • Siri要接入AI了,苹果手机上一句话让GPT写文案、DeepSeek写代码的时刻来了
  • 从M68HC11E实战解析8位MCU架构:寄存器、外设与低功耗设计
  • 深入解析LPC408x/7x外设与电源管理:从原理到低功耗实战
  • 重庆黄金回收避坑2026|多数用户遇压价 无资质回收需谨慎 - 名奢变现站
  • 大师兄小论文剖析

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号