电源键 + 音量上键 长按实现关机功能 Android 9.0

  • 1 组合键关机实现
    • 1.1 添加必要参数
    • 1.1 添加 handler 信息
    • 1.3 电源键 DOWN处理
    • 1.4 电源键 UP 处理
    • 1.5 interceptCombinationShutdownChord 方法实现
    • 1.6 cancelPendingShutDownChordAction
    • 1.7 interceptKeyBeforeDispatching
    • 1.8 音量上键 DOWN/UP 处理

主要涉及修改的文件是

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
其中 interceptKeyBeforeQueueing 对按键事件进行拦截处理

1 组合键关机实现

1.1 添加必要参数

//控制组合键的间隔时长
private static final long COMBINATION_KEY_SHUTDOWN__DELAY_MILLIS = 1000;private boolean mShutDownChordVolumeUpKeyTriggered;
private long mShutDownChordVolumeUpKeyTime;
private boolean mShutDownChordVolumeUpKeyConsumed;private boolean mShutDownChordPowerKeyTriggered;
private long mShutDownChordPowerKeyTime;//定义延时发送的信息
private static final int MSG_POWER_VOLUME_COMBINATION_PRESS = 31;

1.1 添加 handler 信息

case MSG_POWER_VOLUME_COMBINATION_PRESS:if (mShutDownChordPowerKeyTriggered && mShutDownChordVolumeUpKeyTriggered) {// Intent intent1 = new Intent("android.intent.action.MAIN");// intent1.setClassName("com.android.factorytest","com.android.factorytest.framework.FactoryTestActivity");// intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// mContext.startActivity(intent1);mPowerKeyHandled = true;performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);mWindowManagerFuncs.shutdown(false);}break;

1.3 电源键 DOWN处理

     private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {+        mShutDownChordPowerKeyTriggered = true;
+        mShutDownChordPowerKeyTime = event.getDownTime();

1.4 电源键 UP 处理

     private void interceptPowerKeyUp(KeyEvent event, boolean interactive, boolean canceled) {final boolean handled = canceled || mPowerKeyHandled;mScreenshotChordPowerKeyTriggered = false;
+        mShutDownChordPowerKeyTriggered = false;cancelPendingScreenshotChordAction();cancelPendingPowerKeyAction();
+        cancelPendingShutDownChordAction();

1.5 interceptCombinationShutdownChord 方法实现

+    private void interceptCombinationShutdownChord() {+        if (mShutDownChordPowerKeyTriggered && mShutDownChordVolumeUpKeyTriggered && !mScreenshotChordVolumeDownKeyTriggered) {+            final long now = SystemClock.uptimeMillis();
+            if (now <= mShutDownChordVolumeUpKeyTime + COMBINATION_KEY_SHUTDOWN__DELAY_MILLIS
+                    && now <= mShutDownChordPowerKeyTime
+                            + COMBINATION_KEY_SHUTDOWN__DELAY_MILLIS) {+                mShutDownChordVolumeUpKeyConsumed = true;
+                cancelPendingPowerKeyAction();
+                Message msg = mHandler.obtainMessage(MSG_POWER_VOLUME_COMBINATION_PRESS);
+                mHandler.sendMessageDelayed(msg,5000);
+            }
+        }
+    }
+

1.6 cancelPendingShutDownChordAction

+    private void cancelPendingShutDownChordAction() {//从队列中移除
+        mHandler.removeMessages(MSG_POWER_VOLUME_COMBINATION_PRESS);
+    }
+

1.7 interceptKeyBeforeDispatching

    @Overridepublic long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {...
+        if ((flags & KeyEvent.FLAG_FALLBACK) == 0) {+            if (mShutDownChordVolumeUpKeyTriggered && !mShutDownChordPowerKeyTriggered) {+                final long now = SystemClock.uptimeMillis();
+                final long timeoutTime = mShutDownChordVolumeUpKeyTime
+                        + COMBINATION_KEY_SHUTDOWN__DELAY_MILLIS;
+                if (now <timeoutTime) {+                    return timeoutTime - now;
+                }
+            }
+            if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mShutDownChordVolumeUpKeyConsumed) {+                if (!down) {+                    mShutDownChordVolumeUpKeyConsumed = false;
+                }
+                return -1;
+            }
+        }
+

1.8 音量上键 DOWN/UP 处理

    @Overridepublic int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {......interceptAccessibilityShortcutChord();interceptRingerToggleChord();}
+                        mShutDownChordVolumeUpKeyTime = event.getDownTime();
+                        mShutDownChordVolumeUpKeyTriggered = true;
+                        mShutDownChordVolumeUpKeyConsumed = false;
+                        interceptCombinationShutdownChord();} else {mA11yShortcutChordVolumeUpKeyTriggered = false;
+                        mShutDownChordVolumeUpKeyTriggered = false;cancelPendingScreenshotChordAction();cancelPendingAccessibilityShortcutAction();cancelPendingRingerToggleChordAction();
+                        cancelPendingShutDownChordAction();}}

Android 组合键相关推荐

  1. android组合键截图原理,三星安卓手机怎么截图组合键 三星安卓手机截图组合键步骤...

    三星安卓手机因其综合性价比高的优势,在智能手机市场的份额非常大.所以,很多用户对三星安卓手机的一些功能都非常熟悉,比如:三星手机也有手机截图组合键,不过,三星拥有4种的组合键,不知道大家是否都了解,这 ...

  2. Android 组合键的监听

    监听遥控器的左键和右键,当连续按下左左右右后,弹出Toast private long liftTime = 0;private long rightTime = 0;int leftCount = ...

  3. android 9.0 10.0 去掉音量键+Power键组合键的屏幕截图功能

    1.概述 在10.0的系统中由WindowManagerService这个系统服务来循环读取窗口获取的消息(包括按下,弹起,双击,单击等)然后分发到各个类接收处理这些消息,在这个过程中PhoneWin ...

  4. Android 遥控器组合键的处理

    最近在做遥控器开发中,需要处理两个按键一起按时的组合键的处理,下面做个笔记 1.定义组合键处理类 import android.content.Context; import android.util ...

  5. 在Android系统中添加组合键快捷启动功能

    启动系统特定功能的组合键的判断应该在系统分发按键消息前处理, 这样从系统运行 的角度来说成本最低. 添加组合键处理需要先搞清楚按键消息在framework中采集 和分发子系统的工作流程, 虽然有and ...

  6. android 自定义组合键,Android组合按键功能定制(Framework)

    Android组合按键功能定制(Framework) 涉及文件 alps/frameworks/base/services/core/java/com/android/server/policy/Ph ...

  7. android组合按键截屏,三星安卓手机截图组合键图文汇总(4种)

    三星安卓手机因其综合性价比高的优势,在智能手机市场的份额非常大.所以,很多用户对三星安卓手机的一些功能都非常熟悉,比如:三星手机也有手机截图组合键,不过,三星拥有4种的组合键,不知道大家是否都了解,这 ...

  8. Android TV热键(快捷键、组合键)实现

    TV上一些特殊的功能入口.串口打印开关.adb调试开关.部分菜单的显示隐藏等都可以通过热键来控制. 一般组合键选用某个功能键+一串数字即可,我们可以将其封装成工具类,这里快捷键,我使用F1和几个数字键 ...

  9. Android:TV设置遥控器组合键

    这个其实很简单,就是获取用户的按键操作,按一次,我放到ArrayList,点击菜单的时候,我比对一下顺序是否正确 以下组合键顺序,上  -->  下  -->   左  -->  右 ...

最新文章

  1. API测试工具SoapUI Postman对比分析
  2. 时光机穿梭---删除文件
  3. python列表的索引算法_Python-确定列表是否对称的算法
  4. 三年经验前端社招——腾讯微保
  5. 第二阶段--个人冲刺--第十天
  6. 【TeeChart .NET教程】(七)使用函数
  7. mysql多数据源_egg-mysql配置多数据源
  8. 当前用户安装anaconda,不需要sudo权限
  9. 《深入理解分布式事务》第二章 MySQL 事务的实现原理
  10. 【C++】在控制台上跳极乐净土-easyX简单音乐及动画
  11. 计算机应用技术实验教程 网页制作,HtmlExperiment网页制作基础教程
  12. Python123 练习1
  13. UE4----GC(垃圾回收)
  14. HTML使用样式格式化文档
  15. 初步使用计算机教学设计,【教资笔试——科目三】信息技术教学设计范例
  16. python cv2读取图片后进行通道变换以及PIL阅读图像的通道转换
  17. 水木清华BBS各版面进版画面留念
  18. 特斯拉与宁波旭升 EDI项目案例
  19. sah服务器怎么修改vim,vim 编辑器(修改/etc/vim/vimrc即可)
  20. Mybatis-Plus动态表名插件实现数据库分表查询

热门文章

  1. 股票自选股基本函数大全-4
  2. 百度文心一言到底咋样?科普介绍文心一言
  3. 企业开展新闻营销的正确姿势
  4. C# 控件Anchor和Dock的区别
  5. 杂谈——2019年CSDN最新排名(附前十排名)
  6. 淘心得——浅谈淘宝网的社会化之路,互联网营销
  7. 碳中和专题最新更新:碳排放交易2013-2020年、省级碳排放效率
  8. 植物的地盘--林清玄
  9. 键盘上没有scroll lock/insert解决办法
  10. 鲁祥老师吉他课学习笔记