读书人

Android中按键讯息分发机制2

发布时间: 2013-10-31 12:03:52 作者: rapoo

Android中按键消息分发机制2

前面一篇文章我对消息分发机制做了一个开头,如果大家还没有阅读,可以先去阅读一下:

Android中按键消息分发机制1。上一篇在结尾说明了如果WMS没有处理掉该消息,那么这个消息是会传到客户端窗口的,那么客户端窗口时在哪里接受这个消息的呢?我先告诉你是在MessageQueue中的next方法获取的,我们先停在这里回忆一下吧。

我在前一篇的开始对Android2.2中消息分发机制做了简要说明,在2.2中,这些消息都是在java层处理的,并将获得的按键消息放在MessageQueue中,但是2.3以后这些都是在native层处理的,难道还是放在MessageQueue中的?当然不是,所以导致从2.3以后,MessageQueue中的next函数发生了改变,你们可以找来2.2和2.3以后的代码做比较,一个很明显的变化就是在2.3的代码中会调用一个nativePollOnce函数,我们来好好分析一下这个MessageQueue吧,首先看构造函数:


public boolean dispatchKeyEvent(KeyEvent event) {        // If any attached key listener a first crack at the event.        //noinspection SimplifiableIfStatement        if (android.util.Config.LOGV) {            captureViewInfo("captureViewKeyEvent", this);        }        if (mOnKeyListener != null && (mViewFlags & ENABLED_MASK) == ENABLED                && mOnKeyListener.onKey(this, event.getKeyCode(), event)) {            return true;        }        return event.dispatch(this, mAttachInfo != null                ? mAttachInfo.mKeyDispatchState : null, this);}

在该函数中会先检查mOnKeyListener是否为空,如果不为空,就会调用mOnKeyListener中的onKey方法,如果onKey方法处理了这个消息,直接返回true,如果没有处理,则调用event.dispatch方法,我们上面已经分析了,这个方法里面就是调用receiver的onKeyDown和onKeyUp等方法。

分析过程差不多完了,可能过程有点凌乱,没办法,这个过程实在有点复杂,如果大家有哪里看不懂,可以给我留言。


读书人网 >Android

热点推荐