发布时间:2026/8/16 14:16:53
Android14 WMS-Power键短按流程 目录1. PhoneWindowManager#interceptKeyBeforeQueueing2. PhoneWindowManager#handleKeyGesture3. PhoneWindowManager#handleCameraGesture4. SingleKeyGestureDetector#interceptKey5. SingleKeyGestureDetector#interceptKeyUp6. SingleKeyGestureDetector#KeyHandler#handleMessage7. PhoneWindowManager#PowerKeyRule#onPress8. PhoneWindowManager#powerPressWMS中事件分发从interceptKeyBeforeDispatching-interceptKeyBeforeQueueing1. PhoneWindowManager#interceptKeyBeforeQueueinghttp://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java#interceptKeyBeforeQueueingOverridepublicintinterceptKeyBeforeQueueing(KeyEvent event,intpolicyFlags) { ...finalbooleanisDefaultDisplayOn mDefaultDisplayPolicy.isAwake();finalbooleandisplayOn Display.isOnState(mDefaultDisplay.getState());finalbooleaninteractiveAndOn interactive isDefaultDisplayOn displayOn;if((event.getFlags() KeyEvent.FLAG_FALLBACK) 0) {handleKeyGesture(event, interactiveAndOn);}2. PhoneWindowManager#handleKeyGestureprivatevoidhandleKeyGesture(KeyEvent event,booleaninteractive) {if(mKeyCombinationManager.interceptKey(event, interactive)) { // handled by combo keys manager. mSingleKeyGestureDetector.reset();return; }if(event.getKeyCode() KEYCODE_POWER event.getAction() KeyEvent.ACTION_DOWN) {如果连续按power键会拉起camera如果这个power事件被消费了会直接return不往下继续走短按power流程了mPowerKeyHandled handleCameraGesture(event, interactive);if(mPowerKeyHandled) { // handled by camera gesture. mSingleKeyGestureDetector.reset();return; } }mSingleKeyGestureDetector.interceptKey(event, interactive);}3. PhoneWindowManager#handleCameraGesture// The camera gesture will be detected by GestureLauncherService.privatebooleanhandleCameraGesture(KeyEvent event,booleaninteractive) { // add by monet, do not handle camera gesture.如果是VR设备这里会直接return false。if(SystemProperties.getBoolean(persist.xr.vrmode,true)) {returnfalse; }...4. SingleKeyGestureDetector#interceptKeyhttp://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/SingleKeyGestureDetector.javavoidinterceptKey(KeyEvent event,booleaninteractive) {if(event.getAction() KeyEvent.ACTION_DOWN) { // Store the non interactive state when first down.if(mDownKeyCode KeyEvent.KEYCODE_UNKNOWN || mDownKeyCode ! event.getKeyCode()) { mBeganFromNonInteractive !interactive; } interceptKeyDown(event); }else{interceptKeyUp(event);} }5. SingleKeyGestureDetector#interceptKeyUpprivatebooleaninterceptKeyUp(KeyEvent event) {...if(event.getKeyCode() mActiveRule.mKeyCode) { // Directly trigger short press when max count is 1.if(mActiveRule.getMaxMultiPressCount() 1) {if(DEBUG) { Log.i(TAG, press key KeyEvent.keyCodeToString(event.getKeyCode())); }短按Messagemsg mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, mActiveRule.mKeyCode, 1, mActiveRule);msg.setAsynchronous(true); mHandler.sendMessage(msg); mActiveRule null;returntrue; }6. SingleKeyGestureDetector#KeyHandler#handleMessagehttp://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java#425privateclassKeyHandlerextendsHandler { KeyHandler() {super(Looper.myLooper()); } OverridepublicvoidhandleMessage(Message msg) {finalSingleKeyRule rule (SingleKeyRule) msg.obj;if(rule null) { Log.wtf(TAG, No active rule.);return; }finalintkeyCode msg.arg1;finalintpressCount msg.arg2;switch(msg.what) {caseMSG_KEY_LONG_PRESS:if(DEBUG) { Log.i(TAG, Detect long press KeyEvent.keyCodeToString(keyCode)); }rule.onLongPress(mLastDownTime);break;caseMSG_KEY_VERY_LONG_PRESS:if(DEBUG) { Log.i(TAG, Detect very long press KeyEvent.keyCodeToString(keyCode)); }rule.onVeryLongPress(mLastDownTime);break;caseMSG_KEY_DELAYED_PRESS:if(DEBUG) { Log.i(TAG, Detect press KeyEvent.keyCodeToString(keyCode) , count pressCount); }if(pressCount 1) {短按一次走这里rule.onPress(mLastDownTime);}else{rule.onMultiPress(mLastDownTime, pressCount);}break; }7. PhoneWindowManager#PowerKeyRule#onPresshttp://10.12.16.211:8080/source/xref/LA.QSSI.14.0.r1/LINUX/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java#2481/** * Rule for single power key gesture. */privatefinalclassPowerKeyRuleextendsSingleKeyGestureDetector.SingleKeyRule { PowerKeyRule() {super(KEYCODE_POWER); } Override短按一次voidonPress(longdownTime) { powerPress(downTime, 1 /*count*/, mSingleKeyGestureDetector.beganFromNonInteractive()); }Override长按voidonLongPress(longeventTime) {if(mSingleKeyGestureDetector.beganFromNonInteractive() !mSupportLongPressPowerWhenNonInteractive) { Slog.v(TAG, Not support long press power when device is not interactive.);return; } powerLongPress(eventTime); } OverridevoidonVeryLongPress(longeventTime) { mActivityManagerInternal.prepareForPossibleShutdown(); powerVeryLongPress(); } Override多次按voidonMultiPress(longdownTime,intcount) { powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive()); }8. PhoneWindowManager#powerPressprivatevoidpowerPress(longeventTime,intcount,booleanbeganFromNonInteractive) {count为按power键的次数// SideFPS still needs to know about suppressed power buttons, in case it needs to block an auth attempt.if(count 1) { mSideFpsEventHandler.notifyPowerPressed(); }if(mDefaultDisplayPolicy.isScreenOnEarly() !mDefaultDisplayPolicy.isScreenOnFully()) { Slog.i(TAG, Suppressed redundant power key press while already in the process of turning the screen on.);return; }finalbooleaninteractive mDefaultDisplayPolicy.isAwake(); Slog.d(TAG, powerPress: eventTime eventTime interactive interactive count count beganFromNonInteractive beganFromNonInteractive mShortPressOnPowerBehavior mShortPressOnPowerBehavior);if(count 2) { powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior); }elseif(count 3) { powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior); }elseif(count 3 count getMaxMultiPressPowerCount()) { Slog.d(TAG, No behavior defined for power press count count); }elseif(count 1 interactive !beganFromNonInteractive) {if(mSideFpsEventHandler.shouldConsumeSinglePress(eventTime)) { Slog.i(TAG, Suppressing power key because the user is interacting with the fingerprint sensor);return; } // Device Integration: If the power button is handled by black screen, then do nothingif(!DeviceIntegrationUtils.DISABLE_DEVICE_INTEGRATION BlackScreenWindowManager.getInstance().interceptPowerKey()) {return; }switch(mShortPressOnPowerBehavior) {caseSHORT_PRESS_POWER_NOTHING:break;caseSHORT_PRESS_POWER_GO_TO_SLEEP: sleepDefaultDisplayFromPowerButton(eventTime, 0);break;caseSHORT_PRESS_POWER_REALLY_GO_TO_SLEEP: sleepDefaultDisplayFromPowerButton(eventTime, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);break;caseSHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:if(sleepDefaultDisplayFromPowerButton(eventTime, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE)) { launchHomeFromHotKey(DEFAULT_DISPLAY); }break;caseSHORT_PRESS_POWER_GO_HOME: shortPressPowerGoHome();break;caseSHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME: {if(mDismissImeOnBackKeyPressed) { InputMethodManagerInternal.get().hideCurrentInputMethod( SoftInputShowHideReason.HIDE_POWER_BUTTON_GO_HOME); }else{ shortPressPowerGoHome(); }break; }caseSHORT_PRESS_POWER_LOCK_OR_SLEEP: {if(mKeyguardDelegate null || !mKeyguardDelegate.hasKeyguard() || !mKeyguardDelegate.isSecure(mCurrentUserId) || keyguardOn()) { sleepDefaultDisplayFromPowerButton(eventTime, 0); }else{ lockNow(null /*options*/); }break; }caseSHORT_PRESS_POWER_DREAM_OR_SLEEP: { attemptToDreamFromShortPowerButtonPress(true, () - sleepDefaultDisplayFromPowerButton(eventTime, 0));break; } } } }

相关新闻

2026/8/16 14:16:53

NXP RT1060学习总结 - CAN功能细节

1 总之:永远不要通过直接阅读邮箱中的C/S字来进行轮询。相反,请读取IFLAG寄存器。 为了能够通过Rx FIFO接收CAN消息,CPU必须在冻结模式期间启用并配置RxFIFO(请参见Rx FIFO)。收到Rx FIFO中断中可用的帧(参…

2026/8/16 15:16:56

V821 AvaotaF1 Pico _ 全志Vision 如何运行smart IPC

1. 编译内核-加入ftp功能source build/envsetup.sh lunch make menuconfig 2. 加入smart IPC保存,退出。make -j2等待 SDK 编译完成,会在 out 目录下生成固件.将固件拷贝出来,准备烧录配置 Sample前往 platform/allwinner/eyesee-mpp/mi…

2026/8/16 15:16:56

Tkinter 布局助手:拖拽 3 步生成可运行的 Python GUI 界面

Tkinter 布局助手:拖拽 3 步生成可运行的 Python GUI 界面 【免费下载链接】tkinter-helper 为tkinter打造的可视化拖拽布局界面设计小工具 项目地址: https://gitcode.com/gh_mirrors/tk/tkinter-helper 写 Python 逻辑半小时,调 Tkinter 界面一…

2026/8/16 15:16:56

多序列比对修剪终极实战:trimal 手把手完整指南

多序列比对修剪终极实战:trimal 手把手完整指南 【免费下载链接】trimal A tool for automated alignment trimming in large-scale phylogenetic analyses. Development version: 2.0 项目地址: https://gitcode.com/gh_mirrors/tr/trimal 你是否有过这样的…

2026/8/16 15:16:56

告别钢筋水泥:交错层压木材(CLT)如何重塑天际线

一、逃离钢筋水泥:全球天际线迎来“木材复兴” 长久以来,拔地而起的摩天大楼是城市繁华的象征,但它们同样是温室气体排放的巨兽。根据联合国环境规划署的数据,建筑行业的碳排放占到了全球总排放量的近四成,其中混凝土和…

2026/8/16 0:00:35

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:36

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/16 0:00:35

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:36

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/15 9:46:39

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/15 4:56:16

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/15 9:46:30

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…