概述
WMS
而这里的复杂步骤涉及到frameWork层,我们就从WMS开始吧,
先是有SystemServer启动的WMS。SystemServer.java的startOtherServices()
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore);
并且同样在这个方法中初始化了InputManagerService,掌管输入事件的服务。
inputManager = new InputManagerService(context);
我们看到WindowManagerService的main方法传入的就是这个inputManager。
在InputManagerService的构造方法中,用到了
mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
native的方法,nativce层不是重点,我这边就快速的将过去了。
在frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp中(没有在本地编译过源码的同学可以去 http://androidxref.com/ 查看,基于当前最新的7.1.1)
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,
jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
sp messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
if (messageQueue == NULL) {
jniThrowRuntimeException(env, "MessageQueue is not initialized.");
return 0;
}
NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
messageQueue->getLooper());
im->incStrong(0);
eturn reinterpret_cast(im);
}
然后看内部类nativeInputManger
NativeInputManager::NativeInputManager(jobject contextObj,
...
sp eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);
}
我们看到创建了一个EventHub类,并且将其交给InputManger并生成一个InputManger对象。
/frameworks/native/services/inputflinger/InputManager.cpp
InputManager::InputManager(
const sp& eventHub,
const sp& readerPolicy,
const sp& dispatcherPolicy) {
mDispatcher = new InputDispatcher(dispatcherPolicy);
mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
initialize();
}
一个分发对象,一个reader对象,并且调用initialize方法
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}
创建读线程和分发线程
至此,所有的初始化先都ok了,在SystemServer.java,创建了InputManagerService之后没几行就调用了 inputManager.start();,
public void start() {
...
nativeStart(mPtr);
...
}
又看到了native。。。来吧继续相当枯燥的native,我要快进了,我有点写的想吐。。
frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
static void nativeStart(JNIEnv* env, jclass /* clazz */, jlong ptr) {
NativeInputManager* im = reinterpret_cast(ptr);
status_t result = im->getInputManager()->start();
if (result) {
jniThrowRuntimeException(env, "Input manager could not be started.");
}
}
/frameworks/native/services/inputflinger/InputManager.cpp
status_t InputManager::start() {
status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
if (result) {
ALOGE("Could not start InputDispatcher thread due to error %d.", result);
return result;
}
result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
if (result) {
ALOGE("Could not start InputReader thread due to error %d.", result);
mDispatcherThread->requestExit();
return result;
}
return OK;
}
启动了读线程和分发线程
/frameworks/native/services/inputflinger/InputReader.cpp
bool InputReaderThread::threadLoop() {
mReader->loopOnce();
return true;
}
void InputReader::loopOnce() {
...
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
...
}
不断的loop去通过EventHub去getEvents(越来越偏了,getEvents不继续往下了,知道这个深度已经对于非framework工程师来说已经够了)
在getEvents方法中去从dev/input/目录下读取设备节点并加工,并返回给InputReader进行处理。
之后的处理过程以及一系列跳转也是相当复杂,由于本文的初衷并非详解最底层的东西,
故而此处一并略过直接到底层将event回传给java层的最末
最后
以上就是知性钢笔为你收集整理的linux屏幕触碰事件,从你触摸屏幕开始分析android触摸事件分发的全部内容,希望文章能够帮你解决linux屏幕触碰事件,从你触摸屏幕开始分析android触摸事件分发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复