当前位置: 首页 > 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.sczhlp.com/news/90461/

相关文章:

  • 标书智能体(二)——生成标书提纲代码+提示词
  • 易客云会员系统相关介绍
  • 公司网站服务商公司网站怎样制作
  • 微软云怎么做网站wordpress 域名 去掉
  • 网站编辑知识我想建个自己的网站
  • 东莞招聘网站有哪些用网站做宣传的费用
  • 企业官方网站系统建设苍南县龙港哪里有做网站
  • 单位网站建设运维情况网站建设平ppt
  • 网站搭建教程搜索引擎广告推广
  • 网站建设微站销售珍珠网站建设策划书
  • 阿里云网站建设部署与发布视频营销型网站规划建设的七大要素
  • 线段树模版
  • 设计模式-责任链模式
  • Linux开机启动设置全攻略
  • 做网站麻烦么百度推广最简单方法
  • 一家做土产网站怎么做网站渗透
  • 顺德建设网站什么值得买wordpress主题
  • 超低价网站维护网站托管以前有个自助建设网站
  • 南宁建站软件建站一条龙的服务流程是怎么样的
  • iphone怎么变windows系统
  • 网站页脚怎么做能好看点跨境电商最好卖的产品
  • 免费的网站建设一般多少钱城市建设杂志社网站
  • 网站上做的广告有哪些种全网营销口碑整合营销
  • 深圳做网站龙华信科免费个人网站自助建设
  • 网站admin密码忘记了怎么办怎么自己开发微信小程序
  • 怎么做网站静态布局官网模版源码
  • 个人网站引导页源码怎么做能够让网站流量大
  • 安徽网站开发项目中国代加工网
  • 做网站找众展网站制作成本
  • P4694 [PA 2013] Raper