您的位置:首页 > 移动开发 > Android开发

input 之我见1

2015-07-21 17:16 369 查看

input 之我见1

InputMangerService是怎么产生的?

base/services/java/com/android/server/SystemServer.java
Slog.i(TAG, "Input Manager");
inputManager = new InputManagerService(context, wmHandler);


InputManagerService的代码位于

frameworks/base/services/java/com/android/server/input/InputManagerService.java


一开机的时候, SystemServer 会启动 InputManagerService, 这时 InputManagerService 又会去启动两个Thread,InputReaderThread,InputDispatcherThread和一个 EventHubInterface .

如何来生成两个Thread?

InputManagerSerivice.java中的构造函数
InputManagerService()
->
nativeInit()
->
com_android_server_input_InputManagerService.cpp
nativeInit()
->
new NativeInputManager()
->
new InputManager()
->
framework/native/service/inputflinger(androidL)
InputManager::InputManager(
const sp<EventHubInterface>& eventHub,
const sp<InputReaderPolicyInterface>& readerPolicy,
const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
mDispatcher = new InputDispatcher(dispatcherPolicy);
mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
initialize();
}
=>
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

以InputReaderThread为例
InputReader.cpp
InputReaderThread::InputReaderThread(const sp<InputReaderInterface>& reader) :
Thread(/*canCallJava*/ true), mReader(reader) {
}

InputReaderThread::~InputReaderThread() {
}

bool InputReaderThread::threadLoop() {
mReader->loopOnce();//这里的mReader就是InputReader的实例
return true;
}
->
void InputReader::loopOnce() {
...
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);//EventHubInterface,getEvents就是读driver的/dev目录
...

}
其中,这个线程有一个非常重要的函数getEvents,就是这个线程主要的工作
getEvents(){
...
for(; ;)
{
...
readNotifyLocked()
...
}
}
会不停的读系统输入设备的状态。

}


因此输入事件处理流程跟此三位角色有关系.InputReaderThread从EventHubInterface抓取新的inputevent, 然后在依各个的eventtype 进入各个的 event mapper, 各个的 event mapper 处理输入事件完之后,InputReaderThread 将new input 放进 Queue 中. 之后 InputDispatcherThread再从Queue中取出Input Event 放入共享内存中. 此时再通知 View 去共享内存抓取 new Input Event, 取完之后再通知InputDispatcherThread是否可以再放新的InputEvent到共享内存中,



这段话这样解释。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  services manager android