组合按键长按实现重启功能
PhoneWindowManager 是什么?
PWM负责Window System与framework的通信,处理与设备展示相关的事件。包括窗口管理,触摸事件,点击事件,以及Power键相关的事件处理。
什么是组合按键?
顾名思义就是两个或多个按键一起摁后实现的功能。例如手机Power键+Volume Down一起按后实现的截图功能。
那什么是组合按键长按功能?
就是两个按键同时按下多少秒后执行的功能,例如我们这一篇所要展开的主题:Power+Volume Up同时摁下5秒后重启机器。
实现思路
1)记录下第一个按键的按下时间,长按时间达到5s后执行重启操作。
这个方法中需要做的事情还是挺多的,例如记下第一个按键的按下时间,还要判断第二个按钮按下的时间是否在两个按钮的按下间隔时间内,还要在按下的途中判断是否摁住了5s且同时摁住等操作。
2)利用PhoneWindowManager中的接口实现功能。
这一篇要讲的也就是这个方法了,如果有对比过PhoneWindowManager
源码的同学就发现了,在Android12中,谷歌对PhoneWindowManager
做了很大的优化和改进,其中引进了KeyCombinationManager
类中的TwoKeysCombinationRule
方法,这个方法就是提供给两个按键同时摁下实现功能的,所以我们从这里入手实现功能。
分析过程
1)寻找到按键实现的地方
我们可以在PhoneWindowManager
的init()
中找到初始化组合按键规则的方法initKeyCombinationRules()
,就是下图中红色框出的代码。
另外绿色框出的代码片就是处理两个键组合的执行计划。
2)分析对应的方法有什么用,且在什么时候执行。
其中上图的绿色框中TwoKeysCombinationRule
的使用方法如下:
根据其中的注释可以一一解释每个方法的用法,
preCondition()
:检查是否需要拦截按键,前置条件,(需要注意的是:这个方法不仅仅被注册的两个按键会触发,其他组合按键、单个按键摁下也会执行到这个方法)。
execute()
:触发动作,也就是我们需要组合按键执行的内容。
cancel()
:取消动作。这个方法是两个按键一起摁下后抬起后才会执行此方法。
实现结果
首先在PhoneWindowManager
实现一个线程来执行重启的操作:
private final RebootRunnable mRebootRunnable = new RebootRunnable();
// 实现重启的线程方法
private class RebootRunnable