一般情况下,当按键按下的时候,会调用onkeydown方法,除了home键
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 返回字符编码
final int uniChar = event.getUnicodeChar();
// 让基类处理按下事件
final boolean handled = super.onKeyDown(keyCode, event);
final boolean isKeyNotWhitespace = uniChar > 0 && !Character.isWhitespace(uniChar);
// 如果基类没有进行处理,输入法非全屏 输入的字符串没有空格
if (!handled && acceptFilter() && isKeyNotWhitespace) {
boolean gotKey = TextKeyListener.getInstance().onKeyDown(mWorkspace, mDefaultKeySsb,
keyCode, event);
if (gotKey && mDefaultKeySsb != null && mDefaultKeySsb.length() > 0) {
// something usable has been typed - start a search
// the typed text will be retrieved and cleared by
// showSearchDialog()
// If there are multiple keystrokes before the search dialog takes focus,
// onSearchRequested() will be called for every keystroke,
// but it is idempotent, so it's fine.
return onSearchRequested();
}
}
// Eat the long press event so the keyboard doesn't come up.拦截菜单键的长按事件
if (keyCode == KeyEvent.KEYCODE_MENU && event.isLongPress()) {
return true;
}
return handled;
如果是back键,则会调用onBackPress
@Override
public void onBackPressed() {
if (mLauncherCallbacks != null && mLauncherCallbacks.handleBackPressed()) {
return;
}
//如果位于应用程序菜单,则返回到桌面
if (isAppsViewVisible()) {
showWorkspace(true);
} else if (isWidgetsViewVisible()) {
// 如果在应用程序菜单的其他标签,则到预览模式
showOverviewMode(true);
} else if (mWorkspace.isInOverviewMode()) {
// 如果在预览模式则返回到桌面
showWorkspace(true);
} else if (mWorkspace.getOpenFolder() != null) {
// 如果打开文件夹,则关闭
Folder openFolder = mWorkspace.getOpenFolder();
if (openFolder.isEditingName()) {
openFolder.dismissEditingName();
} else {
closeFolder();
}
} else {
mWorkspace.exitWidgetResizeMode();
// Back button is a no-op here, but give at least some feedback for the button press
mWorkspace.showOutlinesTemporarily();
}
}
我们都知道,点击按键,分别会有onkeydow,onkeyup的处理,那么这个事件是有谁来分发的呢。通过日志,我们可以发现,在这两个方法之前,都会调用dispatchkeyevent。那么我们看一下activiy中该方法的实现:
public boolean dispatchKeyEvent(KeyEvent event) {
onUserInteraction();
// Let action bars open menus in response to the menu key prioritized over如果点击的是menu,则展开菜单
// the window handling
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU &&
mActionBar != null && mActionBar.onMenuKeyEvent(event)) {
return true;
}
将事件分发到窗口的根视图
Window win = getWindow();
if (win.superDispatchKeyEvent(event)) {
return true;
}
View decor = mDecor;
if (decor == null) decor = win.getDecorView();
return event.dispatch(this, decor != null
? decor.getKeyDispatcherState() : null, this);
}
我们再看一下Launcher中对该方法的处理
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_HOME:
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (Utilities.isPropertyEnabled(DUMP_STATE_PROPERTY)) {
dumpState();
return true;
}
break;
}
} else if (event.getAction() == KeyEvent.ACTION_UP) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_HOME:
return true;
}
}
return super.dispatchKeyEvent(event);
}
根据代码我们发现,他只是对按下音量键的时候打印了一下日志,至于home键,我们还是在onbackpress中进行处理。