Java 监听按键事件会阻止按键工作

Java 监听按键事件会阻止按键工作,java,android,Java,Android,我是android新手,我正在制作一款应用程序,它可以连续按上下音量键,并振动一个模式 我尝试过使用dispatchKeyEvent(),它可以很好地检测音量的上升和下降,但它会阻止用户更改音量 public boolean dispatchKeyEvent(KeyEvent event) { int action = event.getAction(); int keyCode = event.getKeyCode(); switch (keyCode) {

我是android新手,我正在制作一款应用程序,它可以连续按上下音量键,并振动一个模式

我尝试过使用dispatchKeyEvent(),它可以很好地检测音量的上升和下降,但它会阻止用户更改音量

public boolean dispatchKeyEvent(KeyEvent event) {
    int action = event.getAction();
    int keyCode = event.getKeyCode();
    switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            if (action == KeyEvent.ACTION_DOWN) {
                System.out.println("UP"); // I know i can use Log but this is quicker to type
            }
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            if (action == KeyEvent.ACTION_DOWN) {
                System.out.println("DOWN");
            }
            return true;
        default:
            return super.dispatchKeyEvent(event);
    }
}
此外,我希望能够在屏幕关闭(应用程序在后台)时执行此操作,但服务无法与关键事件交互

我发现到处都是相互矛盾的答案;我以前使用的一个应用程序在后台播放声音,屏幕关闭,电源按钮连续按下3次,但这里的许多问题都有类似于“不可能”的答案

我不介意使用电源按钮而不是音量键(事实上两者都很好),但这似乎更难实现

TLDR:

  • 如何阻止侦听器阻止他们正在侦听的键

    二,。如何在后台运行

  • 任何帮助都将不胜感激

    编辑:关于第二条,我找到了一种方法,通过在服务中注册一个广播接收器并收听screen off和screen on意图来使用电源按钮

    如何阻止侦听器阻止他们正在侦听的键

    从中可以看出,如果不需要阻止密钥,只需调用
    super.dispatchKeyEvent(事件)否则,如果
    返回true这意味着您消费了事件,没有人会知道事件

    如何在后台运行


    我认为,这是不可能的。Android有一项服务,可以做后台工作,但这不是处理系统按钮点击的方式

    覆盖
    活动的
    onKeyDown()
    更容易;因为它总是
    KeyEvent.ACTION\u DOWN

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP: {
                System.out.println("UP");
            }
            case KeyEvent.KEYCODE_VOLUME_DOWN: {
                System.out.println("DOWN");
            }
        }
        return super.onKeyDown(keyCode, event);
    }
    

    嗨,谢谢你的回答,你的回答阻止了它挡住钥匙。至于在后台运行,我以前见过这样做的应用程序,但“不可能”似乎是这个问题最常见的答案。“真是莫名其妙!”大卫说。可能会改变方式。@Dimitro Ivanov我有一个模式,我想在屏幕关闭时振动(当屏幕关闭时,应用程序可以在后台),用户可以通过组合音量键或按电源键来触发它。@DavidPH如你所知,一个音量键和电源键已经由Android操作系统处理。这不是常见的问题,但请继续。快乐编码@DavidPH在这里还解释道:……您没有听“按键事件”(如标题所述),而是听按键发送事件。重写框架的类并调用/返回
    super()
    类的over riden方法可能会产生最小的副作用。为事件返回
    true
    ,意味着它们已经被消耗了,并且不会再冒泡(这可能是期望的或不期望的)。