Android支持按键双击事件
Posted
最近做的东西比较杂,是得梳理一下了~
参考了这篇文章。
按键双击,这种组合键的做法类似volume down键 + power键 = 截屏
因为两个按键之间肯定会有时间差,而双击其实就是x键 + x键;
开翻~
Android上keyevent,在framework层是由window manager来负责转发,找到PhoneWindowManager,会发现这里对于keyevent的各种intercept简直就是hook的绝佳地点:
interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags)
interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)
等。。。
找到interceptKeyBeforeDispatching对volume down + power的处理(或者直接参考mHomeDoubleTapTimeoutRunnable),参考即可(可以顺着mVolumeDownKeyTriggered去看在哪里触发,在哪里判定tolerance的)
基本流程就是: volume down先被点击的时候,记录下来时间; power点击的时候,判断是否在tolerance里面; 同理,power先被点击的时候,一样记录下来时间; 在volume down被点击的时候,判断是否在tolerance里面;
这样就确定了是否是截屏“操作”,如果是,就consume这个事件(不再向上转发,直接return掉);同时通过mScreenshotRunnable去截屏。
同样,双击事件也一样(甚至更简单),前一次点击纪录下来时间,下次点击计算是否在tolerance中即可(就不贴代码了,因为太懒(烂)了。。。)
其实L的代码,在window manager这里已经实现了volume down + power、volume up + power、 double tap home;参考对应的来实现一个即可。
还有一点就是如何在屏幕没点亮的时候监听按键;
在interceptKeyBeforeQueueing中找到interactive,(还没试,应该是用这个来决定是否screen on)
就这个啦,即使这个为false的时候依然把keyevent传递出去就好了~ (或者简单点就参考power键~ )
基本如上~
TADA~