代码位置:

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


更多相关文章

  1. Android学习(十) SQLite 基于内置函数的操作方式
  2. Android应用程序键盘(Keyboard)消息处理机制分析(13)
  3. android的webview调用javascript函数并得到返回值
  4. android 9.0 收到通知消息亮屏
  5. Android 数据查询query函数参数解析
  6. Android应用程序键盘(Keyboard)消息处理机制分析(3)
  7. android键盘钩子 android按键劫持
  8. Android中通过EventBus传递消息数据

随机推荐

  1. java.lang.NoClassDefFoundError: androi
  2. import android包出错(The import android
  3. Error:Unknown host 'jcenter.bintray.co
  4. 在Android中实现多线程同步
  5. Android获取屏幕宽度与高度
  6. android 在TextView中显示EditText,通过B
  7. 【转】Android字体小结
  8. Android文本框布局实例
  9. Android-XmlPullParser解析XML
  10. Android开发个人小记