Android14 WMS-Power键短按流程

发布时间:2026/10/9 3:24:37

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/10/9 3:25:00

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

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

2026/10/9 18:28:34

pnpm + lerna 构建高效 Monorepo 工程化实践与依赖管理避坑指南

1. Monorepo 的整体思路与选型分析先说结论:如果你的团队正在维护超过两个前端/Node.js 项目,并且这些项目之间有公共代码需要复用,那 Monorepo 基本是绕不开的坑,也是性价比最高的解法。我自己在多个中大型项目里吃过单仓库多项目…

2026/10/9 18:28:34

从原理到实战:最简单的transformer教程二:全部注意力机制

自注意力机制(单头) 主要做的事情 1、计算 X 之间的关联程度 2、关联程度提取 X 的有用信息。 3、输出包含不同注意力分配的信息。 直接理解注意力权重(α′)只代表“看哪里、看多少”,它本身没有携带任何语义信息。我…

2026/10/9 18:28:34

边界值测试实战:从踩坑案例到完整方法论与自动化实践

1. 边界值测试到底在测什么1.1 从一个真实踩坑案例说起刚入行那会儿,我接手过一个用户注册模块的测试任务。需求文档写得很清楚:用户名长度6到20个字符。当时我年轻气盛,随手输了几个“正常”的用户名——zhangsan、lisi2024、wangwu123——全…

2026/10/9 18:23:33

临床预测模型实战:R语言从数据清洗到LASSO到DCA完整建模流程

简介:面向临床医生、医学研究人员及数据统计分析者的R语言实战资料包,围绕临床预测模型构建,系统解决数据清洗、特征筛选、模型训练、性能验证等环节,适用于疾病风险预测、预后评估等真实场景。压缩包共327个文件,以23…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑