android中上层是如何接收按键事件的

1631阅读 0评论2011-06-10 yuzaipiaofei
分类:LINUX

frameworks/base/libs/ui/EventHub.cpp
按电源键后,系统把scanCode写入对应的设备接点,frameworks/base/libs/ui/EventHub.cpp去读这个设备结点,并把scanCode通过.kl文件对应成keyCode发送到上层
framework/base /services/java/com/android/server/KeyInputQueue.java通过jni调用framework /base/services/jni/com_android_server_KeyInputQueue.cpp调用EventHub.cpp里的文件。
KeyInputQueue.java进入死循环先执行readEvent,调用EventHub.cpp中的getEvent等待输入。
EventHub.cpp 中的getEvent进入死循环,执行pollres = poll(mFDs, mFDCount, -1)等待设备结点处有数据写入(也就是有键按下),当有数据写入时执行下面的for循环,找出是那个fd中有内容写入,并读出写入的数据res = read(mFDs[i].fd, &iev, sizeof(iev))。这里只读出了TYPE和Scancode(),而不会有Keycode,硬件层只能向设备文件写入Scancode,而 Keycode是上层要用的,由map得到。接下来接用err = mDevices[i]->layoutMap->map(iev.code, outKeycode, outFlags)map出Scancode对应的Keycode和Flags。mpa是在中实现的,是在m_keys中根据scanCode找到这两个值。而m_keys是在KeyLayoutMap.cpp这个文件中load时,读取kl(一般在手机的/system/usr/keylayout文件夹下)文件,解析出所有的scanCode对应的keyCode和flag来并加到m_keys中得到的。kl文件中的类似宏的字符如POWER是在 frameworks/base/include/ui/KeycodeLabels.h中对应出来的。

   WindowManagerService.java文件,我们找 到WindowManagerService的构造函数,(至于WindowManagerService这个类在android整个系统中的作用将是我 接下来需要研究的内容,在这里先不做研究)
private WindowManagerService(Context context, PowerManagerService pm,
boolean haveInputMethods) {
...........................
..........................
mQueue = new KeyQ();
mInputThread = new InputDispatcherThread();
........................................
.......................................
mInputThread.start();
// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
}
发现在这个构造函数里将新起一个线程。看取的名字就应该能猜出是用来获取用户输入的。KeyQ我们可以看到是派生自KeyInputQueue类的,继续 打开KeyInputQueue查看,可以看到在构造函数中同样起了一个线程,而且这个线程是一个死循环,它会在这么一个循环中不停的调用 readEvent()这么一个函数.

上一篇:Android Keyboard/Touch Panel分析
下一篇:S3C2440裸机学习 - LCD驱动原理及代码分析 [转]