前言:为了满足产品需求,或者开发童鞋想开个后门,可以在一些特定按键做一些特殊操作,这个时候我们需要监听程序的按键事件。
一、部署变量、方法
1、定义变量
首先,新建几个变量用于对应按键事件
private static final int number8 = KeyEvent.KEYCODE_8; //用于监听哪个按键,这个可以自己去修改成相对应的按键
private static final int number9 = KeyEvent.KEYCODE_9;//用于监听哪个按键,这个可以自己去修改成相对应的按键
private static final int MSG_KEY_TIME = 1; //handler消息
private static final int KEY_TIMEOUT = 3000;//按键多少秒内有效
private static final CodeContainer showVersionCodes = new CodeContainer(new int[]{number9, number9, number8, number8}); //需要新建一个内部类,用于保存按键变量
2、类与方法
变量定义完成后,我们需要相对应的类与方法去支持监听按键操作,所以需要定义以下方法与内部类
- //方法介绍,定义静态内部类用于接收对应的按键code
-
private static class CodeContainer { private int index; private int[] codes; //按键排列方式 CodeContainer(int[] codes) { this.codes = codes; } void clear() { index = 0; } }
- //方法介绍,用于监听按键传进来的keycode与keyevent,用于判断是否对应相关按键,并且是否属于多少秒内响应
-
public void onKey(Context context, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { keyHandler.removeMessages(MSG_KEY_TIME); keyHandler.sendEmptyMessageDelayed(MSG_KEY_TIME, KEY_TIMEOUT); if (match(showVersionCodes, keyCode)) { //显示版本号 Toast.makeText(context, "Versioncode:" + BuildConfig.VERSION_CODE, Toast.LENGTH_LONG).show(); } } }
-
//方法介绍,用于判断按下次数是否对应的上需要监听的按键次数及code private boolean match(CodeContainer container, int keyCode) { if (container.index >= container.codes.length) { return false; } if (container.codes[container.index] == keyCode) { container.index++; if (container.index == container.codes.length) { container.clear(); return true; } } else { container.clear(); } return false; }
- //介绍,用于清空按键次数
-
Handler keyHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == MSG_KEY_TIME) { showVersionCodes.clear(); } } };
还在想着怎样调用的小伙伴们别着急,调用很简单
你写在某个类里面,直接在你需要用到的地方,例如(onkeydown,又或者dispatchKeyEvent里面调用)
在外面先定义一个全局变量
类名 private XXXX xxx ;
xxx = new XXXX()
xxx.onkey
大功告成啦,快去看看吧。是不是简单又方便!~
还是不懂的小伙伴,想要源码的也可以私我!~