如何在CountDownTimer中调用onKeyDown?第二个参数应传入什么?
嘿,其实你没必要硬着头皮构造一个KeyEvent来调用onKeyDown方法——毕竟你在这个方法里真正要执行的核心逻辑只是取消并重启定时器对吧?
最优方案:抽离核心逻辑(推荐)
把定时器操作单独抽成一个私有方法,这样不管是按键触发还是在CountDownTimer里调用都更简洁,还能避免构造KeyEvent的麻烦:
// 抽离定时器重置逻辑 private void resetTimer() { TheTimer.cancel(); TheTimer.start(); } // 修改原onKeyDown方法,调用抽离后的方法 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { resetTimer(); return true; } else { return super.onKeyDown(keyCode, event); } }
之后在你的CountDownTimer里,直接调用resetTimer()就可以实现需求了,完全不需要碰onKeyDown方法。
如果非要构造KeyEvent(不推荐,但提供方法)
如果你坚持要通过调用onKeyDown来实现,那么可以用KeyEvent的静态obtain()方法创建实例:
// 创建一个音量下键的按下事件 KeyEvent volumeDownEvent = KeyEvent.obtain( null, // 事件源,可传null SystemClock.uptimeMillis(), // 事件时间戳,用系统当前时间即可 KeyEvent.ACTION_DOWN, // 事件类型:按下 KeyEvent.KEYCODE_VOLUME_DOWN, // 按键码 0 // 重复次数,0表示单次按下 ); // 调用onKeyDown方法 onKeyDown(KeyEvent.KEYCODE_VOLUME_DOWN, volumeDownEvent); // 记得用完回收事件,避免内存泄漏 volumeDownEvent.recycle();
不过还是强烈推荐第一种方案,它更符合代码设计的单一职责原则,后续维护和修改逻辑也更方便。
内容的提问来源于stack exchange,提问作者Jackson Ennis
相关产品推荐
相关产品推荐

