写了这么多年软件,键盘就几十块钱一个,最近工作需要研究下android的键盘子系统,发现一个破键盘的驱动也够复杂啊,很多细节网上也找不的答案,自己一行一行的看,把网上没写清楚的加深一点奉献给大家:
dispatchOnce函数的前两个值:
nsecs_t keyRepeatTimeout = mPolicy->getKeyRepeatTimeout(); //检测是否是长按的超时时间
nsecs_t keyRepeatDelay = mPolicy->getKeyRepeatDelay();//重复发送长按事件的delay时间
函数里面的nextWakeupTime是用来标识下次唤醒的时间,由函数dispatchOnceInnerLocked(keyRepeatTimeout, keyRepeatDelay, & nextWakeupTime);计算出来。
收到键盘事件不马上处理,先放到mPendingEvent里面,加入策略处理函数,然后马上再次调度线程处理,
01-01 01:01:00.822 2404 2735 D InputDispatcher: tony.log: Is mPendingEvent NULL:0llx
01-01 01:01:00.822 2404 2735 D InputDispatcher: tony.log: get into retirving queue branch
01-01 01:01:00.822 2404 2735 D InputDispatcher: tony.log: dispatchEvent TYPE_KEY(2), queueSize: 0
01-01 01:01:00.822 2404 2735 D InputDispatcher: tony.log: +dispatchKeyLocked()
01-01 01:01:00.822 2404 2735 D InputDispatcher: tony.log: -dispatchKeyLocked() #1
01-01 01:01:00.822 2404 2735 D InputDispatcher: tony.log: done0
01-01 01:01:00.824 2404 2735 D InputDispatcher: tony.log: Is mPendingEvent NULL:154445736llx
01-01 01:01:00.824 2404 2735 D InputDispatcher: tony.log: dispatchEvent TYPE_KEY(2), queueSize: 0
01-01 01:01:00.824 2404 2735 D InputDispatcher: tony.log: +dispatchKeyLocked()
01-01 01:01:00.824 2404 2735 D InputDispatcher: tony.log: -dispatchKeyLocked() #5
01-01 01:01:00.824 2404 2735 D InputDispatcher: tony.log: done1
01-01 01:01:00.824 2404 2735 D InputDispatcher: tony.log: drop pending event 1
如果发现键盘在发生长按事件,说明不需要android自己发送自己制造的事件,把lastkey置为NULL,并且下次处理时间为无限长。
01-01 01:01:05.379 2404 2735 D InputDispatcher: tony.log: Is mPendingEvent NULL:0llx
01-01 01:01:05.379 2404 2735 D InputDispatcher: tony.log: mKeyRepeatState.lastKeyEntry:152629928llx
01-01 01:01:05.379 2404 2735 D InputDispatcher: tony.log: return without peeding
01-01 01:01:09.955 2404 2735 D InputDispatcher: tony.log: Is mPendingEvent NULL:0llx
01-01 01:01:09.955 2404 2735 D InputDispatcher: tony.log: get into retirving queue branch
01-01 01:01:09.955 2404 2735 D InputDispatcher: tony.log: dispatchEvent TYPE_KEY(2), queueSize: 0
01-01 01:01:09.955 2404 2735 D InputDispatcher: tony.log: +dispatchKeyLocked()
01-01 01:01:09.955 2404 2735 D InputDispatcher: tony.log: -dispatchKeyLocked() #1
01-01 01:01:09.955 2404 2735 D InputDispatcher: tony.log: done0
01-01 01:01:09.956 2404 2735 D InputDispatcher: tony.log: Is mPendingEvent NULL:154445736llx
01-01 01:01:09.956 2404 2735 D InputDispatcher: tony.log: dispatchEvent TYPE_KEY(2), queueSize: 0
01-01 01:01:09.956 2404 2735 D InputDispatcher: tony.log: +dispatchKeyLocked()
01-01 01:01:09.969 2404 2735 D InputDispatcher: tony.log: -dispatchKeyLocked() #5
01-01 01:01:09.969 2404 2735 D InputDispatcher: tony.log: done1
01-01 01:01:09.969 2404 2735 D InputDispatcher: tony.log: drop pending event 1