android 按键消息,Android Framework层如何截获按键消息

代码位置:

frameworks/base/services/input/InputDispatcher.cpp

所在函数:

void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {

#if DEBUG_INBOUND_EVENT_DETAILS

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);

#endif

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键等等,可以说这个函数就是一个水龙头,具体要做什么,就看有什么需求了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值