按键事件

对于按键事件,调用mDevices->layoutMap->map进行映射。映射实际是由 KeyLayoutMap::map完成的,KeyLayoutMap类里读取配置文件qwerty.kl,由配置 文件 qwerty.kl 决定键值的映射关系。你可以通过修 改./development/emulator/keymaps/qwerty.kl来改变键值的映射关系。

JNI 函数
在frameworks/base/services/jni/com_android_server_KeyInputQueue.cpp文 件中,向 JAVA提供了函数android_server_KeyInputQueue_readEvent,用于读 取输入设备事件。
C代码:

static jboolean android_server_KeyInputQueue_readEvent(JNIEnv* env, jobject clazz,
jobject
event)
{
gLock.
lock();
sp hub
= gHub;
if (hub == NULL) {
hub
= new EventHub;
gHub
= hub;
}
gLock.unlock();
int32_t deviceId;
int32_t type;
int32_t scancode, keycode;
uint32_t flags;
int32_t value;
nsecs_t when;
bool res = hub->getEvent(&deviceId, &type, &scancode, &keycode,
&flags, &value, &when);
env
->SetIntField(event, gInputOffsets.mDeviceId, (jint)deviceId);
env
->SetIntField(event, gInputOffsets.mType, (jint)type);
env
->SetIntField(event, gInputOffsets.mScancode, (jint)scancode);
env
->SetIntField(event, gInputOffsets.mKeycode, (jint)keycode);
env
->SetIntField(event, gInputOffsets.mFlags, (jint)flags);
env
->SetIntField(event, gInputOffsets.mValue, value);
env
->SetLongField(event, gInputOffsets.mWhen,
(jlong)(nanoseconds_to_milliseconds(when)));
return res;
}

readEvent调用hub->getEvent读了取事件,然后转换成JAVA的结构。

事件中转线程
在frameworks/base/services/java/com/android/server/KeyInputQueue.java 里创建了一个线程,它循环的读取事件,然后把事件放入事件队列里。
Java代码:

Thread mThread = new Thread("InputDeviceReader") {
public void run() {
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);

try {
RawInputEvent ev = new RawInputEvent();
while (true) {
InputDevice di;

// block, doesn't release the monitor
readEvent(ev);

boolean send = false;
boolean configChanged = false;

if (false) {
Log.i(TAG, "Input event: dev=0x"
+ Integer.toHexString(ev.deviceId)
+ " type=0x" + Integer.toHexString(ev.type)
+ " scancode=" + ev.scancode
+ " keycode=" + ev.keycode
+ " value=" + ev.value);
}

if (ev.type == RawInputEvent.EV_DEVICE_ADDED) {
synchronized (mFirst) {
di = newInputDevice(ev.deviceId);
mDevices.put(ev.deviceId, di);
configChanged = true;
}
}

            ......           }         }       } };

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android开发艺术探索
  3. Android(安卓)View的onTouch、onClick和onLongClick事件分析
  4. Android(安卓)View 事件分发机制详解
  5. Android:使用Socket网络通信时异常:java.net.SocketException: soc
  6. ios 开发之基础控件
  7. android 事件模型
  8. Android(安卓)dispatchTouchEvent源码分析
  9. Android上下左右手势滑动事件处理

随机推荐

  1. android 对图像进行矩阵变换(Martix)的使
  2. Android中launcherMode="singleTask"详解
  3. 运行android的SDK Manager.exe无反应
  4. Android(安卓)AsyncTask usage
  5. 手机玩转局域网利器dsploit(csploit)
  6. Android基础--------Android常用控件介绍
  7. Android在线更新SDK的方法(使用国内镜像)
  8. android Shader类简介_渲染图像
  9. 异常 报错 Android(安卓)library project
  10. Android(安卓)滑动效果入门篇(一)—— View