这是当前的工作流程,我目前在活动中有一个onCreateOptionsMenu和onOptionsItemSelected实现。
包含布局(java类)并与活动一起显示的服务。是在活动的onCreate里面开始的。
但问题现在是关键事件,例如 onKeyDown()等 都在服务类中注册。
如何将焦点重新放回活动,以便能够捕获活动中定义的Key事件。
我尝试过使用localBroadcastManager并从dispatchKey
中解雇它@Override
public boolean dispatchKeyEvent(KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_MENU:
Utils.broadcastKeyEvent(getContext(), event);
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
Utils.broadcastKeyEvent(getContext(), event);
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Utils.broadcastKeyEvent(getContext(), event);
return true;
case KeyEvent.KEYCODE_DPAD_CENTER:
Utils.broadcastKeyEvent(getContext(), event);
return true;
case KeyEvent.KEYCODE_BACK:
MiscUtils.broadcastKeyEvent(getContext(), event);
return true;
}
}
我在活动中收到了keyEvent,并且能够。 openOptionsMenu并关闭它。但主要问题是一旦菜单打开,它就不会反映菜单项上的keyEvents。虽然keyEvent是在接收器内部接收的。
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
KeyEvent keyEvent = intent.getParcelableExtra(Constants.KEY_PRESSED_EVENT);
Log.d(TAG, "Receiver got ketEventCode : " + keyEvent.getKeyCode());
switch (keyEvent.getKeyCode()) {
case KeyEvent.KEYCODE_MENU:
if (isMenuOpened)
openOptionsMenu();
else
closeOptionsMenu();
break;
case KeyEvent.KEYCODE_BACK:
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
return true;
}
}
};