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; } } } }

相关新闻

FastCSV 为什么这么快?高性能 CSV 解析背后的 5 个优化秘诀

FastCSV 为什么这么快?高性能 CSV 解析背后的 5 个优化秘诀

FastCSV 为什么这么快?高性能 CSV 解析背后的 5 个优化秘诀 【免费下载链接】FastCSV Fast, lightweight, and RFC 4180 compliant CSV library for Java. Zero dependencies, ~90 KiB. Trusted by Apache NiFi, JUnit, and Neo4j. 项目地址: https://gitcode.com…

2026/10/12 12:35:21 阅读更多 →
NXP RT1060学习总结 - CAN功能细节

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

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

2026/10/12 13:24:10 阅读更多 →
MiniMax Music 3 环境搭建教程:SGLang-Omni 部署与 API 调用从零开始

MiniMax Music 3 环境搭建教程:SGLang-Omni 部署与 API 调用从零开始

MiniMax Music 3 环境搭建教程:SGLang-Omni 部署与 API 调用从零开始 【免费下载链接】MiniMax-Music3 项目地址: https://ai.gitcode.com/MiniMax-AI/MiniMax-Music3 MiniMax Music 3 是 MiniMax 开源的AI 音乐生成模型,只需一段歌词 一段音乐…

2026/10/12 13:24:06 阅读更多 →

最新新闻

Windows下Claude Code安装配置与避坑全攻略

Windows下Claude Code安装配置与避坑全攻略

“Claude Code 在 Windows 上到底能不能用?”——这恐怕是过去一个月我在各种技术群里被问最多的问题。一方面,这个命令行形态的 AI 编程代理确实很香,直接在终端里让它读仓库、改代码、跑测试、提 PR,整个工作流都在一个地方流转…

2026/10/13 12:59:11 阅读更多 →
ArcGIS实战:南京shp数据从加载到空间分析全流程

ArcGIS实战:南京shp数据从加载到空间分析全流程

简介:这份资源是面向ArcGIS用户的南京市矢量地理数据集,适合从事城市规划、交通分析、环境评估等工作的GIS学习者与从业者使用。数据以Shapefile格式组织,涵盖建筑、道路网、水系、绿地、地铁、铁路、各级公路及行政边界等要素,可…

2026/10/13 12:59:11 阅读更多 →
网页配色不再失控:色彩规范与搭配方法全解析

网页配色不再失控:色彩规范与搭配方法全解析

去年年中我接手链环科技的一个网页改版项目,设计要求是“保持品牌感,但又不能太老气”。听起来很常规,真正落到页面时才发现色彩层面完全是失控的:四个主页面用了十几种蓝色,每个按钮的深浅都不一样,就连同…

2026/10/13 12:59:11 阅读更多 →
Vibe Coding实战:从AI辅助编程到全栈开发效率革命

Vibe Coding实战:从AI辅助编程到全栈开发效率革命

1. 先聊聊“Vibe Coding”这阵风是怎么吹起来的Vibe Coding,如果你最近刷技术社区或者朋友圈,很难不被这个词反复刷屏。它说的是那种“凭感觉写代码”的状态:你不再逐行敲语法、抠括号,而是用自然语言把需求讲清楚,让A…

2026/10/13 12:59:11 阅读更多 →
AI编程教程爆火背后:本地化协作者设计与场景流实践

AI编程教程爆火背后:本地化协作者设计与场景流实践

1. 项目概述:一个被“豆包”推荐的AI编程教程,到底做对了什么?“2 万 Star,我的 AI 编程教程被豆包推荐了!”——这句话乍看像社交媒体上的爆款标题,但背后藏着一个非常具体、可复现、且极具现实参考价值的…

2026/10/13 12:59:11 阅读更多 →
从零搭建ELK日志分析平台:架构设计、组件选型与实战调优

从零搭建ELK日志分析平台:架构设计、组件选型与实战调优

说实话,我在接手公司日志平台之前,排查故障靠的是“三件套”组合拳:登录服务器、grep关键字、tail -f盯屏幕。最开始那几年业务量不大,这招勉强够用,可一旦服务器数量超过两位数、日志格式五花八门,这套土办…

2026/10/13 12:58:10 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →