代码位置:
frameworks/base/services/input/InputDispatcher.cpp
所在函数:
-
void InputDispatcher::notifyKey( const NotifyKeyArgs* args) {
-
-
ALOGD( "notifyKey - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, action=0x%x, "
-
"flags=0x%x, keyCode=0x%x, scanCode=0x%x, metaState=0x%x, downTime=%lld",
-
args->eventTime, args->deviceId, args->source, args->policyFlags,
-
args->action, args->flags, args->keyCode, args->scanCode,
-
args->metaState, args->downTime);
-
-
if (!validateKeyEvent(args->action)) {
-
return;
-
}
-
-
uint32_t policyFlags = args->policyFlags;
-
int32_t flags = args->flags;
-
int32_t metaState = args->metaState;
-
if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {
-
policyFlags |= POLICY_FLAG_VIRTUAL;
-
flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;
-
}
-
if (policyFlags & POLICY_FLAG_ALT) {
-
metaState |= AMETA_ALT_ON | AMETA_ALT_LEFT_ON;
-
}
-
if (policyFlags & POLICY_FLAG_ALT_GR) {
-
metaState |= AMETA_ALT_ON | AMETA_ALT_RIGHT_ON;
-
}
-
if (policyFlags & POLICY_FLAG_SHIFT) {
-
metaState |= AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON;
-
}
-
if (policyFlags & POLICY_FLAG_CAPS_LOCK) {
-
metaState |= AMETA_CAPS_LOCK_ON;
-
}
-
if (policyFlags & POLICY_FLAG_FUNCTION) {
-
metaState |= AMETA_FUNCTION_ON;
-
}
-
-
policyFlags |= POLICY_FLAG_TRUSTED;
-
-
KeyEvent event;
-
event.initialize(args->deviceId, args->source, args->action,
-
flags, args->keyCode, args->scanCode, metaState, 0,
-
args->downTime, args->eventTime);
-
-
mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
-
-
if (policyFlags & POLICY_FLAG_WOKE_HERE) {
-
flags |= AKEY_EVENT_FLAG_WOKE_HERE;
-
}
-
-
bool needWake;
-
{ // acquire lock
-
mLock.lock();
-
-
if (shouldSendKeyToInputFilterLocked(args)) {
-
mLock.unlock();
-
-
policyFlags |= POLICY_FLAG_FILTERED;
-
if (!mPolicy->filterInputEvent(&event, policyFlags)) {
-
return; // event was consumed by the filter
-
}
-
-
mLock.lock();
-
}
-
-
int32_t repeatCount = 0;
-
KeyEntry* newEntry = new KeyEntry(args->eventTime,
-
args->deviceId, args->source, policyFlags,
-
args->action, flags, args->keyCode, args->scanCode,
-
metaState, repeatCount, args->downTime);
-
-
needWake = enqueueInboundEventLocked(newEntry);
-
mLock.unlock();
-
} // release lock
-
-
if (needWake) {
-
mLooper->wake();
-
}
-
}
notifyKey这个函数是按键消息,包括鼠标,键盘,遥控器,游戏手柄,虚拟键值等等消息的中转站
所以,在这个函数里你可以截获任何的按键消息,如HOME键等等,可以说这个函数就是一个水龙头,具体要做什么,就看有什么需求了。