代码定位

路径:frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {.....................case KeyEvent.KEYCODE_POWER: {EventLogTags.writeInterceptPower(KeyEvent.actionToString(event.getAction()),mPowerKeyHandled ? 1 : 0, mPowerKeyPressCounter);// Any activity on the power button stops the accessibility shortcutcancelPendingAccessibilityShortcutAction();result &= ~ACTION_PASS_TO_USER;isWakeKey = false; // wake-up will be handled separatelyif (down) {interceptPowerKeyDown(event, interactive);//按下动作  interactive->是否亮屏} else {interceptPowerKeyUp(event, interactive, canceled);//释放动作}break;}case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN:// fall throughcase KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP:// fall throughcase KeyEvent.KEYCODE_SYSTEM_NAVIGATION_LEFT:// fall throughcase KeyEvent.KEYCODE_SYSTEM_NAVIGATION_RIGHT: {if(!isBox){result &= ~ACTION_PASS_TO_USER;interceptSystemNavigationKey(event);}break;}.....................}

根据上述代码追踪到这个interceptPowerKeyUp()函数接口

private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) {final boolean handled = canceled || mPowerKeyHandled;mScreenshotChordPowerKeyTriggered = false;cancelPendingScreenshotChordAction();cancelPendingPowerKeyAction();if (!handled) {if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) == 0) {// Abort possibly stuck animations only when power key up without long press case.mHandler.post(mWindowManagerFuncs::triggerAnimationFailsafe);}// Figure out how to handle the key now that it has been released.mPowerKeyPressCounter += 1;final int maxCount = getMaxMultiPressPowerCount();final long eventTime = event.getDownTime();if (mPowerKeyPressCounter < maxCount) {// This could be a multi-press.  Wait a little bit longer to confirm.// Continue holding the wake lock.Message msg = mHandler.obtainMessage(MSG_POWER_DELAYED_PRESS,interactive ? 1 : 0, mPowerKeyPressCounter, eventTime);msg.setAsynchronous(true);mHandler.sendMessageDelayed(msg, ViewConfiguration.getMultiPressTimeout());return;}// No other actions.  Handle it immediately.powerPress(eventTime, interactive, mPowerKeyPressCounter);}// Done.  Reset our state.finishPowerKeyPress();}

然后注意到上述一个函数接口 powerPress(eventTime, interactive, mPowerKeyPressCounter);

 private void powerPress(long eventTime, boolean interactive, int count) {if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) {Slog.i(TAG, "Suppressed redundant power key press while "+ "already in the process of turning the screen on.");return;}Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive+ " count=" + count + " beganFromNonInteractive=" + mBeganFromNonInteractive +" mShortPressOnPowerBehavior=" + mShortPressOnPowerBehavior);if (count == 2) {powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);} else if (count == 3) {powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);} else if (interactive && !mBeganFromNonInteractive) {switch (mShortPressOnPowerBehavior) {case SHORT_PRESS_POWER_NOTHING:break;case SHORT_PRESS_POWER_GO_TO_SLEEP:String product = SystemProperties.get("ro.target.product","");if (!TextUtils.isEmpty(product) && (product.equals("box") || product.equals("atv"))) {int powerKey = SystemProperties.getInt("persist.sys.power_key",0);Slog.i("ROCKCHIP", "powerKey = " + powerKey);if (powerKey == 1) {shutDown();} else if (powerKey == 2) {reboot();} else {goToSleepFromPowerButton(eventTime, 0);}} else {goToSleepFromPowerButton(eventTime, 0);}break;case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:goToSleepFromPowerButton(eventTime, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);break;case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:if (goToSleepFromPowerButton(eventTime,PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE)) {launchHomeFromHotKey(DEFAULT_DISPLAY);}break;case SHORT_PRESS_POWER_GO_HOME:shortPressPowerGoHome();break;case SHORT_PRESS_POWER_CLOSE_IME_OR_GO_HOME: {if (mDismissImeOnBackKeyPressed) {if (mInputMethodManagerInternal == null) {mInputMethodManagerInternal =LocalServices.getService(InputMethodManagerInternal.class);}if (mInputMethodManagerInternal != null) {mInputMethodManagerInternal.hideCurrentInputMethod(SoftInputShowHideReason.HIDE_POWER_BUTTON_GO_HOME);}} else {shortPressPowerGoHome();}break;}}}}

如果想取消短按熄屏如何做呢?接下来是我的做法如下

case SHORT_PRESS_POWER_GO_TO_SLEEP:String product = SystemProperties.get("ro.target.product","");if (!TextUtils.isEmpty(product) && (product.equals("box") || product.equals("atv"))) {int powerKey = SystemProperties.getInt("persist.sys.power_key",0);Slog.i("ROCKCHIP", "powerKey = " + powerKey);if (powerKey == 1) {shutDown();} else if (powerKey == 2) {reboot();} else {//goToSleepFromPowerButton(eventTime, 0);}} else {//goToSleepFromPowerButton(eventTime, 0);}break;

Android 开关机POWER键 长按短按代码分析相关推荐

  1. android power 按键,Android Framework层Power键关机流程(一,Power长按键操作处理)

    一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...

  2. android power键测试,Android Framework层Power键关机流程(一,Power长按键操作处理)...

    一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...

  3. Android Framework层Power键关机流程(二,关机流程)

    二,关机流程 从前一篇博文我们知道,当用户长按Power键时会弹出(关机.重启,飞行模式等选项)对话框,我们点击关机,则会弹出关机确认对话框.那么从选项对话框到关机确认对话框又是一个什么流程呢.下面我 ...

  4. android 开关机动画

    开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用&qu ...

  5. Android开关机定制(动画,声音)

    转:http://blog.csdn.net/mk1111/article/details/9472603 系统通常默认支持开机动画,开机关机铃声服务倒是预先定义了,不过使用时需要在/sysytem/ ...

  6. android开关机动画铃声

    1. 开 关机 动画的启动 Android系统在init.rc中定义了很多Service,具体定义格式可以参考<Android Platform Developer's Guide>中的& ...

  7. android开关机日志_(android 关机/重启)Android关机/重启流程解析

    --------------------------------Introduction-------------------------- 1. 在PowerManager的API文档中,给出了一个 ...

  8. android开关机动画和铃声配置 MTK编译笔记

    1, MTK平台开关机动画配置, 将需要调整的开关机动画和铃声放到alps\frameworks\base\data\sounds 这个目录下面,打开 该目录下的Android.mk文件,增加下面的编 ...

  9. mtk使用android开关机动画,android MTK修改开关机动画

    一丶修改开机logo ① device/tangxun/tx6580_weg_m/ProjectConfig.mk   中BOOT_LOGO=hd720  可知开机的图标在hd720文件夹中(这个需要 ...

最新文章

  1. sqlserver中能用when_sqlserver中if语句顶替when.case.语句
  2. python字典嵌套列表怎么访问值的某个元素_通过键列表访问嵌套字典项?
  3. Codeforces 919 D Substring
  4. progress与meter的区别
  5. USTC English Club Note20211108
  6. 腾讯专家教你如何保证应用开发安全
  7. 使用 ConfigMap 挂载配置文件
  8. matplotlib布局_Matplotlib多列,行跨度布局
  9. LeetCode 1887. 使数组元素相等的减少操作次数(map)
  10. jQuery - Bootstrap 3 and Youtube in Modal
  11. Erlang初学:Erlang的一些特点和个人理解总结
  12. 林老师话说天南地北  我的学生在美国西雅图微软总部
  13. R数据分析:用lme4包拟合线性和非线性混合效应模型
  14. VS2019插件VSIX开发
  15. 关于二重积分,三重积分的理解
  16. 私域增长 | 私域会员:9大连锁行业15个案例集锦
  17. Lua中,泛型for循环遍历table时,ipairs和pairs的区别
  18. organization --form 表单中organization 数据来源
  19. 关于蜂产品保健的一些介绍
  20. 【报告分享】2021电商618生态洞察报告-亿邦动力研究院(附下载)

热门文章

  1. pyinstaller打包exe(详细教程)
  2. Tomcat 安装教程
  3. 如何学习软件测试?(附流程图)
  4. 基于SSH框架的在线考勤系统开发的质量属性
  5. chrome加速广告播放
  6. java bytebuffer_聊聊JAVA的ByteBuffer
  7. Java封装树形结构(任意父节点)
  8. python中ndarray怎么保存_Numpy数组应该怎么保存与读取
  9. IntelliJ IDEA 恢复英文界面
  10. 九宫格算法Python