1、使用Handler和Runnable方法实现长按按键并在设定时间后响应广播:
在 QUEUEING_FUN_KEYCODE_XXX 方法中,由于KeyEvent.ACTION_DOWN 和KeyEvent.ACTION_UP 只响应一次,故无法通过 event.getEventTime() - event.getDownTime() 来判断长按的时间,这时候两个值是一样的。
代码示例:
private Function<KeyEvent,InterceptKeyResult> QUEUEING_FUN_KEYCODE_F5 = event -> {
sosKeyClick(event);
return null;
};
/* add for soskey longpress start */
private void sosKeyClick(KeyEvent event) {
if(KeyEvent.ACTION_DOWN == event.getAction()) {
SosKeyLongClick(3000);
} else if (KeyEvent.ACTION_UP == event.getAction()) {
if (mHandler.hasCallbacks(mSOSKeyLongClickRunnable)) {
mHandler.removeCallbacks(mSOSKeyLongClickRunnable);
}/* 检查Handler
当前队列中是否包含了该Runnable,若包含,则
将从Handler
的队列中移除该Runnable
对象。即原本计划由Handler
执行的这个Runnable
任务现在不会被执行。此代码中,如果按键已经长按超过3s,则广播已经响应过了,之后再抬起按键不会执行此判断,往下走;若长按未超过3s就抬起,则这时就会进入此判断,从而移除此Handler,不会响应这个广播。 */
Intent i = new Intent();
i.setAction("com.hebs.action.ACTION_SOS_UP");
mContext.sendBroadcast(i);
}
}
private void SosKeyLongClick(int delaytime){
mHandler.postDelayed(mSOSKeyLongClickRunnable,delaytime);
}
private Runnable mSOSKeyLongClickRunnable = new Runnable(){
public void run(){
//long click
android.util.Log.e("SosKey","--------->LONG click");
Intent i = new Intent();
i.setAction("com.hebs.action.ACTION_SOS");
mContext.sendBroadcast(i);
}
};
/* add for soskey longpress end */
2、根据 event.getEventTime() - event.getDownTime() 来判断长按的时间
private void fnKeyClick(KeyEvent event) {
if (KeyEvent.ACTION_DOWN == event.getAction()) {
fnKeyLongClick(3000);
} else if (KeyEvent.ACTION_UP == event.getAction()) {
if (event.getEventTime()-event.getDownTime() >= 3000) {
Intent i = new Intent();
i.setAction("com.hebs.action.ACTION_STOP_VIDEO_RECORD");
mContext.sendBroadcast(i);
} else {
fnKeyLongClickCancle();
Intent i = new Intent();
i.setAction("com.hebs.action.ACTION_SHUTTER_NOW");
mContext.sendBroadcast(i);
}
}
}