在android中处理键盘事件是怎么实现的 请详细说一下 是哪个文件里的 程序名字 引发事件流程(例如 我按一个键 这个键能打开一个窗口 实现打开窗口的代码在哪个文件里 实现流程是怎样的) 谢谢!

解决方案 »

  1.   

    看下frameworks\policies\base\phone\com\android\internal\policy\impl下面的代码吧。
      

  2.   

    都是intent了,打开窗口时startActivity
      

  3.   

    在android系统的/system/usr/layout/query.kl里有个表,第一行的数字是kernel传上来的键值,就是你按了一个键之后,kernel传给文件系统的值。后面的就是文件系统的响应信号,你想让它干吗就在后面写什么。不过如果系统没这个信号的响应动作,需要你自己去写。在phonewindows.java里去添加响应函数。
      

  4.   

    frameworks/base/libs/ui/EventHub.pp
    按电源键后,系统把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中对应出来的。
      

  5.   

    你好:
    当按下键盘时onkeydown()函数是死循环的,我能不能解决这个问题呢?也就是长按键盘,让Onkeydown()函数只执行一次?