WEB开发网
开发学院手机开发Android 开发 Android 事件传递机制 阅读

Android 事件传递机制

 2010-03-24 05:33:00 来源:WEB开发网   
核心提示:在系统启动过程中,会加载驱动程序,Android 事件传递机制,初始化硬件设备,会进入bool EventHub::openPlatformInput(void)这个函数,具体实现是:Thread mThread = new Thread("InputDeviceReader") {public v

在系统启动过程中,会加载驱动程序,初始化硬件设备,会进入bool EventHub::openPlatformInput(void)这个函数,该函数主要功能是扫描/dev/input该目录,获取输入设备。如何获取呢?通过linux API res = scan_dir(device_path); 该函数叫

while((de = readdir(dir))) {

strcpy(filename, de->d_name);

open_device(devname);

}

不断读取目录文件,然后通过open_device()打开设备。具体打开设备函数是fd = open(deviceName, O_RDWR);以读写方式打开,该函数会调用驱动里file_operations里的实现函数。

此时所有输入设备已经打开。

在WindowManagerService服务类运行的时候,在构造函数中会创建内部类KeyQ对象. 该类继承之KeyInputQueue类。当然要进入该类的构造函数。在KeyInputQueue类的构造函数中会启动Thread mThread=new Thread("InputDeviceReader")这个匿名内部类线程,有该线程读驱动事件并把它放到消息队列中。具体实现是:

Thread mThread = new Thread("InputDeviceReader") {

public void run() {

RawInputEvent ev = new RawInputEvent();

while (true) {

InputDevice di;

readEvent(ev);

}

}

该线程持续运行,循环通过readEvent(); 该函数是个native方法,具体实现为

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);

}

以上步骤获得了事件QueuedEvent。

获得事件后通过

private void addLocked(InputDevice device, long when, int flags,

1 2 3  下一页

Tags:Android 事件 传递

编辑录入:coldstar [复制链接] [打 印]
赞助商链接