onKeyDown事件处理未在android中传播

onKeyDown事件处理未在android中传播,android,events,Android,Events,我有两个活动,比如说A和B。活动A有一些关键的事件处理实现,比如CHANNEL_UP和CHANNEL_DOWN。现在,当活动B可见并且按下任何键时,就会在B上调用finish。在这种情况下,键处理应该传播到活动A。但活动A的onKeyDown方法甚至没有被调用。下面提到了活动B onkeyDown的代码 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch(keyCode) {

我有两个活动,比如说A和B。活动A有一些关键的事件处理实现,比如CHANNEL_UP和CHANNEL_DOWN。现在,当活动B可见并且按下任何键时,就会在B上调用finish。在这种情况下,键处理应该传播到活动A。但活动A的onKeyDown方法甚至没有被调用。下面提到了活动B onkeyDown的代码

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    switch(keyCode) {
        case KeyEvent.KEYCODE_CHANNEL_UP:
        case KeyEvent.KEYCODE_CHANNEL_DOWN:
            finish();
            break;
    }

    return false;
}

我不希望关键事件像那样传播


听起来您可能想用
startActivityForResult
开始B,然后让它设置完成的原因,A可以处理这个问题。

我刚刚尝试了类似的实现(我使用了KeyEvent.KEYCODE\u BACK),但它也不起作用

我猜keyevent只在活动内部传播,从子视图传播到父视图,再传播到活动


如果活动被破坏,事件将消失。

这是一个选项,但根据false上的文档,应该返回false,以便让下一个接收者处理它。这是真的,但您会注意到它在“android.view”包中。它会让其他视图处理事件,但它们不会跨越活动边界。我不确定是否是这样。似乎正在调用活动A的dispatchKeyEvent,但如果操作U启动,可能是因为onkeydown已在活动B中处理。无论如何,在我的情况下,您建议的答案可能会更好。这是因为当B处于活动状态时,按键被物理按下(向下)。然后,当A处于活动状态时,它将结束,并且该按钮将被物理释放。并不是说输入事件被发送到这两个活动。